//go:build live package lkgateway // Живой прогон обмена с DEPO через трансферные таблицы (наша копия BJ_DEPO_DATA). // go test -c -tags live -o depo_live.test ./internal/lkgateway/ ; запуск от bj. import ( "context" "database/sql" "fmt" "testing" "time" ) func TestDepoLiveEvents(t *testing.T) { rc, err := NewRuntimeConfig("/var/lib/bj/.bj/setup.json") if err != nil { t.Fatal(err) } guid := fmt.Sprintf("%08X-0000-4000-8000-%012X", time.Now().Unix()&0xFFFFFFFF, time.Now().UnixNano()&0xFFFFFFFFFFFF) t.Logf("GUID %s", guid) lines := []depoLine{{Ref: "M2MTEST0001", ISIN: "RU000A107UL4", Code: "RU000A107UL4", Amount: 1, Place: "36MC0413600000F00"}} ok := depoUpsertOrder(rc, guid, "IN", "MC0034900000", "Погонщикова Виктория Олеговна", "4500 000000", "4500", "000000", lines, "ТЕСТ bj: проверка трансферных таблиц") t.Logf("FTV_M2M создано: %v", ok) depoEvent(rc, guid, "", "BJ_RECEIVED", "", "ТЕСТ: входящий получен") depoEvent(rc, guid, "M2MTEST0001", "BJ_DECISION_REJECT", "M2M04", "ТЕСТ: отказ") depoEvent(rc, guid, "M2MTEST0001", "BJ_DECISION_REJECT", "M2M04", "ТЕСТ: повтор (не должен записаться)") db, err := depoEventsDB(rc) if err != nil { t.Fatal(err) } defer db.Close() ctx := context.Background() var n int db.QueryRowContext(ctx, "SELECT COUNT(*) FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g", sql.Named("g", guid)).Scan(&n) t.Logf("событий BJ_* записано: %d (ожидаем 2)", n) var lineN int db.QueryRowContext(ctx, "SELECT COUNT(*) FROM dbo.FTV_M2M_LINES WHERE GUID=@g", sql.Named("g", guid)).Scan(&lineN) var did sql.NullInt64 db.QueryRowContext(ctx, "SELECT DEPONENT_ID FROM dbo.FTV_M2M WHERE GUID=@g", sql.Named("g", guid)).Scan(&did) t.Logf("строк: %d, DEPONENT_ID (SELF_ID по паспорту): %v", lineN, did) // джоба bj2depo на SQL002 обрабатывает за секунды: ждём DOC for i := 0; i < 12; i++ { time.Sleep(5 * time.Second) depoPollEvents(ctx, rc) if l := globalDepoLinks.Get(guid); l != nil && l.DocNo != "" { t.Logf("джоба создала поручение DEPO: DOC=%s (через %d с)", l.DocNo, (i+1)*5) break } } // имитация ответа джобы bj2depo if _, err := db.ExecContext(ctx, "INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, STATE, EVENT_TYPE, EVENT_DATE, COMMENT) VALUES (@g, NULL, 'TODO', 'DEPO_ORDER_CREATED', GETDATE(), '75069999')", sql.Named("g", guid)); err != nil { t.Fatal(err) } if _, err := db.ExecContext(ctx, "INSERT INTO dbo.FTV_M2M_EVENTS (GUID, REFERENCE, STATE, EVENT_TYPE, EVENT_DATE, COMMENT) VALUES (@g, 'M2MTEST0001', 'TODO', 'DEPO_ERROR', GETDATE(), N'ТЕСТ: бумага не найдена')", sql.Named("g", guid)); err != nil { t.Fatal(err) } depoPollEvents(ctx, rc) l := globalDepoLinks.Get(guid) if l == nil { t.Fatal("связка DEPO не создана") } t.Logf("после чтения: DocNo=%s errors=%v last=%s", l.DocNo, l.Errors, l.LastEvent) var todo, done int db.QueryRowContext(ctx, "SELECT COUNT(*) FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g AND EVENT_TYPE LIKE 'DEPO[_]%' AND STATE='TODO'", sql.Named("g", guid)).Scan(&todo) db.QueryRowContext(ctx, "SELECT COUNT(*) FROM dbo.FTV_M2M_EVENTS WHERE GUID=@g AND EVENT_TYPE LIKE 'DEPO[_]%' AND STATE='SUCCESS'", sql.Named("g", guid)).Scan(&done) t.Logf("DEPO-события: TODO=%d SUCCESS=%d (ожидаем 0/2)", todo, done) // уборка тестовых строк for _, tbl := range []string{"FTV_M2M_EVENTS", "FTV_M2M_LINES", "FTV_M2M"} { if _, err := db.ExecContext(ctx, "DELETE FROM dbo."+tbl+" WHERE GUID=@g", sql.Named("g", guid)); err != nil { t.Logf("уборка %s: %v", tbl, err) } } t.Log("тестовые строки удалены") }