new-api/service/channel_monitor_rollup_test.go
zizi 959ee42bcb feat: add channel monitor rollups
Aggregate monitor history into daily rollups and add maintenance helpers for rollup refresh and history cleanup.
2026-05-20 13:51:22 +08:00

66 lines
2.7 KiB
Go

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)
}