@@ -213,12 +213,116 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
213
213
214
214
t .Run ("NoFailedBuilds_TemplateAdminIn_NoReport" , func (t * testing.T ) {
215
215
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
217
259
})
218
260
219
261
t .Run ("FailedBuilds_TemplateAdminOptOut_NoReport" , func (t * testing.T ) {
220
262
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"], "?")
222
326
})
223
327
224
328
t .Run ("FreshTemplate_FailedBuilds_TemplateAdminIn_NoReport" , func (t * testing.T ) {
0 commit comments