package services import ( "testing" "cmbone/internal/models" ) func TestAuditLogServiceRecordAndList(t *testing.T) { store := newTestStore(t) service := NewAuditLogService(store) if err := service.Record("settings.update", "appconfig", "theme.mode", "changed theme"); err != nil { t.Fatalf("record audit log: %v", err) } logs, err := service.List(models.AuditLogFilter{Action: "settings.update"}) if err != nil { t.Fatalf("list audit logs: %v", err) } if len(logs) != 1 { t.Fatalf("logs len = %d, want 1", len(logs)) } if logs[0].Actor != "system" { t.Fatalf("actor = %q, want system", logs[0].Actor) } if logs[0].TargetID != "theme.mode" { t.Fatalf("target id = %q, want theme.mode", logs[0].TargetID) } } func TestAppLogServiceRecordAndList(t *testing.T) { store := newTestStore(t) service := NewAppLogService(store) if err := service.Record("error", "image_optimization", "provider failed", "timeout"); err != nil { t.Fatalf("record app log: %v", err) } logs, err := service.List(models.AppLogFilter{Level: "error", Module: "image_optimization"}) if err != nil { t.Fatalf("list app logs: %v", err) } if len(logs) != 1 { t.Fatalf("logs len = %d, want 1", len(logs)) } if logs[0].Message != "provider failed" { t.Fatalf("message = %q, want provider failed", logs[0].Message) } } func TestAppConfigServiceRecordsSettingsAudit(t *testing.T) { store := newTestStore(t) service := NewAppConfigService(store) if err := service.SetAppConfig("theme.mode", "dark"); err != nil { t.Fatalf("set theme: %v", err) } var count int if err := store.DB.QueryRow("SELECT COUNT(*) FROM audit_logs WHERE action = ? AND target_id = ?", auditActionSettingsUpdate, "theme.mode").Scan(&count); err != nil { t.Fatalf("count settings audit logs: %v", err) } if count != 1 { t.Fatalf("settings audit count = %d, want 1", count) } } func TestAppConfigServiceSkipsWindowStateAudit(t *testing.T) { store := newTestStore(t) service := NewAppConfigService(store) if err := service.SetAppConfig(settingKeyWindowWidth, "1400"); err != nil { t.Fatalf("set window width: %v", err) } var count int if err := store.DB.QueryRow("SELECT COUNT(*) FROM audit_logs WHERE target_id = ?", settingKeyWindowWidth).Scan(&count); err != nil { t.Fatalf("count window audit logs: %v", err) } if count != 0 { t.Fatalf("window audit count = %d, want 0", count) } } func TestImageOptimizationServiceRecordsTaskAuditAndFailureLog(t *testing.T) { store := newTestStore(t) service := NewImageOptimizationService(store) detail, err := service.CreateTask(models.ImageTaskInput{SourcePath: "demo.jpg"}) if err != nil { t.Fatalf("create task: %v", err) } var auditCount int if err := store.DB.QueryRow("SELECT COUNT(*) FROM audit_logs WHERE action = ? AND target_id = ?", auditActionImageTaskCreate, detail.Task.ID).Scan(&auditCount); err != nil { t.Fatalf("count image task audit logs: %v", err) } if auditCount != 1 { t.Fatalf("image task audit count = %d, want 1", auditCount) } _, _ = service.CreateTask(models.ImageTaskInput{}) var appLogCount int if err := store.DB.QueryRow("SELECT COUNT(*) FROM app_logs WHERE module = ? AND message = ?", "image_optimization", "create task failed").Scan(&appLogCount); err != nil { t.Fatalf("count image task app logs: %v", err) } if appLogCount != 1 { t.Fatalf("image task app log count = %d, want 1", appLogCount) } }