From 31bf13fc36501205150416c93659846c7f3f5ed9 Mon Sep 17 00:00:00 2001 From: chenchen Date: Wed, 10 Jun 2026 10:37:44 +0800 Subject: [PATCH] test(telemetry): cover retention purge deletion (#43) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #37 shipped the telemetry retention task + model.DeleteTelemetryEventsBefore but lacked a test for the deletion itself. Add TestDeleteTelemetryEventsBefore (strict-< cutoff, retains at/after, idempotent) and migrate TelemetryEvent in the model TestMain so it has a table. Closes the "测试覆盖过期清理" DoD item of #43. Test-only; no behavior change. Co-Authored-By: Claude Opus 4.8 --- heicode/model/task_cas_test.go | 1 + heicode/model/telemetry_retention_test.go | 38 +++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 heicode/model/telemetry_retention_test.go 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) +}