Files
ITWorx-Pulse-Public/internal/dashboard/repository_scale_integration_test.go
ITWorx Pulse release export bd774932d5
Public source validation / validate (push) Failing after 3m8s
Publish ITWorx Pulse source
2026-09-03 02:09:19 +02:00

61 lines
2.0 KiB
Go

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)
}
}