//go:build live package lkgateway import ( "context" "fmt" "os" "sort" "strings" "testing" "time" ) // Остатки «для всех клиентов» одним запросом (Dp03) совпадают с запросом по клиенту (Dp01). Только чтение DEPO. // PF_SETUP — копия setup.json (по умолчанию /var/lib/bj/.bj/setup.json). func TestLKPortfolioAllLive(t *testing.T) { path := os.Getenv("PF_SETUP") if path == "" { path = "/var/lib/bj/.bj/setup.json" } rc, err := NewRuntimeConfig(path) if err != nil { t.Fatal(err) } ctx := context.Background() fs := rc.Snapshot().Fancy db, err := fancyOpen(fs, fs.DepoDB()) if err != nil { t.Fatal(err) } defer db.Close() t0 := time.Now() prs, err := lkPortfolioAllPairs(ctx, rc, db) if err != nil { t.Fatal(err) } t1 := time.Now() all, err := depoAllPositions(ctx, db) if err != nil { t.Fatal(err) } t2 := time.Now() by := lkPortfolioByPort(all, prs) rows := 0 for _, p := range all { rows += len(p) } t.Logf("договоров %d (%s); остатков %d по %d портфелям (%s); с остатками у договоров %d", len(prs), t1.Sub(t0).Round(time.Millisecond), rows, len(all), t2.Sub(t1).Round(time.Millisecond), len(by)) key := func(ps []DepoPosition) string { var k []string for _, p := range ps { k = append(k, fmt.Sprintf("%s|%s|%g", strings.TrimSpace(p.AccountNum), strings.TrimSpace(p.ISIN), p.Quantity)) } sort.Strings(k) return strings.Join(k, ";") } step, checked := len(prs)/60+1, 0 var one time.Duration for i := 0; i < len(prs); i += step { pr := prs[i] s := time.Now() want, err := depoClientPositionsDB(ctx, db, pr.Depo) one += time.Since(s) if err != nil { t.Fatalf("%s: %v", pr.Depo, err) } if a, b := key(want), key(by[pr.Depo]); a != b { t.Errorf("%s ← %s: по клиенту %d строк, общим запросом %d\n %s\n %s", pr.LK, pr.Depo, len(want), len(by[pr.Depo]), a, b) } checked++ } if checked > 0 { t.Logf("сверено договоров %d, запрос по клиенту в среднем %s", checked, (one / time.Duration(checked)).Round(time.Millisecond)) } }