61 lines
1.5 KiB
Go
61 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|