@@ -1804,6 +1804,88 @@ func TestNotifications(t *testing.T) {
1804
1804
})
1805
1805
}
1806
1806
})
1807
+
1808
+ t .Run ("Manual build failed, template admins notified" , func (t * testing.T ) {
1809
+ t .Parallel ()
1810
+
1811
+ ctx := context .Background ()
1812
+ notifEnq := & testutil.FakeNotificationsEnqueuer {}
1813
+
1814
+ // Otherwise `(*Server).FailJob` fails with:
1815
+ // audit log - get build {"error": "sql: no rows in result set"}
1816
+ ignoreLogErrors := true
1817
+ srv , db , ps , pd := setup (t , ignoreLogErrors , & overrides {
1818
+ notificationEnqueuer : notifEnq ,
1819
+ })
1820
+
1821
+ templateAdmin := dbgen .User (t , db , database.User {RBACRoles : []string {codersdk .RoleTemplateAdmin }})
1822
+ user := dbgen .User (t , db , database.User {})
1823
+ initiator := user
1824
+
1825
+ template := dbgen .Template (t , db , database.Template {
1826
+ Name : "template" ,
1827
+ Provisioner : database .ProvisionerTypeEcho ,
1828
+ OrganizationID : pd .OrganizationID ,
1829
+ })
1830
+ template , err := db .GetTemplateByID (ctx , template .ID )
1831
+ require .NoError (t , err )
1832
+ file := dbgen .File (t , db , database.File {CreatedBy : user .ID })
1833
+ workspace := dbgen .Workspace (t , db , database.Workspace {
1834
+ TemplateID : template .ID ,
1835
+ OwnerID : user .ID ,
1836
+ OrganizationID : pd .OrganizationID ,
1837
+ })
1838
+ version := dbgen .TemplateVersion (t , db , database.TemplateVersion {
1839
+ OrganizationID : pd .OrganizationID ,
1840
+ TemplateID : uuid.NullUUID {
1841
+ UUID : template .ID ,
1842
+ Valid : true ,
1843
+ },
1844
+ JobID : uuid .New (),
1845
+ })
1846
+ build := dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
1847
+ WorkspaceID : workspace .ID ,
1848
+ TemplateVersionID : version .ID ,
1849
+ InitiatorID : initiator .ID ,
1850
+ Transition : database .WorkspaceTransitionDelete ,
1851
+ Reason : database .BuildReasonInitiator ,
1852
+ })
1853
+ job := dbgen .ProvisionerJob (t , db , ps , database.ProvisionerJob {
1854
+ FileID : file .ID ,
1855
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
1856
+ Input : must (json .Marshal (provisionerdserver.WorkspaceProvisionJob {
1857
+ WorkspaceBuildID : build .ID ,
1858
+ })),
1859
+ OrganizationID : pd .OrganizationID ,
1860
+ })
1861
+ _ , err = db .AcquireProvisionerJob (ctx , database.AcquireProvisionerJobParams {
1862
+ OrganizationID : pd .OrganizationID ,
1863
+ WorkerID : uuid.NullUUID {
1864
+ UUID : pd .ID ,
1865
+ Valid : true ,
1866
+ },
1867
+ Types : []database.ProvisionerType {database .ProvisionerTypeEcho },
1868
+ })
1869
+ require .NoError (t , err )
1870
+
1871
+ _ , err = srv .FailJob (ctx , & proto.FailedJob {
1872
+ JobId : job .ID .String (),
1873
+ Type : & proto.FailedJob_WorkspaceBuild_ {
1874
+ WorkspaceBuild : & proto.FailedJob_WorkspaceBuild {
1875
+ State : []byte {},
1876
+ },
1877
+ },
1878
+ })
1879
+ require .NoError (t , err )
1880
+
1881
+ require .Len (t , notifEnq .Sent , 1 )
1882
+ require .Equal (t , notifEnq .Sent [0 ].UserID , templateAdmin .ID )
1883
+ require .Equal (t , notifEnq .Sent [0 ].TemplateID , notifications .TemplateWorkspaceManualBuildFailed )
1884
+ require .Contains (t , notifEnq .Sent [0 ].Targets , template .ID )
1885
+ require .Contains (t , notifEnq .Sent [0 ].Targets , workspace .ID )
1886
+ require .Contains (t , notifEnq .Sent [0 ].Targets , workspace .OrganizationID )
1887
+ require .Contains (t , notifEnq .Sent [0 ].Targets , user .ID )
1888
+ })
1807
1889
}
1808
1890
1809
1891
type overrides struct {
0 commit comments