108 lines
3.7 KiB
Go
108 lines
3.7 KiB
Go
package services
|
|
|
|
import (
|
|
"math"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestMetricsServiceGetDashboardMetrics(t *testing.T) {
|
|
store := newTestStore(t)
|
|
service := NewMetricsService(store)
|
|
today := localDayStart(time.Now())
|
|
yesterday := today.AddDate(0, 0, -1)
|
|
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusSucceeded, 1000, today.Add(2*time.Hour))
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusSucceeded, 2000, today.Add(3*time.Hour))
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusFailed, 0, today.Add(4*time.Hour))
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusSucceeded, 900, yesterday.Add(2*time.Hour))
|
|
insertAuditLogForMetrics(t, store, today.Add(5*time.Hour))
|
|
insertAuditLogForMetrics(t, store, today.Add(6*time.Hour))
|
|
insertAuditLogForMetrics(t, store, yesterday.Add(5*time.Hour))
|
|
|
|
metrics, err := service.GetDashboardMetrics()
|
|
if err != nil {
|
|
t.Fatalf("get dashboard metrics: %v", err)
|
|
}
|
|
|
|
if metrics.TodayProcessedImages != 3 {
|
|
t.Fatalf("today processed images = %d, want 3", metrics.TodayProcessedImages)
|
|
}
|
|
if metrics.FailedTasks != 1 {
|
|
t.Fatalf("failed tasks = %d, want 1", metrics.FailedTasks)
|
|
}
|
|
if math.Abs(metrics.SuccessRate-66.6667) > 0.01 {
|
|
t.Fatalf("success rate = %f, want about 66.67", metrics.SuccessRate)
|
|
}
|
|
if metrics.AverageDurationMs != 1500 {
|
|
t.Fatalf("average duration = %f, want 1500", metrics.AverageDurationMs)
|
|
}
|
|
if metrics.TodayAuditLogs != 2 {
|
|
t.Fatalf("today audit logs = %d, want 2", metrics.TodayAuditLogs)
|
|
}
|
|
}
|
|
|
|
func TestMetricsServiceGetProcessingTrend(t *testing.T) {
|
|
store := newTestStore(t)
|
|
service := NewMetricsService(store)
|
|
today := localDayStart(time.Now())
|
|
twoDaysAgo := today.AddDate(0, 0, -2)
|
|
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusSucceeded, 1200, twoDaysAgo.Add(2*time.Hour))
|
|
insertImageTaskForMetrics(t, store, imageTaskStatusFailed, 0, today.Add(2*time.Hour))
|
|
insertAuditLogForMetrics(t, store, today.Add(3*time.Hour))
|
|
|
|
trend, err := service.GetProcessingTrend(3)
|
|
if err != nil {
|
|
t.Fatalf("get processing trend: %v", err)
|
|
}
|
|
if len(trend) != 3 {
|
|
t.Fatalf("trend len = %d, want 3", len(trend))
|
|
}
|
|
if trend[0].Date != twoDaysAgo.Format("2006-01-02") {
|
|
t.Fatalf("first date = %q, want %q", trend[0].Date, twoDaysAgo.Format("2006-01-02"))
|
|
}
|
|
if trend[0].ProcessedImages != 1 || trend[0].SucceededTasks != 1 {
|
|
t.Fatalf("first metric = %+v, want one succeeded task", trend[0])
|
|
}
|
|
if trend[2].ProcessedImages != 1 || trend[2].FailedTasks != 1 || trend[2].AuditLogs != 1 {
|
|
t.Fatalf("today metric = %+v, want one failed task and one audit log", trend[2])
|
|
}
|
|
}
|
|
|
|
func TestNormalizeTrendDays(t *testing.T) {
|
|
if got := normalizeTrendDays(0); got != defaultTrendDays {
|
|
t.Fatalf("normalize 0 = %d, want %d", got, defaultTrendDays)
|
|
}
|
|
if got := normalizeTrendDays(maxTrendDays + 1); got != maxTrendDays {
|
|
t.Fatalf("normalize max+1 = %d, want %d", got, maxTrendDays)
|
|
}
|
|
if got := normalizeTrendDays(3); got != 3 {
|
|
t.Fatalf("normalize 3 = %d, want 3", got)
|
|
}
|
|
}
|
|
|
|
func insertImageTaskForMetrics(t *testing.T, store *SuiStore, status string, durationMs int64, createdAt time.Time) {
|
|
t.Helper()
|
|
|
|
_, err := store.DB.Exec(`
|
|
INSERT INTO image_tasks (source_path, status, operation, duration_ms, error_message, created_at, updated_at)
|
|
VALUES (?, ?, 'enhance', ?, '', ?, ?)
|
|
`, "D:/images/sku.jpg", status, durationMs, formatMetricTime(createdAt), formatMetricTime(createdAt))
|
|
if err != nil {
|
|
t.Fatalf("insert image task: %v", err)
|
|
}
|
|
}
|
|
|
|
func insertAuditLogForMetrics(t *testing.T, store *SuiStore, createdAt time.Time) {
|
|
t.Helper()
|
|
|
|
_, err := store.DB.Exec(`
|
|
INSERT INTO audit_logs (actor, action, target_type, target_id, detail, created_at)
|
|
VALUES ('admin', 'image_task.create', 'image_task', '1', 'created', ?)
|
|
`, formatMetricTime(createdAt))
|
|
if err != nil {
|
|
t.Fatalf("insert audit log: %v", err)
|
|
}
|
|
}
|