package alert import ( "context" "errors" "os" "testing" "time" "github.com/itworx/pulse/internal/database" ) func TestPostgreSQLRuleRepositoryLifecycle(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(), 30*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) } if err := database.Migrate(ctx, pool); err != nil { t.Fatal(err) } document, registry := validDocument(t) repository := Repository{Pool: pool, Registry: registry} created, version, err := repository.Create(ctx, "integration-editor", document, "integration create") if err != nil { t.Fatal(err) } if created.Revision != 1 || created.CurrentVersion != 1 || version.VersionNumber != 1 { t.Fatalf("unexpected create: %#v %#v", created, version) } if _, _, err := repository.Create(ctx, "integration-editor", document, "duplicate"); !errors.Is(err, ErrConflict) { t.Fatalf("duplicate create error = %v, want conflict", err) } loaded, err := repository.Get(ctx, document.ID) if err != nil { t.Fatal(err) } if loaded.Name != document.Name || loaded.Condition.Metric != document.Condition.Metric { t.Fatalf("loaded rule mismatch: %#v", loaded) } same, err := repository.Update(ctx, document.ID, "integration-editor", 1, document, "idempotent") if err != nil { t.Fatal(err) } if same.Revision != 1 || same.CurrentVersion != 1 { t.Fatalf("idempotent update changed revision: %#v", same) } changed := document changed.Name = "CPU aandacht gewijzigd" updated, err := repository.Update(ctx, document.ID, "integration-editor", 1, changed, "change") if err != nil { t.Fatal(err) } if updated.Revision != 2 || updated.CurrentVersion != 2 { t.Fatalf("unexpected update: %#v", updated) } if _, err := repository.Update(ctx, document.ID, "integration-editor", 1, changed, "stale"); !errors.Is(err, ErrConflict) { t.Fatalf("stale update error = %v, want conflict", err) } enabled, err := repository.SetEnabled(ctx, document.ID, 2, true) if err != nil { t.Fatal(err) } if !enabled.Enabled || enabled.Revision != 3 { t.Fatalf("unexpected enable: %#v", enabled) } versions, err := repository.Versions(ctx, document.ID, 10) if err != nil { t.Fatal(err) } if len(versions) != 2 || versions[0].VersionNumber != 2 || versions[1].VersionNumber != 1 { t.Fatalf("unexpected immutable versions: %#v", versions) } }