diff --git a/heicode/model/task_cas_test.go b/heicode/model/task_cas_test.go index 79ae8c96..5109c60e 100644 --- a/heicode/model/task_cas_test.go +++ b/heicode/model/task_cas_test.go @@ -43,6 +43,7 @@ func TestMain(m *testing.M) { &SubscriptionPlan{}, &SubscriptionOrder{}, &UserSubscription{}, + &TelemetryEvent{}, ); err != nil { panic("failed to migrate: " + err.Error()) } diff --git a/heicode/model/telemetry_retention_test.go b/heicode/model/telemetry_retention_test.go new file mode 100644 index 00000000..57190e3b --- /dev/null +++ b/heicode/model/telemetry_retention_test.go @@ -0,0 +1,38 @@ +package model + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +// #43: the retention purge must delete telemetry rows received before the +// cutoff and leave newer rows intact. TelemetryEvent is migrated by the package +// TestMain; LOG_DB == DB in tests. +func TestDeleteTelemetryEventsBefore(t *testing.T) { + // Isolate from any other test's rows. + require.NoError(t, LOG_DB.Where("1 = 1").Delete(&TelemetryEvent{}).Error) + + mk := func(receivedAt int64, client string) { + require.NoError(t, LOG_DB.Create(&TelemetryEvent{ + ReceivedAt: receivedAt, UserId: 1, ClientId: client, SchemaVersion: 1, + }).Error) + } + mk(1000, "old-1") // before cutoff -> deleted + mk(2999, "old-2") // before cutoff -> deleted + mk(3000, "keep-1") // == cutoff -> kept (strict <) + mk(5000, "keep-2") // after cutoff -> kept + + deleted, err := DeleteTelemetryEventsBefore(3000) + require.NoError(t, err) + require.EqualValues(t, 2, deleted, "rows with received_at < cutoff are purged") + + var remaining int64 + require.NoError(t, LOG_DB.Model(&TelemetryEvent{}).Count(&remaining).Error) + require.EqualValues(t, 2, remaining, "rows at/after cutoff are retained") + + // Idempotent: a second pass with the same cutoff deletes nothing. + again, err := DeleteTelemetryEventsBefore(3000) + require.NoError(t, err) + require.EqualValues(t, 0, again) +}