feat: add audit and app log services
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user