@@ -685,6 +685,8 @@ func TestWorkspaceAutobuild(t *testing.T) {
685
685
ws := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
686
686
coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , ws .LatestBuild .ID )
687
687
688
+ coderdtest .MustTransitionWorkspace (t , client , ws .ID , database .WorkspaceTransitionStart , database .WorkspaceTransitionStop )
689
+
688
690
// Create a new version that will fail when we try to delete a workspace.
689
691
version = coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
690
692
Parse : echo .ParseComplete ,
@@ -734,6 +736,102 @@ func TestWorkspaceAutobuild(t *testing.T) {
734
736
require .Len (t , stats .Transitions , 1 )
735
737
require .Equal (t , database .WorkspaceTransitionDelete , stats .Transitions [ws .ID ])
736
738
})
739
+
740
+ t .Run ("RequirePromotedVersion" , func (t * testing.T ) {
741
+ t .Parallel ()
742
+
743
+ var (
744
+ tickCh = make (chan time.Time )
745
+ statsCh = make (chan autobuild.Stats )
746
+ ctx = testutil .Context (t , testutil .WaitMedium )
747
+ )
748
+
749
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
750
+ Options : & coderdtest.Options {
751
+ AutobuildTicker : tickCh ,
752
+ IncludeProvisionerDaemon : true ,
753
+ AutobuildStats : statsCh ,
754
+ TemplateScheduleStore : schedule .NewEnterpriseTemplateScheduleStore (agplUserQuietHoursScheduleStore ()),
755
+ },
756
+ LicenseOptions : & coderdenttest.LicenseOptions {
757
+ Features : license.Features {codersdk .FeatureAdvancedTemplateScheduling : 1 },
758
+ },
759
+ })
760
+
761
+ sched , err := cron .Weekly ("CRON_TZ=UTC 0 * * * *" )
762
+ require .NoError (t , err )
763
+
764
+ // Create a template version1 that passes to get a functioning workspace.
765
+ version1 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
766
+ Parse : echo .ParseComplete ,
767
+ ProvisionPlan : echo .PlanComplete ,
768
+ ProvisionApply : echo .ApplyComplete ,
769
+ })
770
+ coderdtest .AwaitTemplateVersionJobCompleted (t , client , version1 .ID )
771
+
772
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version1 .ID )
773
+ require .Equal (t , version1 .ID , template .ActiveVersionID )
774
+
775
+ ws := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID , func (cwr * codersdk.CreateWorkspaceRequest ) {
776
+ cwr .AutostartSchedule = ptr .Ref (sched .String ())
777
+ })
778
+
779
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , ws .LatestBuild .ID )
780
+ ws = coderdtest .MustTransitionWorkspace (t , client , ws .ID , database .WorkspaceTransitionStart , database .WorkspaceTransitionStop )
781
+
782
+ // Create a new version so that we can assert we don't update
783
+ // to the latest by default.
784
+ version2 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
785
+ Parse : echo .ParseComplete ,
786
+ ProvisionPlan : echo .PlanComplete ,
787
+ ProvisionApply : echo .ApplyComplete ,
788
+ }, func (ctvr * codersdk.CreateTemplateVersionRequest ) {
789
+ ctvr .TemplateID = template .ID
790
+ })
791
+ coderdtest .AwaitTemplateVersionJobCompleted (t , client , version2 .ID )
792
+
793
+ // Make sure to promote it.
794
+ err = client .UpdateActiveTemplateVersion (ctx , template .ID , codersdk.UpdateActiveTemplateVersion {
795
+ ID : version2 .ID ,
796
+ })
797
+ require .NoError (t , err )
798
+
799
+ // Kick of an autostart build.
800
+ tickCh <- sched .Next (ws .LatestBuild .CreatedAt )
801
+ stats := <- statsCh
802
+ require .NoError (t , stats .Error )
803
+ require .Len (t , stats .Transitions , 1 )
804
+ require .Contains (t , stats .Transitions , ws .ID )
805
+ require .Equal (t , database .WorkspaceTransitionStart , stats .Transitions [ws .ID ])
806
+
807
+ // Validate that we didn't update to the promoted version.
808
+ started := coderdtest .MustWorkspace (t , client , ws .ID )
809
+ firstBuild := coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , started .LatestBuild .ID )
810
+ require .Equal (t , version1 .ID , ws .LatestBuild .TemplateVersionID )
811
+
812
+ // Update the template to require the promoted version.
813
+ _ , err = client .UpdateTemplateMeta (ctx , template .ID , codersdk.UpdateTemplateMeta {
814
+ RequirePromotedVersion : true ,
815
+ AllowUserAutostart : true ,
816
+ })
817
+ require .NoError (t , err )
818
+
819
+ // Reset the workspace to the stopped state so we can try
820
+ // to autostart again.
821
+ coderdtest .MustTransitionWorkspace (t , client , ws .ID , database .WorkspaceTransitionStart , database .WorkspaceTransitionStop )
822
+
823
+ // Force an autostart transition again.
824
+ tickCh <- sched .Next (firstBuild .CreatedAt )
825
+ stats = <- statsCh
826
+ require .NoError (t , stats .Error )
827
+ require .Len (t , stats .Transitions , 1 )
828
+ require .Contains (t , stats .Transitions , ws .ID )
829
+ require .Equal (t , database .WorkspaceTransitionStart , stats .Transitions [ws .ID ])
830
+
831
+ // Validate that we are using the promoted version.
832
+ ws = coderdtest .MustWorkspace (t , client , ws .ID )
833
+ require .Equal (t , version2 .ID , ws .LatestBuild .TemplateVersionID )
834
+ })
737
835
}
738
836
739
837
func TestWorkspacesFiltering (t * testing.T ) {
0 commit comments