Skip to content

Commit 8c8bd31

Browse files
authored
chore: stop creating coderd for notification unit tests (coder#15133)
A bunch of notification tests create a whole `coderd`, when all they use is the database and logger. This makes the tests more expensive to run, and pollutes the test logs with a bunch of stuff that doesn't matter (e.g. tailnet).
1 parent b9d441f commit 8c8bd31

File tree

3 files changed

+118
-96
lines changed

3 files changed

+118
-96
lines changed

coderd/notifications/manager_test.go

+16-11
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ import (
1212
"github.com/stretchr/testify/require"
1313
"golang.org/x/xerrors"
1414

15+
"cdr.dev/slog"
16+
"cdr.dev/slog/sloggers/slogtest"
17+
"github.com/coder/coder/v2/coderd/database/dbtestutil"
1518
"github.com/coder/quartz"
1619
"github.com/coder/serpent"
1720

18-
"github.com/coder/coder/v2/coderd/coderdtest"
1921
"github.com/coder/coder/v2/coderd/database"
2022
"github.com/coder/coder/v2/coderd/database/dbauthz"
2123
"github.com/coder/coder/v2/coderd/database/dbgen"
@@ -32,24 +34,25 @@ func TestBufferedUpdates(t *testing.T) {
3234

3335
// nolint:gocritic // Unit test.
3436
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
35-
_, _, api := coderdtest.NewWithAPI(t, nil)
37+
store, _ := dbtestutil.NewDB(t)
38+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
3639

37-
interceptor := &syncInterceptor{Store: api.Database}
40+
interceptor := &syncInterceptor{Store: store}
3841
santa := &santaHandler{}
3942

4043
cfg := defaultNotificationsConfig(database.NotificationMethodSmtp)
4144
cfg.StoreSyncInterval = serpent.Duration(time.Hour) // Ensure we don't sync the store automatically.
4245

4346
// GIVEN: a manager which will pass or fail notifications based on their "nice" labels
44-
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), createMetrics(), api.Logger.Named("notifications-manager"))
47+
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), createMetrics(), logger.Named("notifications-manager"))
4548
require.NoError(t, err)
4649
mgr.WithHandlers(map[database.NotificationMethod]notifications.Handler{
4750
database.NotificationMethodSmtp: santa,
4851
})
49-
enq, err := notifications.NewStoreEnqueuer(cfg, interceptor, defaultHelpers(), api.Logger.Named("notifications-enqueuer"), quartz.NewReal())
52+
enq, err := notifications.NewStoreEnqueuer(cfg, interceptor, defaultHelpers(), logger.Named("notifications-enqueuer"), quartz.NewReal())
5053
require.NoError(t, err)
5154

52-
user := dbgen.User(t, api.Database, database.User{})
55+
user := dbgen.User(t, store, database.User{})
5356

5457
// WHEN: notifications are enqueued which should succeed and fail
5558
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "true", "i": "0"}, "") // Will succeed.
@@ -103,7 +106,8 @@ func TestBuildPayload(t *testing.T) {
103106

104107
// nolint:gocritic // Unit test.
105108
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
106-
_, _, api := coderdtest.NewWithAPI(t, nil)
109+
store, _ := dbtestutil.NewDB(t)
110+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
107111

108112
// GIVEN: a set of helpers to be injected into the templates
109113
const label = "Click here!"
@@ -115,7 +119,7 @@ func TestBuildPayload(t *testing.T) {
115119
}
116120

117121
// GIVEN: an enqueue interceptor which returns mock metadata
118-
interceptor := newEnqueueInterceptor(api.Database,
122+
interceptor := newEnqueueInterceptor(store,
119123
// Inject custom message metadata to influence the payload construction.
120124
func() database.FetchNewMessageMetadataRow {
121125
// Inject template actions which use injected help functions.
@@ -137,7 +141,7 @@ func TestBuildPayload(t *testing.T) {
137141
}
138142
})
139143

140-
enq, err := notifications.NewStoreEnqueuer(defaultNotificationsConfig(database.NotificationMethodSmtp), interceptor, helpers, api.Logger.Named("notifications-enqueuer"), quartz.NewReal())
144+
enq, err := notifications.NewStoreEnqueuer(defaultNotificationsConfig(database.NotificationMethodSmtp), interceptor, helpers, logger.Named("notifications-enqueuer"), quartz.NewReal())
141145
require.NoError(t, err)
142146

143147
// WHEN: a notification is enqueued
@@ -160,10 +164,11 @@ func TestStopBeforeRun(t *testing.T) {
160164

161165
// nolint:gocritic // Unit test.
162166
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
163-
_, _, api := coderdtest.NewWithAPI(t, nil)
167+
store, _ := dbtestutil.NewDB(t)
168+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
164169

165170
// GIVEN: a standard manager
166-
mgr, err := notifications.NewManager(defaultNotificationsConfig(database.NotificationMethodSmtp), api.Database, defaultHelpers(), createMetrics(), api.Logger.Named("notifications-manager"))
171+
mgr, err := notifications.NewManager(defaultNotificationsConfig(database.NotificationMethodSmtp), store, defaultHelpers(), createMetrics(), logger.Named("notifications-manager"))
167172
require.NoError(t, err)
168173

169174
// THEN: validate that the manager can be stopped safely without Run() having been called yet

coderd/notifications/metrics_test.go

+24-20
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import (
1515
"github.com/stretchr/testify/assert"
1616
"github.com/stretchr/testify/require"
1717

18+
"cdr.dev/slog"
19+
"cdr.dev/slog/sloggers/slogtest"
1820
"github.com/coder/quartz"
19-
2021
"github.com/coder/serpent"
2122

22-
"github.com/coder/coder/v2/coderd/coderdtest"
2323
"github.com/coder/coder/v2/coderd/database"
2424
"github.com/coder/coder/v2/coderd/database/dbauthz"
2525
"github.com/coder/coder/v2/coderd/database/dbtestutil"
@@ -39,7 +39,8 @@ func TestMetrics(t *testing.T) {
3939

4040
// nolint:gocritic // Unit test.
4141
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
42-
_, _, api := coderdtest.NewWithAPI(t, nil)
42+
store, _ := dbtestutil.NewDB(t)
43+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
4344

4445
reg := prometheus.NewRegistry()
4546
metrics := notifications.NewMetrics(reg)
@@ -59,7 +60,7 @@ func TestMetrics(t *testing.T) {
5960
cfg.RetryInterval = serpent.Duration(time.Millisecond * 50)
6061
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100) // Twice as long as fetch interval to ensure we catch pending updates.
6162

62-
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
63+
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
6364
require.NoError(t, err)
6465
t.Cleanup(func() {
6566
assert.NoError(t, mgr.Stop(ctx))
@@ -69,10 +70,10 @@ func TestMetrics(t *testing.T) {
6970
method: handler,
7071
})
7172

72-
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
73+
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
7374
require.NoError(t, err)
7475

75-
user := createSampleUser(t, api.Database)
76+
user := createSampleUser(t, store)
7677

7778
// Build fingerprints for the two different series we expect.
7879
methodTemplateFP := fingerprintLabels(notifications.LabelMethod, string(method), notifications.LabelTemplateID, template.String())
@@ -212,7 +213,8 @@ func TestPendingUpdatesMetric(t *testing.T) {
212213
// SETUP
213214
// nolint:gocritic // Unit test.
214215
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
215-
_, _, api := coderdtest.NewWithAPI(t, nil)
216+
store, _ := dbtestutil.NewDB(t)
217+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
216218

217219
reg := prometheus.NewRegistry()
218220
metrics := notifications.NewMetrics(reg)
@@ -225,12 +227,12 @@ func TestPendingUpdatesMetric(t *testing.T) {
225227
cfg.RetryInterval = serpent.Duration(time.Hour) // Delay retries so they don't interfere.
226228
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100)
227229

228-
syncer := &syncInterceptor{Store: api.Database}
230+
syncer := &syncInterceptor{Store: store}
229231
interceptor := newUpdateSignallingInterceptor(syncer)
230232
mClock := quartz.NewMock(t)
231233
trap := mClock.Trap().NewTicker("Manager", "storeSync")
232234
defer trap.Close()
233-
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), metrics, api.Logger.Named("manager"),
235+
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), metrics, logger.Named("manager"),
234236
notifications.WithTestClock(mClock))
235237
require.NoError(t, err)
236238
t.Cleanup(func() {
@@ -241,10 +243,10 @@ func TestPendingUpdatesMetric(t *testing.T) {
241243
method: handler,
242244
})
243245

244-
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
246+
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
245247
require.NoError(t, err)
246248

247-
user := createSampleUser(t, api.Database)
249+
user := createSampleUser(t, store)
248250

249251
// WHEN: 2 notifications are enqueued, one of which will fail and one which will succeed
250252
_, err = enq.Enqueue(ctx, user.ID, template, map[string]string{"type": "success"}, "test") // this will succeed
@@ -296,7 +298,8 @@ func TestInflightDispatchesMetric(t *testing.T) {
296298
// SETUP
297299
// nolint:gocritic // Unit test.
298300
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
299-
_, _, api := coderdtest.NewWithAPI(t, nil)
301+
store, _ := dbtestutil.NewDB(t)
302+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
300303

301304
reg := prometheus.NewRegistry()
302305
metrics := notifications.NewMetrics(reg)
@@ -311,7 +314,7 @@ func TestInflightDispatchesMetric(t *testing.T) {
311314
cfg.RetryInterval = serpent.Duration(time.Hour) // Delay retries so they don't interfere.
312315
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100)
313316

314-
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
317+
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
315318
require.NoError(t, err)
316319
t.Cleanup(func() {
317320
assert.NoError(t, mgr.Stop(ctx))
@@ -326,10 +329,10 @@ func TestInflightDispatchesMetric(t *testing.T) {
326329
method: barrier,
327330
})
328331

329-
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
332+
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
330333
require.NoError(t, err)
331334

332-
user := createSampleUser(t, api.Database)
335+
user := createSampleUser(t, store)
333336

334337
// WHEN: notifications are enqueued which will succeed (and be delayed during dispatch)
335338
for i := 0; i < msgCount; i++ {
@@ -374,7 +377,8 @@ func TestCustomMethodMetricCollection(t *testing.T) {
374377

375378
// nolint:gocritic // Unit test.
376379
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
377-
_, _, api := coderdtest.NewWithAPI(t, nil)
380+
store, _ := dbtestutil.NewDB(t)
381+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
378382

379383
var (
380384
reg = prometheus.NewRegistry()
@@ -389,7 +393,7 @@ func TestCustomMethodMetricCollection(t *testing.T) {
389393
)
390394

391395
// GIVEN: a template whose notification method differs from the default.
392-
out, err := api.Database.UpdateNotificationTemplateMethodByID(ctx, database.UpdateNotificationTemplateMethodByIDParams{
396+
out, err := store.UpdateNotificationTemplateMethodByID(ctx, database.UpdateNotificationTemplateMethodByIDParams{
393397
ID: template,
394398
Method: database.NullNotificationMethod{NotificationMethod: customMethod, Valid: true},
395399
})
@@ -398,7 +402,7 @@ func TestCustomMethodMetricCollection(t *testing.T) {
398402

399403
// WHEN: two notifications (each with different templates) are enqueued.
400404
cfg := defaultNotificationsConfig(defaultMethod)
401-
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
405+
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
402406
require.NoError(t, err)
403407
t.Cleanup(func() {
404408
assert.NoError(t, mgr.Stop(ctx))
@@ -411,10 +415,10 @@ func TestCustomMethodMetricCollection(t *testing.T) {
411415
customMethod: webhookHandler,
412416
})
413417

414-
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
418+
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
415419
require.NoError(t, err)
416420

417-
user := createSampleUser(t, api.Database)
421+
user := createSampleUser(t, store)
418422

419423
_, err = enq.Enqueue(ctx, user.ID, template, map[string]string{"type": "success"}, "test")
420424
require.NoError(t, err)

0 commit comments

Comments
 (0)