Skip to content

Commit 0cceede

Browse files
committed
more tests
1 parent 8909bb6 commit 0cceede

File tree

1 file changed

+106
-2
lines changed

1 file changed

+106
-2
lines changed

coderd/notifications/reports/generator_internal_test.go

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,116 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
213213

214214
t.Run("NoFailedBuilds_TemplateAdminIn_NoReport", func(t *testing.T) {
215215
t.Parallel()
216-
// TODO
216+
217+
// Setup
218+
ctx, logger, db, ps, notifEnq, clk := setup(t)
219+
220+
// Given
221+
// Organization
222+
org := dbgen.Organization(t, db, database.Organization{})
223+
224+
// Template admins
225+
templateAdmin1 := dbgen.User(t, db, database.User{Username: "template-admin-1", RBACRoles: []string{rbac.RoleTemplateAdmin().Name}})
226+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: templateAdmin1.ID, OrganizationID: org.ID})
227+
228+
// Regular users
229+
user1 := dbgen.User(t, db, database.User{})
230+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user1.ID, OrganizationID: org.ID})
231+
232+
// Templates
233+
t1 := dbgen.Template(t, db, database.Template{Name: "template-1", DisplayName: "First Template", CreatedBy: templateAdmin1.ID, OrganizationID: org.ID})
234+
235+
// Template versions
236+
t1v1 := dbgen.TemplateVersion(t, db, database.TemplateVersion{Name: "template-1-version-1", CreatedBy: templateAdmin1.ID, OrganizationID: org.ID, TemplateID: uuid.NullUUID{UUID: t1.ID, Valid: true}, JobID: uuid.New()})
237+
238+
// Workspaces
239+
w1 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t1.ID, OwnerID: user1.ID, OrganizationID: org.ID})
240+
241+
now := clk.Now()
242+
243+
// Workspace builds
244+
w1wb1pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-6 * dayDuration), Valid: true}})
245+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 1, TemplateVersionID: t1v1.ID, JobID: w1wb1pj.ID, CreatedAt: now.Add(-6 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
246+
w1wb2pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-5 * dayDuration), Valid: true}})
247+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 2, TemplateVersionID: t1v1.ID, JobID: w1wb2pj.ID, CreatedAt: now.Add(-5 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
248+
249+
// Database is ready, so we can clear notifications queue
250+
notifEnq.Clear()
251+
252+
// When
253+
err := reportFailedWorkspaceBuilds(ctx, logger, authedDB(db, logger), notifEnq, clk)
254+
255+
// Then
256+
require.NoError(t, err)
257+
258+
require.Len(t, notifEnq.Sent, 0) // all jobs succeeded so no report
217259
})
218260

219261
t.Run("FailedBuilds_TemplateAdminOptOut_NoReport", func(t *testing.T) {
220262
t.Parallel()
221-
// TODO
263+
264+
if !dbtestutil.WillUsePostgres() {
265+
t.Skip("notification preferences depend on database trigger")
266+
}
267+
268+
// Setup
269+
ctx, logger, db, ps, notifEnq, clk := setup(t)
270+
271+
// Given
272+
// Organization
273+
org := dbgen.Organization(t, db, database.Organization{})
274+
275+
// Template admins
276+
templateAdmin1 := dbgen.User(t, db, database.User{Username: "template-admin-1", RBACRoles: []string{rbac.RoleTemplateAdmin().Name}})
277+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: templateAdmin1.ID, OrganizationID: org.ID})
278+
templateAdmin2 := dbgen.User(t, db, database.User{Username: "template-admin-2", RBACRoles: []string{rbac.RoleTemplateAdmin().Name}})
279+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: templateAdmin2.ID, OrganizationID: org.ID})
280+
_, err := db.UpdateUserNotificationPreferences(ctx, database.UpdateUserNotificationPreferencesParams{
281+
UserID: templateAdmin2.ID,
282+
NotificationTemplateIds: []uuid.UUID{notifications.TemplateWorkspaceBuildsFailedReport},
283+
Disableds: []bool{true},
284+
})
285+
require.NoError(t, err)
286+
287+
// Regular users
288+
user1 := dbgen.User(t, db, database.User{})
289+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user1.ID, OrganizationID: org.ID})
290+
291+
// Templates
292+
t1 := dbgen.Template(t, db, database.Template{Name: "template-1", DisplayName: "First Template", CreatedBy: templateAdmin1.ID, OrganizationID: org.ID})
293+
294+
// Template versions
295+
t1v1 := dbgen.TemplateVersion(t, db, database.TemplateVersion{Name: "template-1-version-1", CreatedBy: templateAdmin1.ID, OrganizationID: org.ID, TemplateID: uuid.NullUUID{UUID: t1.ID, Valid: true}, JobID: uuid.New()})
296+
297+
// Workspaces
298+
w1 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t1.ID, OwnerID: user1.ID, OrganizationID: org.ID})
299+
300+
now := clk.Now()
301+
302+
// Workspace builds
303+
w1wb1pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, Error: jobError, ErrorCode: jobErrorCode, CompletedAt: sql.NullTime{Time: now.Add(-6 * dayDuration), Valid: true}})
304+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 1, TemplateVersionID: t1v1.ID, JobID: w1wb1pj.ID, CreatedAt: now.Add(-6 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
305+
w1wb2pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-5 * dayDuration), Valid: true}})
306+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 2, TemplateVersionID: t1v1.ID, JobID: w1wb2pj.ID, CreatedAt: now.Add(-5 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
307+
308+
// Database is ready, so we can clear notifications queue
309+
notifEnq.Clear()
310+
311+
// When
312+
err = reportFailedWorkspaceBuilds(ctx, logger, authedDB(db, logger), notifEnq, clk)
313+
314+
// Then
315+
require.NoError(t, err)
316+
317+
require.Len(t, notifEnq.Sent, 1) // one job failed, but only one template admin enabled reports
318+
require.Equal(t, notifEnq.Sent[0].UserID, templateAdmin1.ID)
319+
require.Equal(t, notifEnq.Sent[0].TemplateID, notifications.TemplateWorkspaceBuildsFailedReport)
320+
require.Equal(t, notifEnq.Sent[0].Labels["template_name"], t1.Name)
321+
require.Equal(t, notifEnq.Sent[0].Labels["template_display_name"], t1.DisplayName)
322+
require.Equal(t, notifEnq.Sent[0].Data["failed_builds"], int64(1))
323+
require.Equal(t, notifEnq.Sent[0].Data["total_builds"], int64(2))
324+
require.Equal(t, notifEnq.Sent[0].Data["report_frequency"], "week")
325+
// require.Contains(t, notifEnq.Sent[0].Data["template_versions"], "?")
222326
})
223327

224328
t.Run("FreshTemplate_FailedBuilds_TemplateAdminIn_NoReport", func(t *testing.T) {

0 commit comments

Comments
 (0)