package metrics import ( "context" "fmt" "os" "testing" "time" "github.com/jackc/pgx/v5/pgxpool" ) func setupSourceStoreTest(t *testing.T) (*SourceStore, func()) { t.Helper() adminDSN := os.Getenv("TEST_ADMIN_DSN") if adminDSN == "" { t.Skip("TEST_ADMIN_DSN nicht gesetzt, Integrationstest uebersprungen") } ctx := context.Background() pool, err := pgxpool.New(ctx, adminDSN) if err != nil { t.Fatalf("pool: %v", err) } if _, err := pool.Exec(ctx, ` CREATE TABLE IF NOT EXISTS metrics_sources (module_name TEXT PRIMARY KEY, metrics_url TEXT NOT NULL) `); err != nil { t.Fatalf("schema: %v", err) } cleanup := func() { pool.Close() } return NewSourceStore(pool), cleanup } // Akzeptanzkriterium 2 / Pruefung 2 auf Persistenz-Ebene: eine ueber die // Datenbank registrierte Quelle ist sofort ueber Provide() sichtbar — genau // der Mechanismus, der ein neues Modul ohne Core-Codeaenderung erscheinen // laesst. func TestSourceStore_RegisterSourceAppearsInProvide(t *testing.T) { store, cleanup := setupSourceStoreTest(t) defer cleanup() ctx := context.Background() name := fmt.Sprintf("modul-%d", time.Now().UnixNano()) if err := store.RegisterSource(ctx, name, "http://example.invalid/metrics"); err != nil { t.Fatalf("registersource: %v", err) } sources, err := store.Provide(ctx) if err != nil { t.Fatalf("provide: %v", err) } found := false for _, s := range sources { if s.ModuleName == name { found = true } } if !found { t.Fatalf("erwartet %s in provide()-ergebnis, habe: %+v", name, sources) } }