package settings import ( "testing" "time" ) func TestAuthAuditRoundTripAndCap(t *testing.T) { dir := t.TempDir() store, err := LoadAuthAuditOrEmpty(dir) if err != nil { t.Fatalf("LoadAuthAuditOrEmpty: %v", err) } if len(store.Events) != 0 { t.Fatalf("expected empty, got %d", len(store.Events)) } event := AuthAuditEvent{ ID: "evt-1", At: time.Now().UTC(), Action: "login", Outcome: AuthAuditOutcomeSuccess, Category: AuthAuditCategoryAuth, Actor: "admin", } if err := AppendAuthAuditEvent(dir, event); err != nil { t.Fatalf("AppendAuthAuditEvent: %v", err) } loaded, err := LoadAuthAudit(dir) if err != nil { t.Fatalf("LoadAuthAudit: %v", err) } if len(loaded.Events) != 1 || loaded.Events[0].Action != "login" { t.Fatalf("loaded = %+v", loaded) } if loaded.Events[0].Outcome != AuthAuditOutcomeSuccess { t.Fatalf("outcome = %q", loaded.Events[0].Outcome) } } func TestAppendAuthAuditEventTrimsToCap(t *testing.T) { dir := t.TempDir() originalCap := MaxAuthAuditEvents store := AuthAuditStore{Events: make([]AuthAuditEvent, 0, MaxAuthAuditEvents+5)} for index := 0; index < MaxAuthAuditEvents+5; index++ { store.Events = append(store.Events, AuthAuditEvent{ ID: "evt", At: time.Now().UTC(), Action: "login", Outcome: AuthAuditOutcomeSuccess, Category: AuthAuditCategoryAuth, Actor: "admin", Detail: string(rune('a' + (index % 26))), }) } if err := SaveAuthAudit(dir, store); err != nil { t.Fatalf("SaveAuthAudit: %v", err) } if err := AppendAuthAuditEvent(dir, AuthAuditEvent{ ID: "newest", At: time.Now().UTC(), Action: "logout", Outcome: AuthAuditOutcomeSuccess, Category: AuthAuditCategoryAuth, Actor: "admin", }); err != nil { t.Fatalf("AppendAuthAuditEvent: %v", err) } loaded, err := LoadAuthAudit(dir) if err != nil { t.Fatalf("LoadAuthAudit: %v", err) } if len(loaded.Events) != originalCap { t.Fatalf("len = %d, want %d", len(loaded.Events), originalCap) } if loaded.Events[len(loaded.Events)-1].ID != "newest" { t.Fatalf("last id = %q", loaded.Events[len(loaded.Events)-1].ID) } }