(t *testing.T)
| 9555 | } |
| 9556 | |
| 9557 | func TestUsageEventsTrigger(t *testing.T) { |
| 9558 | t.Parallel() |
| 9559 | |
| 9560 | // This is not exposed in the querier interface intentionally. |
| 9561 | getDailyRows := func(ctx context.Context, sqlDB *sql.DB) []database.UsageEventsDaily { |
| 9562 | t.Helper() |
| 9563 | rows, err := sqlDB.QueryContext(ctx, "SELECT day, event_type, usage_data FROM usage_events_daily ORDER BY day ASC") |
| 9564 | require.NoError(t, err, "perform query") |
| 9565 | defer rows.Close() |
| 9566 | |
| 9567 | var out []database.UsageEventsDaily |
| 9568 | for rows.Next() { |
| 9569 | var row database.UsageEventsDaily |
| 9570 | err := rows.Scan(&row.Day, &row.EventType, &row.UsageData) |
| 9571 | require.NoError(t, err, "scan row") |
| 9572 | out = append(out, row) |
| 9573 | } |
| 9574 | return out |
| 9575 | } |
| 9576 | |
| 9577 | t.Run("OK", func(t *testing.T) { |
| 9578 | t.Parallel() |
| 9579 | |
| 9580 | ctx := testutil.Context(t, testutil.WaitLong) |
| 9581 | db, _, sqlDB := dbtestutil.NewDBWithSQLDB(t) |
| 9582 | |
| 9583 | // Assert there are no daily rows. |
| 9584 | rows := getDailyRows(ctx, sqlDB) |
| 9585 | require.Len(t, rows, 0) |
| 9586 | |
| 9587 | // Insert a usage event. |
| 9588 | err := db.InsertUsageEvent(ctx, database.InsertUsageEventParams{ |
| 9589 | ID: "1", |
| 9590 | EventType: "dc_managed_agents_v1", |
| 9591 | EventData: []byte(`{"count": 41}`), |
| 9592 | CreatedAt: time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), |
| 9593 | }) |
| 9594 | require.NoError(t, err) |
| 9595 | |
| 9596 | // Assert there is one daily row that contains the correct data. |
| 9597 | rows = getDailyRows(ctx, sqlDB) |
| 9598 | require.Len(t, rows, 1) |
| 9599 | require.Equal(t, "dc_managed_agents_v1", rows[0].EventType) |
| 9600 | require.JSONEq(t, `{"count": 41}`, string(rows[0].UsageData)) |
| 9601 | // The read row might be `+0000` rather than `UTC` specifically, so just |
| 9602 | // ensure it's within 1 second of the expected time. |
| 9603 | require.WithinDuration(t, time.Date(2025, 1, 1, 0, 0, 0, 0, time.UTC), rows[0].Day, time.Second) |
| 9604 | |
| 9605 | // Insert a new usage event on the same UTC day, should increment the count. |
| 9606 | locSydney, err := time.LoadLocation("Australia/Sydney") |
| 9607 | require.NoError(t, err) |
| 9608 | err = db.InsertUsageEvent(ctx, database.InsertUsageEventParams{ |
| 9609 | ID: "2", |
| 9610 | EventType: "dc_managed_agents_v1", |
| 9611 | EventData: []byte(`{"count": 1}`), |
| 9612 | // Insert it at a random point during the same day. Sydney is +1000 or |
| 9613 | // +1100, so 8am in Sydney is the previous day in UTC. |
| 9614 | CreatedAt: time.Date(2025, 1, 2, 8, 38, 57, 0, locSydney), |
nothing calls this directly
no test coverage detected