Public source validation / validate (push) Failing after 3m8s
61 lines
2.0 KiB
Go
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)
|
|
}
|
|
}
|