Skip to content

Commit 06a79f4

Browse files
committed
adjust tests
1 parent d96a34a commit 06a79f4

File tree

2 files changed

+99
-22
lines changed

2 files changed

+99
-22
lines changed

coderd/notifications/reports/generator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
138138

139139
for _, stats := range templateStatsRows {
140140
if stats.FailedBuilds == 0 {
141-
logger.Error(ctx, "no failed workspace builds found for template", slog.F("template_id", stats.TemplateID), slog.Error(err))
141+
logger.Info(ctx, "no failed workspace builds found for template", slog.F("template_id", stats.TemplateID), slog.Error(err))
142142
continue
143143
}
144144

coderd/notifications/reports/generator_internal_test.go

Lines changed: 98 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ var (
3535
func TestReportFailedWorkspaceBuilds(t *testing.T) {
3636
t.Parallel()
3737

38-
t.Run("InitialState_NoBuilds_NoReport", func(t *testing.T) {
38+
t.Run("EmptyState_NoBuilds_NoReport", func(t *testing.T) {
3939
t.Parallel()
4040

4141
// Setup
@@ -44,10 +44,73 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
4444
// Database is ready, so we can clear notifications queue
4545
notifEnq.Clear()
4646

47+
// When: first run
48+
err := reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
49+
50+
// Then: no report should be generated
51+
require.NoError(t, err)
52+
require.Empty(t, notifEnq.Sent)
53+
54+
// Given: one week later and no jobs were executed
55+
clk.Advance(failedWorkspaceBuildsReportFrequency + time.Minute)
56+
4757
// When
58+
notifEnq.Clear()
59+
err = reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
60+
61+
// Then: report is still empty
62+
require.NoError(t, err)
63+
require.Empty(t, notifEnq.Sent)
64+
})
65+
66+
t.Run("InitialState_NoBuilds_NoReport", func(t *testing.T) {
67+
t.Parallel()
68+
69+
// Setup
70+
ctx, logger, db, ps, notifEnq, clk := setup(t)
71+
now := clk.Now()
72+
73+
// Organization
74+
org := dbgen.Organization(t, db, database.Organization{})
75+
76+
// Template admins
77+
templateAdmin1 := dbgen.User(t, db, database.User{Username: "template-admin-1", RBACRoles: []string{rbac.RoleTemplateAdmin().Name}})
78+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: templateAdmin1.ID, OrganizationID: org.ID})
79+
80+
// Regular users
81+
user1 := dbgen.User(t, db, database.User{})
82+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user1.ID, OrganizationID: org.ID})
83+
user2 := dbgen.User(t, db, database.User{})
84+
_ = dbgen.OrganizationMember(t, db, database.OrganizationMember{UserID: user2.ID, OrganizationID: org.ID})
85+
86+
// Templates
87+
t1 := dbgen.Template(t, db, database.Template{Name: "template-1", DisplayName: "First Template", CreatedBy: templateAdmin1.ID, OrganizationID: org.ID})
88+
89+
// Template versions
90+
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()})
91+
92+
// Workspaces
93+
w1 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t1.ID, OwnerID: user1.ID, OrganizationID: org.ID})
94+
95+
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}})
96+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 1, TemplateVersionID: t1v1.ID, JobID: w1wb1pj.ID, CreatedAt: now.Add(-2 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
97+
98+
// When: first run
99+
notifEnq.Clear()
48100
err := reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
49101

50-
// Then
102+
// Then: failed builds should not be reported
103+
require.NoError(t, err)
104+
require.Empty(t, notifEnq.Sent)
105+
106+
// Given: one week later, but still no jobs
107+
clk.Advance(failedWorkspaceBuildsReportFrequency + time.Minute)
108+
109+
// When
110+
notifEnq.Clear()
111+
err = reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
112+
113+
// Then: report is still empty
51114
require.NoError(t, err)
52115
require.Empty(t, notifEnq.Sent)
53116
})
@@ -72,6 +135,7 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
72135
ctx, logger, db, ps, notifEnq, clk := setup(t)
73136

74137
// Given
138+
75139
// Organization
76140
org := dbgen.Organization(t, db, database.Organization{})
77141

@@ -105,6 +169,16 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
105169
w3 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t1.ID, OwnerID: user1.ID, OrganizationID: org.ID})
106170
w4 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t2.ID, OwnerID: user2.ID, OrganizationID: org.ID})
107171

172+
// When: first run
173+
notifEnq.Clear()
174+
err := reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
175+
176+
// Then
177+
require.NoError(t, err)
178+
require.Empty(t, notifEnq.Sent) // no notifications
179+
180+
// One week later...
181+
clk.Advance(failedWorkspaceBuildsReportFrequency + time.Minute)
108182
now := clk.Now()
109183

110184
// Workspace builds
@@ -130,11 +204,9 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
130204
w4wb2pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-dayDuration), Valid: true}})
131205
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w4.ID, BuildNumber: 9, TemplateVersionID: t2v2.ID, JobID: w4wb2pj.ID, CreatedAt: now.Add(-dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
132206

133-
// Database is ready, so we can clear notifications queue
134-
notifEnq.Clear()
135-
136207
// When
137-
err := reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
208+
notifEnq.Clear()
209+
err = reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
138210

139211
// Then
140212
require.NoError(t, err)
@@ -182,30 +254,28 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
182254

183255
// Given: 6 days later (less than report frequency), and failed build
184256
clk.Advance(6 * dayDuration).MustWait(context.Background())
185-
186257
now = clk.Now()
187258

188259
w1wb4pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, Error: jobError, ErrorCode: jobErrorCode, CompletedAt: sql.NullTime{Time: now.Add(-dayDuration), Valid: true}})
189260
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 77, TemplateVersionID: t1v2.ID, JobID: w1wb4pj.ID, CreatedAt: now.Add(-dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
190261

191-
notifEnq.Clear()
192-
193262
// When
263+
notifEnq.Clear()
194264
err = reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
195265
require.NoError(t, err)
196266

197-
// Then
198-
require.Empty(t, notifEnq.Sent) // no notifications as it is too early.
267+
// Then: no notifications as it is too early
268+
require.Empty(t, notifEnq.Sent)
199269

200270
// Given: 1 day 1 hour later
201271
clk.Advance(dayDuration + time.Hour).MustWait(context.Background())
202-
notifEnq.Clear()
203272

204273
// When
274+
notifEnq.Clear()
205275
err = reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
206276
require.NoError(t, err)
207277

208-
// Then
278+
// Then: we should see the failed job in the report
209279
require.Len(t, notifEnq.Sent, 2) // a new failed job should be reported
210280
for i, templateAdmin := range []database.User{templateAdmin1, templateAdmin2} {
211281
verifyNotification(t, templateAdmin, notifEnq.Sent[i], t1, 1, 1, []map[string]interface{}{
@@ -247,23 +317,30 @@ func TestReportFailedWorkspaceBuilds(t *testing.T) {
247317
// Workspaces
248318
w1 := dbgen.Workspace(t, db, database.Workspace{TemplateID: t1.ID, OwnerID: user1.ID, OrganizationID: org.ID})
249319

320+
// When: first run
321+
notifEnq.Clear()
322+
err := reportFailedWorkspaceBuilds(ctx, logger, db, notifEnq, clk)
323+
324+
// Then: no notifications
325+
require.NoError(t, err)
326+
require.Empty(t, notifEnq.Sent)
327+
328+
// Given: one week later, and a successful few jobs being executed
329+
clk.Advance(failedWorkspaceBuildsReportFrequency + time.Minute)
250330
now := clk.Now()
251331

252332
// Workspace builds
253333
w1wb1pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-6 * dayDuration), Valid: true}})
254-
_ = 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})
334+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 1, TemplateVersionID: t1v1.ID, JobID: w1wb1pj.ID, CreatedAt: now.Add(-2 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
255335
w1wb2pj := dbgen.ProvisionerJob(t, db, ps, database.ProvisionerJob{OrganizationID: org.ID, CompletedAt: sql.NullTime{Time: now.Add(-5 * dayDuration), Valid: true}})
256-
_ = 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})
257-
258-
// Database is ready, so we can clear notifications queue
259-
notifEnq.Clear()
336+
_ = dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{WorkspaceID: w1.ID, BuildNumber: 2, TemplateVersionID: t1v1.ID, JobID: w1wb2pj.ID, CreatedAt: now.Add(-1 * dayDuration), Transition: database.WorkspaceTransitionStart, Reason: database.BuildReasonInitiator})
260337

261338
// When
262-
err := reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
339+
notifEnq.Clear()
340+
err = reportFailedWorkspaceBuilds(ctx, logger, authedDB(t, db, logger), notifEnq, clk)
263341

264-
// Then
342+
// Then: no failures? nothing to report
265343
require.NoError(t, err)
266-
267344
require.Len(t, notifEnq.Sent, 0) // all jobs succeeded so nothing to report
268345
})
269346
}

0 commit comments

Comments
 (0)