Files
ITWorx-Pulse-Public/internal/servicedefaults/seed_integration_test.go
T
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

65 lines
2.8 KiB
Go

package servicedefaults
import (
"context"
"net/netip"
"os"
"testing"
"time"
"github.com/itworx/pulse/internal/database"
"github.com/itworx/pulse/internal/probe"
"github.com/jackc/pgx/v5/pgxpool"
)
func TestSeedPostgreSQLIsAtomicAndIdempotent(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: 4, MinConns: 1})
if err != nil {
t.Fatal(err)
}
defer pool.Close()
if err := database.Migrate(ctx, pool); err != nil {
t.Fatal(err)
}
resolve := resolver{"pulse.example": {netip.MustParseAddr("203.0.113.10")}, "auth.example": {netip.MustParseAddr("198.51.100.20")}}
options := Options{PublicURL: "https://pulse.example", OIDCIssuer: "https://auth.example/application/o/pulse/"}
for run := 0; run < 2; run++ {
summary, err := Seed(ctx, pool, options, probe.NetworkPolicy{}, resolve)
if err != nil {
t.Fatal(err)
}
if summary != (Summary{Services: 2, Endpoints: 2, Probes: 3, Dependencies: 1}) {
t.Fatalf("unexpected summary: %#v", summary)
}
}
assertCount(t, ctx, pool, `SELECT count(*) FROM services WHERE labels->>'managedBy'='pulse-system-defaults'`, 2)
assertCount(t, ctx, pool, `SELECT count(*) FROM probes WHERE service_id IN ($1,$2) AND archived_at IS NULL`, 3, stableID("service:pulse"), stableID("service:authentik"))
assertCount(t, ctx, pool, `SELECT count(*) FROM service_dependencies WHERE service_id=$1 AND depends_on_service_id=$2 AND confirmed=true`, 1, stableID("service:pulse"), stableID("service:authentik"))
assertCount(t, ctx, pool, `SELECT count(*) FROM services WHERE id IN ($1,$2) AND revision=1`, 2, stableID("service:pulse"), stableID("service:authentik"))
assertCount(t, ctx, pool, `SELECT count(*) FROM probes WHERE service_id IN ($1,$2) AND revision=1`, 3, stableID("service:pulse"), stableID("service:authentik"))
// Invalid replacement configuration fails before the transaction and leaves
// the accepted baseline unchanged.
if _, err := Seed(ctx, pool, Options{PublicURL: "https://10.0.0.2", OIDCIssuer: options.OIDCIssuer}, probe.NetworkPolicy{}, resolve); err == nil {
t.Fatal("expected blocked private replacement")
}
assertCount(t, ctx, pool, `SELECT count(*) FROM probes WHERE service_id IN ($1,$2) AND archived_at IS NULL`, 3, stableID("service:pulse"), stableID("service:authentik"))
}
func assertCount(t *testing.T, ctx context.Context, pool *pgxpool.Pool, query string, expected int, args ...any) {
t.Helper()
var count int
if err := pool.QueryRow(ctx, query, args...).Scan(&count); err != nil {
t.Fatal(err)
}
if count != expected {
t.Fatalf("count=%d, want %d for %s", count, expected, query)
}
}