package service import ( "testing" "time" "github.com/QuantumNous/new-api/model" "github.com/stretchr/testify/require" ) func TestAggregateChannelMonitorDailyRollupsForDateUpsertsIdempotently(t *testing.T) { db := setupChannelMonitorTestDB(t) day := time.Date(2026, 5, 20, 10, 0, 0, 0, time.UTC) histories := []model.ChannelMonitorHistory{ {MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "pass", LatencyMs: 100, CheckedAt: day.Add(-9 * time.Hour)}, {MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "degraded", LatencyMs: 300, CheckedAt: day.Add(-8 * time.Hour)}, {MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "failed", LatencyMs: 500, CheckedAt: day.Add(-7 * time.Hour)}, {MonitorId: 12, ChannelId: 8, ModelName: "other-model", Status: "pass", LatencyMs: 900, CheckedAt: day.Add(-6 * time.Hour)}, {MonitorId: 11, ChannelId: 7, ModelName: "gpt-test", Status: "pass", LatencyMs: 999, CheckedAt: day.Add(15 * time.Hour)}, } require.NoError(t, db.Create(&histories).Error) written, err := AggregateChannelMonitorDailyRollupsForDate(day) require.NoError(t, err) require.Equal(t, 2, written) written, err = AggregateChannelMonitorDailyRollupsForDate(day) require.NoError(t, err) require.Equal(t, 2, written) var rollup model.ChannelMonitorDailyRollup require.NoError(t, db.First(&rollup, "monitor_id = ? AND channel_id = ? AND model_name = ? AND date = ?", 11, 7, "gpt-test", "2026-05-20").Error) require.Equal(t, 3, rollup.TotalChecks) require.Equal(t, 1, rollup.PassCount) require.Equal(t, 1, rollup.DegradedCount) require.Equal(t, 1, rollup.FailedCount) require.Equal(t, 300, rollup.AvgLatencyMs) var count int64 require.NoError(t, db.Model(&model.ChannelMonitorDailyRollup{}). Where("monitor_id = ? AND channel_id = ? AND model_name = ? AND date = ?", 11, 7, "gpt-test", "2026-05-20"). Count(&count).Error) require.Equal(t, int64(1), count) } func TestCleanOldChannelMonitorHistoryDeletesRecordsBeforeRetention(t *testing.T) { db := setupChannelMonitorTestDB(t) now := time.Date(2026, 5, 20, 12, 0, 0, 0, time.UTC) histories := []model.ChannelMonitorHistory{ {MonitorId: 1, ChannelId: 1, ModelName: "old", Status: "pass", CheckedAt: now.AddDate(0, 0, -8)}, {MonitorId: 1, ChannelId: 1, ModelName: "recent", Status: "pass", CheckedAt: now.AddDate(0, 0, -6)}, } require.NoError(t, db.Create(&histories).Error) deleted, err := CleanOldChannelMonitorHistory(7*24*time.Hour, now) require.NoError(t, err) require.Equal(t, int64(1), deleted) var remaining []model.ChannelMonitorHistory require.NoError(t, db.Order("id ASC").Find(&remaining).Error) require.Len(t, remaining, 1) require.Equal(t, "recent", remaining[0].ModelName) }