@@ -508,6 +508,78 @@ func TestWorkspaceAutobuild(t *testing.T) {
508
508
require .Equal (t , http .StatusGone , cerr .StatusCode ())
509
509
})
510
510
511
+ t .Run ("LockedTTTooEarly" , func (t * testing.T ) {
512
+ t .Parallel ()
513
+
514
+ var (
515
+ ticker = make (chan time.Time )
516
+ statCh = make (chan autobuild.Stats )
517
+ lockedTTL = time .Minute
518
+
519
+ client = coderdenttest .New (t , & coderdenttest.Options {
520
+ Options : & coderdtest.Options {
521
+ AutobuildTicker : ticker ,
522
+ IncludeProvisionerDaemon : true ,
523
+ AutobuildStats : statCh ,
524
+ TemplateScheduleStore : & coderd.EnterpriseTemplateScheduleStore {},
525
+ },
526
+ })
527
+ )
528
+ user := coderdtest .CreateFirstUser (t , client )
529
+ _ = coderdenttest .AddFullLicense (t , client )
530
+ version := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
531
+ Parse : echo .ParseComplete ,
532
+ ProvisionPlan : echo .ProvisionComplete ,
533
+ ProvisionApply : echo .ProvisionComplete ,
534
+ })
535
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID , func (ctr * codersdk.CreateTemplateRequest ) {
536
+ ctr .LockedTTLMillis = ptr.Ref [int64 ](lockedTTL .Milliseconds ())
537
+ })
538
+ coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
539
+ ws := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
540
+ build := coderdtest .AwaitWorkspaceBuildJob (t , client , ws .LatestBuild .ID )
541
+ require .Equal (t , codersdk .WorkspaceStatusRunning , build .Status )
542
+
543
+ ctx := testutil .Context (t , testutil .WaitMedium )
544
+ err := client .UpdateWorkspaceLock (ctx , ws .ID , codersdk.UpdateWorkspaceLock {
545
+ Lock : true ,
546
+ })
547
+ require .NoError (t , err )
548
+
549
+ ws = coderdtest .MustWorkspace (t , client , ws .ID )
550
+ require .NotNil (t , ws .LockedAt )
551
+
552
+ ticker <- time .Now ()
553
+ stats := <- statCh
554
+ // Expect no transitions since not enough time has elapsed.
555
+ require .Len (t , stats .Transitions , 0 )
556
+
557
+ // Update the lock time to trigger a deletion.
558
+ lockedTTL = time .Millisecond
559
+ _ , err = client .UpdateTemplateMeta (ctx , template .ID , codersdk.UpdateTemplateMeta {
560
+ Name : template .Name ,
561
+ DisplayName : template .DisplayName ,
562
+ Description : template .Description ,
563
+ Icon : template .Icon ,
564
+ AllowUserCancelWorkspaceJobs : template .AllowUserCancelWorkspaceJobs ,
565
+ LockedTTLMillis : lockedTTL .Milliseconds (),
566
+ })
567
+ require .NoError (t , err )
568
+
569
+ // Wait for the workspace to breach the locked threshold.
570
+ require .Eventually (t ,
571
+ func () bool {
572
+ return database .Now ().Sub (* ws .LockedAt ) > lockedTTL
573
+ },
574
+ testutil .IntervalMedium , testutil .IntervalFast )
575
+
576
+ ticker <- time .Now ()
577
+ stats = <- statCh
578
+ // Expect no transitions since not enough time has elapsed.
579
+ require .Len (t , stats .Transitions , 1 )
580
+ require .Equal (t , database .WorkspaceTransitionDelete , stats .Transitions [ws .ID ])
581
+ })
582
+
511
583
t .Run ("LockedNoAutostart" , func (t * testing.T ) {
512
584
t .Parallel ()
513
585
0 commit comments