Skip to content

Commit eb1c1f6

Browse files
committed
more tests
1 parent 53f5d62 commit eb1c1f6

File tree

6 files changed

+462
-55
lines changed

6 files changed

+462
-55
lines changed

coderd/schedule/autostop_test.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -251,28 +251,16 @@ func TestCalculateAutoStop(t *testing.T) {
251251
},
252252
{
253253
name: "TimeBeforeEpoch",
254-
// The epoch is 2023-01-02 in each timezone.
255-
now: time.Date(2023, 1, 1, 23, 59, 59, 0, sydneyLoc),
254+
// The epoch is 2023-01-02 in each timezone. We set the time to
255+
// 1 second before 11pm the previous day, as this is the latest time
256+
// we allow due to our 1h leeway logic.
257+
now: time.Date(2023, 1, 1, 22, 59, 59, 0, sydneyLoc),
256258
templateAllowAutostop: true,
257259
templateDefaultTTL: 0,
258260
userQuietHoursSchedule: sydneyQuietHours,
259261
templateRestartRequirement: schedule.TemplateRestartRequirement{
260262
DaysOfWeek: 0b00100000, // Saturday
261-
Weeks: 0, // weekly
262-
},
263-
workspaceTTL: 0,
264-
errContains: "coder server system clock is incorrect",
265-
},
266-
{
267-
name: "BadRestartRequirement/NoDaysOfWeek",
268-
// The epoch is 2023-01-02 in each timezone.
269-
now: time.Date(2023, 1, 1, 23, 59, 59, 0, sydneyLoc),
270-
templateAllowAutostop: true,
271-
templateDefaultTTL: 0,
272-
userQuietHoursSchedule: sydneyQuietHours,
273-
templateRestartRequirement: schedule.TemplateRestartRequirement{
274-
DaysOfWeek: 0b10000000, // using un
275-
Weeks: 0, // weekly
263+
Weeks: 2, // every fortnight
276264
},
277265
workspaceTTL: 0,
278266
errContains: "coder server system clock is incorrect",
@@ -355,6 +343,11 @@ func TestCalculateAutoStop(t *testing.T) {
355343
Now: c.now,
356344
Workspace: workspace,
357345
})
346+
if c.errContains != "" {
347+
require.Error(t, err)
348+
require.ErrorContains(t, err, c.errContains)
349+
return
350+
}
358351
require.NoError(t, err)
359352

360353
// If the max deadline is set, the deadline should also be set.

coderd/templates_test.go

Lines changed: 290 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,131 @@ func TestPostTemplateByOrganization(t *testing.T) {
245245
require.ErrorAs(t, err, &apiErr)
246246
require.Equal(t, http.StatusNotFound, apiErr.StatusCode())
247247
})
248+
249+
t.Run("RestartRequirement", func(t *testing.T) {
250+
t.Parallel()
251+
252+
t.Run("None", func(t *testing.T) {
253+
t.Parallel()
254+
255+
var setCalled int64
256+
client := coderdtest.New(t, &coderdtest.Options{
257+
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
258+
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
259+
atomic.AddInt64(&setCalled, 1)
260+
assert.Zero(t, options.RestartRequirement.DaysOfWeek)
261+
assert.Zero(t, options.RestartRequirement.Weeks)
262+
263+
return db.UpdateTemplateScheduleByID(ctx, database.UpdateTemplateScheduleByIDParams{
264+
ID: template.ID,
265+
UpdatedAt: database.Now(),
266+
AllowUserAutostart: options.UserAutostartEnabled,
267+
AllowUserAutostop: options.UserAutostopEnabled,
268+
DefaultTTL: int64(options.DefaultTTL),
269+
RestartRequirementDaysOfWeek: int16(options.RestartRequirement.DaysOfWeek),
270+
RestartRequirementWeeks: options.RestartRequirement.Weeks,
271+
FailureTTL: int64(options.FailureTTL),
272+
InactivityTTL: int64(options.InactivityTTL),
273+
LockedTTL: int64(options.LockedTTL),
274+
})
275+
},
276+
},
277+
})
278+
user := coderdtest.CreateFirstUser(t, client)
279+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
280+
281+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
282+
defer cancel()
283+
284+
got, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{
285+
Name: "testing",
286+
VersionID: version.ID,
287+
RestartRequirement: nil,
288+
})
289+
require.NoError(t, err)
290+
291+
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
292+
require.Empty(t, got.RestartRequirement.DaysOfWeek)
293+
require.Zero(t, got.RestartRequirement.Weeks)
294+
})
295+
296+
t.Run("OK", func(t *testing.T) {
297+
t.Parallel()
298+
299+
var setCalled int64
300+
client := coderdtest.New(t, &coderdtest.Options{
301+
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
302+
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
303+
atomic.AddInt64(&setCalled, 1)
304+
assert.EqualValues(t, 0b00110000, options.RestartRequirement.DaysOfWeek)
305+
assert.EqualValues(t, 2, options.RestartRequirement.Weeks)
306+
307+
return db.UpdateTemplateScheduleByID(ctx, database.UpdateTemplateScheduleByIDParams{
308+
ID: template.ID,
309+
UpdatedAt: database.Now(),
310+
AllowUserAutostart: options.UserAutostartEnabled,
311+
AllowUserAutostop: options.UserAutostopEnabled,
312+
DefaultTTL: int64(options.DefaultTTL),
313+
RestartRequirementDaysOfWeek: int16(options.RestartRequirement.DaysOfWeek),
314+
RestartRequirementWeeks: options.RestartRequirement.Weeks,
315+
FailureTTL: int64(options.FailureTTL),
316+
InactivityTTL: int64(options.InactivityTTL),
317+
LockedTTL: int64(options.LockedTTL),
318+
})
319+
},
320+
},
321+
})
322+
user := coderdtest.CreateFirstUser(t, client)
323+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
324+
325+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
326+
defer cancel()
327+
328+
got, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{
329+
Name: "testing",
330+
VersionID: version.ID,
331+
RestartRequirement: &codersdk.TemplateRestartRequirement{
332+
// wrong order
333+
DaysOfWeek: []string{"saturday", "friday"},
334+
Weeks: 2,
335+
},
336+
})
337+
require.NoError(t, err)
338+
339+
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
340+
require.Equal(t, []string{"friday", "saturday"}, got.RestartRequirement.DaysOfWeek)
341+
require.EqualValues(t, 2, got.RestartRequirement.Weeks)
342+
343+
got, err = client.Template(ctx, got.ID)
344+
require.NoError(t, err)
345+
require.Equal(t, []string{"friday", "saturday"}, got.RestartRequirement.DaysOfWeek)
346+
require.EqualValues(t, 2, got.RestartRequirement.Weeks)
347+
})
348+
349+
t.Run("IgnoredUnlicensed", func(t *testing.T) {
350+
t.Parallel()
351+
352+
client := coderdtest.New(t, nil)
353+
user := coderdtest.CreateFirstUser(t, client)
354+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
355+
356+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
357+
defer cancel()
358+
359+
got, err := client.CreateTemplate(ctx, user.OrganizationID, codersdk.CreateTemplateRequest{
360+
Name: "testing",
361+
VersionID: version.ID,
362+
RestartRequirement: &codersdk.TemplateRestartRequirement{
363+
DaysOfWeek: []string{"friday", "saturday"},
364+
Weeks: 2,
365+
},
366+
})
367+
require.NoError(t, err)
368+
// ignored and use AGPL defaults
369+
require.Empty(t, got.RestartRequirement.DaysOfWeek)
370+
require.Zero(t, got.RestartRequirement.Weeks)
371+
})
372+
})
248373
}
249374

250375
func TestTemplatesByOrganization(t *testing.T) {
@@ -634,6 +759,7 @@ func TestPatchTemplateMeta(t *testing.T) {
634759
Description: template.Description,
635760
Icon: template.Icon,
636761
DefaultTTLMillis: template.DefaultTTLMillis,
762+
RestartRequirement: nil,
637763
AllowUserAutostart: template.AllowUserAutostart,
638764
AllowUserAutostop: template.AllowUserAutostop,
639765
}
@@ -702,40 +828,175 @@ func TestPatchTemplateMeta(t *testing.T) {
702828
assert.Equal(t, updated.Icon, "")
703829
})
704830

705-
t.Run("RestartRequirementEnterpriseOnly", func(t *testing.T) {
831+
t.Run("RestartRequirement", func(t *testing.T) {
706832
t.Parallel()
707833

708-
client := coderdtest.New(t, nil)
709-
user := coderdtest.CreateFirstUser(t, client)
710-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
711-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
712-
require.Empty(t, template.RestartRequirement.DaysOfWeek)
713-
require.Zero(t, template.RestartRequirement.Weeks)
714-
req := codersdk.UpdateTemplateMeta{
715-
Name: template.Name,
716-
DisplayName: template.DisplayName,
717-
Description: template.Description,
718-
Icon: template.Icon,
719-
AllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
720-
DefaultTTLMillis: time.Hour.Milliseconds(),
721-
RestartRequirement: &codersdk.TemplateRestartRequirement{
722-
DaysOfWeek: []string{"monday"},
723-
Weeks: 2,
724-
},
725-
}
834+
t.Run("OK", func(t *testing.T) {
835+
t.Parallel()
726836

727-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
728-
defer cancel()
837+
var setCalled int64
838+
client := coderdtest.New(t, &coderdtest.Options{
839+
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
840+
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
841+
if atomic.AddInt64(&setCalled, 1) == 2 {
842+
assert.EqualValues(t, 0b0110000, options.RestartRequirement.DaysOfWeek)
843+
assert.EqualValues(t, 2, options.RestartRequirement.Weeks)
844+
}
729845

730-
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
731-
require.NoError(t, err)
732-
require.Empty(t, updated.RestartRequirement.DaysOfWeek)
733-
require.Zero(t, updated.RestartRequirement.Weeks)
846+
return db.UpdateTemplateScheduleByID(ctx, database.UpdateTemplateScheduleByIDParams{
847+
ID: template.ID,
848+
UpdatedAt: database.Now(),
849+
AllowUserAutostart: options.UserAutostartEnabled,
850+
AllowUserAutostop: options.UserAutostopEnabled,
851+
DefaultTTL: int64(options.DefaultTTL),
852+
RestartRequirementDaysOfWeek: int16(options.RestartRequirement.DaysOfWeek),
853+
RestartRequirementWeeks: options.RestartRequirement.Weeks,
854+
FailureTTL: int64(options.FailureTTL),
855+
InactivityTTL: int64(options.InactivityTTL),
856+
LockedTTL: int64(options.LockedTTL),
857+
})
858+
},
859+
},
860+
})
861+
user := coderdtest.CreateFirstUser(t, client)
734862

735-
template, err = client.Template(ctx, template.ID)
736-
require.NoError(t, err)
737-
require.Empty(t, template.RestartRequirement.DaysOfWeek)
738-
require.Zero(t, template.RestartRequirement.Weeks)
863+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
864+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
865+
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
866+
require.Empty(t, template.RestartRequirement.DaysOfWeek)
867+
require.Zero(t, template.RestartRequirement.Weeks)
868+
req := codersdk.UpdateTemplateMeta{
869+
Name: template.Name,
870+
DisplayName: template.DisplayName,
871+
Description: template.Description,
872+
Icon: template.Icon,
873+
AllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
874+
DefaultTTLMillis: time.Hour.Milliseconds(),
875+
RestartRequirement: &codersdk.TemplateRestartRequirement{
876+
// wrong order
877+
DaysOfWeek: []string{"saturday", "friday"},
878+
Weeks: 2,
879+
},
880+
}
881+
882+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
883+
defer cancel()
884+
885+
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
886+
require.NoError(t, err)
887+
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled))
888+
require.Equal(t, []string{"friday", "saturday"}, updated.RestartRequirement.DaysOfWeek)
889+
require.EqualValues(t, 2, updated.RestartRequirement.Weeks)
890+
891+
template, err = client.Template(ctx, template.ID)
892+
require.NoError(t, err)
893+
require.Equal(t, []string{"friday", "saturday"}, template.RestartRequirement.DaysOfWeek)
894+
require.EqualValues(t, 2, template.RestartRequirement.Weeks)
895+
})
896+
897+
t.Run("Unset", func(t *testing.T) {
898+
t.Parallel()
899+
900+
var setCalled int64
901+
client := coderdtest.New(t, &coderdtest.Options{
902+
TemplateScheduleStore: schedule.MockTemplateScheduleStore{
903+
SetFn: func(ctx context.Context, db database.Store, template database.Template, options schedule.TemplateScheduleOptions) (database.Template, error) {
904+
if atomic.AddInt64(&setCalled, 1) == 2 {
905+
assert.EqualValues(t, 0, options.RestartRequirement.DaysOfWeek)
906+
assert.EqualValues(t, 0, options.RestartRequirement.Weeks)
907+
}
908+
909+
return db.UpdateTemplateScheduleByID(ctx, database.UpdateTemplateScheduleByIDParams{
910+
ID: template.ID,
911+
UpdatedAt: database.Now(),
912+
AllowUserAutostart: options.UserAutostartEnabled,
913+
AllowUserAutostop: options.UserAutostopEnabled,
914+
DefaultTTL: int64(options.DefaultTTL),
915+
RestartRequirementDaysOfWeek: int16(options.RestartRequirement.DaysOfWeek),
916+
RestartRequirementWeeks: options.RestartRequirement.Weeks,
917+
FailureTTL: int64(options.FailureTTL),
918+
InactivityTTL: int64(options.InactivityTTL),
919+
LockedTTL: int64(options.LockedTTL),
920+
})
921+
},
922+
},
923+
})
924+
user := coderdtest.CreateFirstUser(t, client)
925+
926+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
927+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
928+
ctr.RestartRequirement = &codersdk.TemplateRestartRequirement{
929+
// wrong order
930+
DaysOfWeek: []string{"sunday", "saturday", "friday", "thursday", "wednesday", "tuesday", "monday"},
931+
Weeks: 2,
932+
}
933+
})
934+
require.EqualValues(t, 1, atomic.LoadInt64(&setCalled))
935+
require.Equal(t, []string{"monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"}, template.RestartRequirement.DaysOfWeek)
936+
require.EqualValues(t, 2, template.RestartRequirement.Weeks)
937+
req := codersdk.UpdateTemplateMeta{
938+
Name: template.Name,
939+
DisplayName: template.DisplayName,
940+
Description: template.Description,
941+
Icon: template.Icon,
942+
AllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
943+
DefaultTTLMillis: time.Hour.Milliseconds(),
944+
RestartRequirement: &codersdk.TemplateRestartRequirement{
945+
DaysOfWeek: []string{},
946+
Weeks: 0,
947+
},
948+
}
949+
950+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
951+
defer cancel()
952+
953+
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
954+
require.NoError(t, err)
955+
require.EqualValues(t, 2, atomic.LoadInt64(&setCalled))
956+
require.Empty(t, updated.RestartRequirement.DaysOfWeek)
957+
require.EqualValues(t, 0, updated.RestartRequirement.Weeks)
958+
959+
template, err = client.Template(ctx, template.ID)
960+
require.NoError(t, err)
961+
require.Empty(t, template.RestartRequirement.DaysOfWeek)
962+
require.EqualValues(t, 0, template.RestartRequirement.Weeks)
963+
})
964+
965+
t.Run("EnterpriseOnly", func(t *testing.T) {
966+
t.Parallel()
967+
968+
client := coderdtest.New(t, nil)
969+
user := coderdtest.CreateFirstUser(t, client)
970+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
971+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
972+
require.Empty(t, template.RestartRequirement.DaysOfWeek)
973+
require.Zero(t, template.RestartRequirement.Weeks)
974+
req := codersdk.UpdateTemplateMeta{
975+
Name: template.Name,
976+
DisplayName: template.DisplayName,
977+
Description: template.Description,
978+
Icon: template.Icon,
979+
AllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
980+
DefaultTTLMillis: time.Hour.Milliseconds(),
981+
RestartRequirement: &codersdk.TemplateRestartRequirement{
982+
DaysOfWeek: []string{"monday"},
983+
Weeks: 2,
984+
},
985+
}
986+
987+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
988+
defer cancel()
989+
990+
updated, err := client.UpdateTemplateMeta(ctx, template.ID, req)
991+
require.NoError(t, err)
992+
require.Empty(t, updated.RestartRequirement.DaysOfWeek)
993+
require.Zero(t, updated.RestartRequirement.Weeks)
994+
995+
template, err = client.Template(ctx, template.ID)
996+
require.NoError(t, err)
997+
require.Empty(t, template.RestartRequirement.DaysOfWeek)
998+
require.Zero(t, template.RestartRequirement.Weeks)
999+
})
7391000
})
7401001
}
7411002

0 commit comments

Comments
 (0)