package dashboard import ( "context" "fmt" "os" "sort" "testing" "time" "github.com/itworx/pulse/internal/database" ) func TestDashboardListTargetScalePostgreSQL(t *testing.T) { dsn := os.Getenv("PULSE_TEST_DATABASE_URL") if dsn == "" { t.Skip("PULSE_TEST_DATABASE_URL is not set") } ctx, cancel := context.WithTimeout(context.Background(), 90*time.Second) defer cancel() pool, err := database.NewPool(ctx, database.Config{URL: dsn, MaxConns: 10, MinConns: 1}) if err != nil { t.Fatal(err) } defer pool.Close() if err := database.Migrate(ctx, pool); err != nil { t.Fatal(err) } actor := "00000000-0000-0000-0000-0000000003a1" if _, err := pool.Exec(ctx, "INSERT INTO users (id, external_subject, display_name) VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING", actor, actor, "M3 scale actor"); err != nil { t.Fatal(err) } defer func() { _, _ = pool.Exec(context.Background(), "DELETE FROM dashboards WHERE slug LIKE 'm3-scale-%'") }() repo := Repository{Pool: pool} for i := 0; i < 150; i++ { id := fmt.Sprintf("00000000-0000-0000-0000-%012x", 0x5000+i) doc := Document{"schemaVersion": 2, "id": id, "slug": fmt.Sprintf("m3-scale-%03d", i), "name": fmt.Sprintf("M3 Scale %03d", i), "scope": "personal", "variables": []any{}, "widgets": []any{}, "settings": map[string]any{"refreshSeconds": 30}} if _, _, err := repo.Create(ctx, actor, doc, "scale fixture"); err != nil { t.Fatal(err) } } samples := make([]time.Duration, 20) for i := range samples { start := time.Now() items, err := repo.List(ctx, actor, 100) samples[i] = time.Since(start) if err != nil { t.Fatal(err) } if len(items) < 100 { t.Fatalf("list returned %d items", len(items)) } } sort.Slice(samples, func(i, j int) bool { return samples[i] < samples[j] }) p95 := samples[len(samples)*95/100-1] t.Logf("target-scale dashboards=150 list_limit=100 p95=%s max=%s", p95, samples[len(samples)-1]) if p95 > 250*time.Millisecond { t.Fatalf("dashboard list p95=%s exceeds 250ms budget", p95) } }