@@ -245,6 +245,131 @@ func TestPostTemplateByOrganization(t *testing.T) {
245
245
require .ErrorAs (t , err , & apiErr )
246
246
require .Equal (t , http .StatusNotFound , apiErr .StatusCode ())
247
247
})
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
+ })
248
373
}
249
374
250
375
func TestTemplatesByOrganization (t * testing.T ) {
@@ -634,6 +759,7 @@ func TestPatchTemplateMeta(t *testing.T) {
634
759
Description : template .Description ,
635
760
Icon : template .Icon ,
636
761
DefaultTTLMillis : template .DefaultTTLMillis ,
762
+ RestartRequirement : nil ,
637
763
AllowUserAutostart : template .AllowUserAutostart ,
638
764
AllowUserAutostop : template .AllowUserAutostop ,
639
765
}
@@ -702,40 +828,175 @@ func TestPatchTemplateMeta(t *testing.T) {
702
828
assert .Equal (t , updated .Icon , "" )
703
829
})
704
830
705
- t .Run ("RestartRequirementEnterpriseOnly " , func (t * testing.T ) {
831
+ t .Run ("RestartRequirement " , func (t * testing.T ) {
706
832
t .Parallel ()
707
833
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 ()
726
836
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
+ }
729
845
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 )
734
862
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
+ })
739
1000
})
740
1001
}
741
1002
0 commit comments