package db import ( "errors" "testing" "cloudipvalidator/internal/config" ) func TestBootstrapSettingsSeedsOnceFromConfig(t *testing.T) { d, ctx := newTestDB(t) cfg := &config.ControlAPI{Orchestrator: config.OrchestratorConfig{FIPSettleSeconds: 30}} if err := d.BootstrapFromConfig(ctx, cfg); err != nil { t.Fatalf("first bootstrap: %v", err) } settings, err := d.GetSettings(ctx) if err != nil { t.Fatalf("get settings: %v", err) } if settings.FIPSettleSeconds != 30 { t.Fatalf("expected seeded value 30, got %d", settings.FIPSettleSeconds) } // A second bootstrap with a different YAML value must not overwrite the // now-non-empty settings table — same "DB is source of truth once // seeded" semantics as validators/sites/targets/check_types. cfg2 := &config.ControlAPI{Orchestrator: config.OrchestratorConfig{FIPSettleSeconds: 99}} if err := d.BootstrapFromConfig(ctx, cfg2); err != nil { t.Fatalf("second bootstrap: %v", err) } settings, err = d.GetSettings(ctx) if err != nil { t.Fatalf("get settings after second bootstrap: %v", err) } if settings.FIPSettleSeconds != 30 { t.Fatalf("expected YAML to be ignored on non-empty settings table, got %d", settings.FIPSettleSeconds) } } func TestSetFIPSettleSecondsRejectsNegative(t *testing.T) { d, ctx := newTestDB(t) if err := d.BootstrapFromConfig(ctx, &config.ControlAPI{}); err != nil { t.Fatalf("bootstrap: %v", err) } if err := d.SetFIPSettleSeconds(ctx, -1); !errors.Is(err, ErrValidation) { t.Fatalf("expected ErrValidation for negative seconds, got %v", err) } } func TestGetSetFIPSettleSecondsRoundTrip(t *testing.T) { d, ctx := newTestDB(t) if err := d.BootstrapFromConfig(ctx, &config.ControlAPI{}); err != nil { t.Fatalf("bootstrap: %v", err) } before, err := d.GetSettings(ctx) if err != nil { t.Fatalf("get settings: %v", err) } if before.FIPSettleSeconds != 0 { t.Fatalf("expected default 0, got %d", before.FIPSettleSeconds) } if err := d.SetFIPSettleSeconds(ctx, 45); err != nil { t.Fatalf("set fip settle seconds: %v", err) } after, err := d.GetSettings(ctx) if err != nil { t.Fatalf("get settings after set: %v", err) } if after.FIPSettleSeconds != 45 { t.Fatalf("expected 45, got %d", after.FIPSettleSeconds) } if after.UpdatedAt.Before(before.UpdatedAt) { t.Fatalf("expected updated_at not to go backwards, before=%v after=%v", before.UpdatedAt, after.UpdatedAt) } }