Skip to content

Commit a4d785d

Browse files
authored
chore: use idiomatic test setup in notification tests (#14416)
1 parent d4adfa3 commit a4d785d

File tree

6 files changed

+187
-185
lines changed

6 files changed

+187
-185
lines changed

coderd/database/dbauthz/dbauthz.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -236,20 +236,23 @@ var (
236236
Identifier: rbac.RoleIdentifier{Name: "system"},
237237
DisplayName: "Coder",
238238
Site: rbac.Permissions(map[string][]policy.Action{
239-
rbac.ResourceWildcard.Type: {policy.ActionRead},
240-
rbac.ResourceApiKey.Type: rbac.ResourceApiKey.AvailableActions(),
241-
rbac.ResourceGroup.Type: {policy.ActionCreate, policy.ActionUpdate},
242-
rbac.ResourceAssignRole.Type: rbac.ResourceAssignRole.AvailableActions(),
243-
rbac.ResourceAssignOrgRole.Type: rbac.ResourceAssignOrgRole.AvailableActions(),
244-
rbac.ResourceSystem.Type: {policy.WildcardSymbol},
245-
rbac.ResourceOrganization.Type: {policy.ActionCreate, policy.ActionRead},
246-
rbac.ResourceOrganizationMember.Type: {policy.ActionCreate},
247-
rbac.ResourceProvisionerDaemon.Type: {policy.ActionCreate, policy.ActionUpdate},
248-
rbac.ResourceProvisionerKeys.Type: {policy.ActionCreate, policy.ActionRead, policy.ActionDelete},
249-
rbac.ResourceUser.Type: rbac.ResourceUser.AvailableActions(),
250-
rbac.ResourceWorkspaceDormant.Type: {policy.ActionUpdate, policy.ActionDelete, policy.ActionWorkspaceStop},
251-
rbac.ResourceWorkspace.Type: {policy.ActionUpdate, policy.ActionDelete, policy.ActionWorkspaceStart, policy.ActionWorkspaceStop, policy.ActionSSH},
252-
rbac.ResourceWorkspaceProxy.Type: {policy.ActionCreate, policy.ActionUpdate, policy.ActionDelete},
239+
rbac.ResourceWildcard.Type: {policy.ActionRead},
240+
rbac.ResourceApiKey.Type: rbac.ResourceApiKey.AvailableActions(),
241+
rbac.ResourceGroup.Type: {policy.ActionCreate, policy.ActionUpdate},
242+
rbac.ResourceAssignRole.Type: rbac.ResourceAssignRole.AvailableActions(),
243+
rbac.ResourceAssignOrgRole.Type: rbac.ResourceAssignOrgRole.AvailableActions(),
244+
rbac.ResourceSystem.Type: {policy.WildcardSymbol},
245+
rbac.ResourceOrganization.Type: {policy.ActionCreate, policy.ActionRead},
246+
rbac.ResourceOrganizationMember.Type: {policy.ActionCreate},
247+
rbac.ResourceProvisionerDaemon.Type: {policy.ActionCreate, policy.ActionUpdate},
248+
rbac.ResourceProvisionerKeys.Type: {policy.ActionCreate, policy.ActionRead, policy.ActionDelete},
249+
rbac.ResourceUser.Type: rbac.ResourceUser.AvailableActions(),
250+
rbac.ResourceWorkspaceDormant.Type: {policy.ActionUpdate, policy.ActionDelete, policy.ActionWorkspaceStop},
251+
rbac.ResourceWorkspace.Type: {policy.ActionUpdate, policy.ActionDelete, policy.ActionWorkspaceStart, policy.ActionWorkspaceStop, policy.ActionSSH},
252+
rbac.ResourceWorkspaceProxy.Type: {policy.ActionCreate, policy.ActionUpdate, policy.ActionDelete},
253+
rbac.ResourceDeploymentConfig.Type: {policy.ActionCreate, policy.ActionUpdate, policy.ActionDelete},
254+
rbac.ResourceNotificationPreference.Type: {policy.ActionCreate, policy.ActionUpdate, policy.ActionDelete},
255+
rbac.ResourceNotificationTemplate.Type: {policy.ActionCreate, policy.ActionUpdate, policy.ActionDelete},
253256
}),
254257
Org: map[string][]rbac.Permission{},
255258
User: []rbac.Permission{},

coderd/notifications/manager_test.go

+24-13
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ import (
1515
"github.com/coder/quartz"
1616
"github.com/coder/serpent"
1717

18+
"github.com/coder/coder/v2/coderd/coderdtest"
1819
"github.com/coder/coder/v2/coderd/database"
20+
"github.com/coder/coder/v2/coderd/database/dbauthz"
1921
"github.com/coder/coder/v2/coderd/database/dbgen"
2022
"github.com/coder/coder/v2/coderd/notifications"
2123
"github.com/coder/coder/v2/coderd/notifications/dispatch"
@@ -27,31 +29,34 @@ func TestBufferedUpdates(t *testing.T) {
2729
t.Parallel()
2830

2931
// setup
30-
ctx, logger, db := setupInMemory(t)
3132

32-
interceptor := &syncInterceptor{Store: db}
33+
// nolint:gocritic // Unit test.
34+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
35+
_, _, api := coderdtest.NewWithAPI(t, nil)
36+
37+
interceptor := &syncInterceptor{Store: api.Database}
3338
santa := &santaHandler{}
3439

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

3843
// GIVEN: a manager which will pass or fail notifications based on their "nice" labels
39-
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), createMetrics(), logger.Named("notifications-manager"))
44+
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), createMetrics(), api.Logger.Named("notifications-manager"))
4045
require.NoError(t, err)
4146
mgr.WithHandlers(map[database.NotificationMethod]notifications.Handler{
4247
database.NotificationMethodSmtp: santa,
4348
})
44-
enq, err := notifications.NewStoreEnqueuer(cfg, interceptor, defaultHelpers(), logger.Named("notifications-enqueuer"), quartz.NewReal())
49+
enq, err := notifications.NewStoreEnqueuer(cfg, interceptor, defaultHelpers(), api.Logger.Named("notifications-enqueuer"), quartz.NewReal())
4550
require.NoError(t, err)
4651

47-
user := dbgen.User(t, db, database.User{})
52+
user := dbgen.User(t, api.Database, database.User{})
4853

4954
// WHEN: notifications are enqueued which should succeed and fail
50-
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "true"}, "") // Will succeed.
55+
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "true", "i": "0"}, "") // Will succeed.
5156
require.NoError(t, err)
52-
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "true"}, "") // Will succeed.
57+
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "true", "i": "1"}, "") // Will succeed.
5358
require.NoError(t, err)
54-
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "false"}, "") // Will fail.
59+
_, err = enq.Enqueue(ctx, user.ID, notifications.TemplateWorkspaceDeleted, map[string]string{"nice": "false", "i": "2"}, "") // Will fail.
5560
require.NoError(t, err)
5661

5762
mgr.Run(ctx)
@@ -95,7 +100,10 @@ func TestBuildPayload(t *testing.T) {
95100
t.Parallel()
96101

97102
// SETUP
98-
ctx, logger, db := setupInMemory(t)
103+
104+
// nolint:gocritic // Unit test.
105+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
106+
_, _, api := coderdtest.NewWithAPI(t, nil)
99107

100108
// GIVEN: a set of helpers to be injected into the templates
101109
const label = "Click here!"
@@ -107,7 +115,7 @@ func TestBuildPayload(t *testing.T) {
107115
}
108116

109117
// GIVEN: an enqueue interceptor which returns mock metadata
110-
interceptor := newEnqueueInterceptor(db,
118+
interceptor := newEnqueueInterceptor(api.Database,
111119
// Inject custom message metadata to influence the payload construction.
112120
func() database.FetchNewMessageMetadataRow {
113121
// Inject template actions which use injected help functions.
@@ -129,7 +137,7 @@ func TestBuildPayload(t *testing.T) {
129137
}
130138
})
131139

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

135143
// WHEN: a notification is enqueued
@@ -149,10 +157,13 @@ func TestStopBeforeRun(t *testing.T) {
149157
t.Parallel()
150158

151159
// SETUP
152-
ctx, logger, db := setupInMemory(t)
160+
161+
// nolint:gocritic // Unit test.
162+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
163+
_, _, api := coderdtest.NewWithAPI(t, nil)
153164

154165
// GIVEN: a standard manager
155-
mgr, err := notifications.NewManager(defaultNotificationsConfig(database.NotificationMethodSmtp), db, defaultHelpers(), createMetrics(), logger.Named("notifications-manager"))
166+
mgr, err := notifications.NewManager(defaultNotificationsConfig(database.NotificationMethodSmtp), api.Database, defaultHelpers(), createMetrics(), api.Logger.Named("notifications-manager"))
156167
require.NoError(t, err)
157168

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

coderd/notifications/metrics_test.go

+31-19
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package notifications_test
22

33
import (
44
"context"
5+
"strconv"
56
"testing"
67
"time"
78

@@ -17,7 +18,9 @@ import (
1718

1819
"github.com/coder/serpent"
1920

21+
"github.com/coder/coder/v2/coderd/coderdtest"
2022
"github.com/coder/coder/v2/coderd/database"
23+
"github.com/coder/coder/v2/coderd/database/dbauthz"
2124
"github.com/coder/coder/v2/coderd/database/dbtestutil"
2225
"github.com/coder/coder/v2/coderd/notifications"
2326
"github.com/coder/coder/v2/coderd/notifications/dispatch"
@@ -33,7 +36,9 @@ func TestMetrics(t *testing.T) {
3336
t.Skip("This test requires postgres; it relies on business-logic only implemented in the database")
3437
}
3538

36-
ctx, logger, store := setup(t)
39+
// nolint:gocritic // Unit test.
40+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
41+
_, _, api := coderdtest.NewWithAPI(t, nil)
3742

3843
reg := prometheus.NewRegistry()
3944
metrics := notifications.NewMetrics(reg)
@@ -53,7 +58,7 @@ func TestMetrics(t *testing.T) {
5358
cfg.RetryInterval = serpent.Duration(time.Millisecond * 50)
5459
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100) // Twice as long as fetch interval to ensure we catch pending updates.
5560

56-
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
61+
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
5762
require.NoError(t, err)
5863
t.Cleanup(func() {
5964
assert.NoError(t, mgr.Stop(ctx))
@@ -63,10 +68,10 @@ func TestMetrics(t *testing.T) {
6368
method: handler,
6469
})
6570

66-
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
71+
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
6772
require.NoError(t, err)
6873

69-
user := createSampleUser(t, store)
74+
user := createSampleUser(t, api.Database)
7075

7176
// Build fingerprints for the two different series we expect.
7277
methodTemplateFP := fingerprintLabels(notifications.LabelMethod, string(method), notifications.LabelTemplateID, template.String())
@@ -204,7 +209,9 @@ func TestPendingUpdatesMetric(t *testing.T) {
204209
t.Parallel()
205210

206211
// SETUP
207-
ctx, logger, store := setupInMemory(t)
212+
// nolint:gocritic // Unit test.
213+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
214+
_, _, api := coderdtest.NewWithAPI(t, nil)
208215

209216
reg := prometheus.NewRegistry()
210217
metrics := notifications.NewMetrics(reg)
@@ -218,9 +225,9 @@ func TestPendingUpdatesMetric(t *testing.T) {
218225
cfg.RetryInterval = serpent.Duration(time.Hour) // Delay retries so they don't interfere.
219226
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100)
220227

221-
syncer := &syncInterceptor{Store: store}
228+
syncer := &syncInterceptor{Store: api.Database}
222229
interceptor := newUpdateSignallingInterceptor(syncer)
223-
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), metrics, logger.Named("manager"))
230+
mgr, err := notifications.NewManager(cfg, interceptor, defaultHelpers(), metrics, api.Logger.Named("manager"))
224231
require.NoError(t, err)
225232
t.Cleanup(func() {
226233
assert.NoError(t, mgr.Stop(ctx))
@@ -230,10 +237,10 @@ func TestPendingUpdatesMetric(t *testing.T) {
230237
method: handler,
231238
})
232239

233-
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
240+
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
234241
require.NoError(t, err)
235242

236-
user := createSampleUser(t, store)
243+
user := createSampleUser(t, api.Database)
237244

238245
// WHEN: 2 notifications are enqueued, one of which will fail and one which will succeed
239246
_, err = enq.Enqueue(ctx, user.ID, template, map[string]string{"type": "success"}, "test") // this will succeed
@@ -279,7 +286,9 @@ func TestInflightDispatchesMetric(t *testing.T) {
279286
t.Parallel()
280287

281288
// SETUP
282-
ctx, logger, store := setupInMemory(t)
289+
// nolint:gocritic // Unit test.
290+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
291+
_, _, api := coderdtest.NewWithAPI(t, nil)
283292

284293
reg := prometheus.NewRegistry()
285294
metrics := notifications.NewMetrics(reg)
@@ -294,7 +303,7 @@ func TestInflightDispatchesMetric(t *testing.T) {
294303
cfg.RetryInterval = serpent.Duration(time.Hour) // Delay retries so they don't interfere.
295304
cfg.StoreSyncInterval = serpent.Duration(time.Millisecond * 100)
296305

297-
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
306+
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
298307
require.NoError(t, err)
299308
t.Cleanup(func() {
300309
assert.NoError(t, mgr.Stop(ctx))
@@ -307,15 +316,15 @@ func TestInflightDispatchesMetric(t *testing.T) {
307316
method: delayer,
308317
})
309318

310-
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
319+
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
311320
require.NoError(t, err)
312321

313-
user := createSampleUser(t, store)
322+
user := createSampleUser(t, api.Database)
314323

315324
// WHEN: notifications are enqueued which will succeed (and be delayed during dispatch)
316325
const msgCount = 2
317326
for i := 0; i < msgCount; i++ {
318-
_, err = enq.Enqueue(ctx, user.ID, template, map[string]string{"type": "success"}, "test")
327+
_, err = enq.Enqueue(ctx, user.ID, template, map[string]string{"type": "success", "i": strconv.Itoa(i)}, "test")
319328
require.NoError(t, err)
320329
}
321330

@@ -349,7 +358,10 @@ func TestCustomMethodMetricCollection(t *testing.T) {
349358
// UpdateNotificationTemplateMethodByID only makes sense with a real database.
350359
t.Skip("This test requires postgres; it relies on business-logic only implemented in the database")
351360
}
352-
ctx, logger, store := setup(t)
361+
362+
// nolint:gocritic // Unit test.
363+
ctx := dbauthz.AsSystemRestricted(testutil.Context(t, testutil.WaitSuperLong))
364+
_, _, api := coderdtest.NewWithAPI(t, nil)
353365

354366
var (
355367
reg = prometheus.NewRegistry()
@@ -364,7 +376,7 @@ func TestCustomMethodMetricCollection(t *testing.T) {
364376
)
365377

366378
// GIVEN: a template whose notification method differs from the default.
367-
out, err := store.UpdateNotificationTemplateMethodByID(ctx, database.UpdateNotificationTemplateMethodByIDParams{
379+
out, err := api.Database.UpdateNotificationTemplateMethodByID(ctx, database.UpdateNotificationTemplateMethodByIDParams{
368380
ID: template,
369381
Method: database.NullNotificationMethod{NotificationMethod: customMethod, Valid: true},
370382
})
@@ -373,7 +385,7 @@ func TestCustomMethodMetricCollection(t *testing.T) {
373385

374386
// WHEN: two notifications (each with different templates) are enqueued.
375387
cfg := defaultNotificationsConfig(defaultMethod)
376-
mgr, err := notifications.NewManager(cfg, store, defaultHelpers(), metrics, logger.Named("manager"))
388+
mgr, err := notifications.NewManager(cfg, api.Database, defaultHelpers(), metrics, api.Logger.Named("manager"))
377389
require.NoError(t, err)
378390
t.Cleanup(func() {
379391
assert.NoError(t, mgr.Stop(ctx))
@@ -386,10 +398,10 @@ func TestCustomMethodMetricCollection(t *testing.T) {
386398
customMethod: webhookHandler,
387399
})
388400

389-
enq, err := notifications.NewStoreEnqueuer(cfg, store, defaultHelpers(), logger.Named("enqueuer"), quartz.NewReal())
401+
enq, err := notifications.NewStoreEnqueuer(cfg, api.Database, defaultHelpers(), api.Logger.Named("enqueuer"), quartz.NewReal())
390402
require.NoError(t, err)
391403

392-
user := createSampleUser(t, store)
404+
user := createSampleUser(t, api.Database)
393405

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

0 commit comments

Comments
 (0)