(t *testing.T)
| 17 | ) |
| 18 | |
| 19 | func TestCheckInactiveUsers(t *testing.T) { |
| 20 | t.Parallel() |
| 21 | |
| 22 | // Predefine job settings |
| 23 | interval := time.Millisecond |
| 24 | dormancyPeriod := 90 * 24 * time.Hour |
| 25 | |
| 26 | // Add some dormant accounts |
| 27 | logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}) |
| 28 | db, _ := dbtestutil.NewDB(t) |
| 29 | |
| 30 | ctx, cancelFunc := context.WithCancel(context.Background()) |
| 31 | t.Cleanup(cancelFunc) |
| 32 | |
| 33 | // Use a fixed base time to avoid timing races |
| 34 | baseTime := time.Date(2023, 1, 1, 0, 0, 0, 0, time.UTC) |
| 35 | dormancyThreshold := baseTime.Add(-dormancyPeriod) |
| 36 | |
| 37 | // Create inactive users (last seen BEFORE dormancy threshold) |
| 38 | inactiveUser1 := setupUser(ctx, t, db, "dormant-user-1@coder.com", database.UserStatusActive, dormancyThreshold.Add(-time.Minute)) |
| 39 | inactiveUser2 := setupUser(ctx, t, db, "dormant-user-2@coder.com", database.UserStatusActive, dormancyThreshold.Add(-time.Hour)) |
| 40 | inactiveUser3 := setupUser(ctx, t, db, "dormant-user-3@coder.com", database.UserStatusActive, dormancyThreshold.Add(-6*time.Hour)) |
| 41 | |
| 42 | // Create active users (last seen AFTER dormancy threshold) |
| 43 | activeUser1 := setupUser(ctx, t, db, "active-user-1@coder.com", database.UserStatusActive, baseTime.Add(-time.Minute)) |
| 44 | activeUser2 := setupUser(ctx, t, db, "active-user-2@coder.com", database.UserStatusActive, baseTime.Add(-time.Hour)) |
| 45 | activeUser3 := setupUser(ctx, t, db, "active-user-3@coder.com", database.UserStatusActive, baseTime.Add(-6*time.Hour)) |
| 46 | |
| 47 | suspendedUser1 := setupUser(ctx, t, db, "suspended-user-1@coder.com", database.UserStatusSuspended, dormancyThreshold.Add(-time.Minute)) |
| 48 | suspendedUser2 := setupUser(ctx, t, db, "suspended-user-2@coder.com", database.UserStatusSuspended, dormancyThreshold.Add(-time.Hour)) |
| 49 | suspendedUser3 := setupUser(ctx, t, db, "suspended-user-3@coder.com", database.UserStatusSuspended, dormancyThreshold.Add(-6*time.Hour)) |
| 50 | |
| 51 | mAudit := audit.NewMock() |
| 52 | mClock := quartz.NewMock(t) |
| 53 | // Set the mock clock to the base time to ensure consistent behavior |
| 54 | mClock.Set(baseTime) |
| 55 | // Run the periodic job |
| 56 | closeFunc := dormancy.CheckInactiveUsersWithOptions(ctx, logger, mClock, db, mAudit, interval, dormancyPeriod) |
| 57 | t.Cleanup(closeFunc) |
| 58 | |
| 59 | dur, w := mClock.AdvanceNext() |
| 60 | require.Equal(t, interval, dur) |
| 61 | w.MustWait(ctx) |
| 62 | |
| 63 | rows, err := db.GetUsers(ctx, database.GetUsersParams{}) |
| 64 | require.NoError(t, err) |
| 65 | |
| 66 | var dormant, suspended int |
| 67 | for _, row := range rows { |
| 68 | if row.Status == database.UserStatusDormant { |
| 69 | dormant++ |
| 70 | } else if row.Status == database.UserStatusSuspended { |
| 71 | suspended++ |
| 72 | } |
| 73 | } |
| 74 | |
| 75 | // 9 users in total, 3 active, 3 dormant, 3 suspended |
| 76 | require.Len(t, rows, 9) |
nothing calls this directly
no test coverage detected