77 lines
2.4 KiB
Go
77 lines
2.4 KiB
Go
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)
|
||
|
|
}
|
||
|
|
}
|