This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user