@@ -96,6 +96,64 @@ func TestUpdate(t *testing.T) {
96
96
require .Equal (t ,codersdk .WorkspaceTransitionStop ,prevBuild .Transition ,"previous build must be a stop transition" )
97
97
require .Equal (t ,version1 .ID .String (),prevBuild .TemplateVersionID .String (),"previous build must have the old template version" )
98
98
})
99
+
100
+ t .Run ("Stopped" ,func (t * testing.T ) {
101
+ t .Parallel ()
102
+
103
+ // Given: a workspace exists on the latest template version.
104
+ client := coderdtest .New (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
105
+ owner := coderdtest .CreateFirstUser (t ,client )
106
+ member ,_ := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID )
107
+ version1 := coderdtest .CreateTemplateVersion (t ,client ,owner .OrganizationID ,nil )
108
+
109
+ coderdtest .AwaitTemplateVersionJobCompleted (t ,client ,version1 .ID )
110
+ template := coderdtest .CreateTemplate (t ,client ,owner .OrganizationID ,version1 .ID )
111
+
112
+ ws := coderdtest .CreateWorkspace (t ,member ,template .ID ,func (cwr * codersdk.CreateWorkspaceRequest ) {
113
+ cwr .Name = "my-workspace"
114
+ })
115
+ require .False (t ,ws .Outdated ,"newly created workspace with active template version must not be outdated" )
116
+
117
+ // Given: the template version is updated
118
+ version2 := coderdtest .UpdateTemplateVersion (t ,client ,owner .OrganizationID ,& echo.Responses {
119
+ Parse :echo .ParseComplete ,
120
+ ProvisionApply :echo .ApplyComplete ,
121
+ ProvisionPlan :echo .PlanComplete ,
122
+ },template .ID )
123
+ _ = coderdtest .AwaitTemplateVersionJobCompleted (t ,client ,version2 .ID )
124
+
125
+ ctx := testutil .Context (t ,testutil .WaitShort )
126
+ err := client .UpdateActiveTemplateVersion (ctx ,template .ID , codersdk.UpdateActiveTemplateVersion {
127
+ ID :version2 .ID ,
128
+ })
129
+ require .NoError (t ,err ,"failed to update active template version" )
130
+
131
+ // Given: the workspace is in a stopped state.
132
+ coderdtest .MustTransitionWorkspace (t ,member ,ws .ID ,codersdk .WorkspaceTransitionStart ,codersdk .WorkspaceTransitionStop )
133
+
134
+ // Then: the workspace is marked as 'outdated'
135
+ ws ,err = member .WorkspaceByOwnerAndName (ctx ,codersdk .Me ,"my-workspace" , codersdk.WorkspaceOptions {})
136
+ require .NoError (t ,err ,"member failed to get workspace they themselves own" )
137
+ require .True (t ,ws .Outdated ,"workspace must be outdated after template version update" )
138
+
139
+ // When: the workspace is updated
140
+ inv ,root := clitest .New (t ,"update" ,ws .Name )
141
+ clitest .SetupConfig (t ,member ,root )
142
+
143
+ err = inv .Run ()
144
+ require .NoError (t ,err ,"update command failed" )
145
+
146
+ // Then: the workspace is no longer 'outdated'
147
+ ws ,err = member .WorkspaceByOwnerAndName (ctx ,codersdk .Me ,"my-workspace" , codersdk.WorkspaceOptions {})
148
+ require .NoError (t ,err ,"member failed to get workspace they themselves own after update" )
149
+ require .Equal (t ,version2 .ID .String (),ws .LatestBuild .TemplateVersionID .String (),"workspace must have latest template version after update" )
150
+ require .False (t ,ws .Outdated ,"workspace must not be outdated after update" )
151
+
152
+ // Then: the workspace must have been started with the new template version
153
+ require .Equal (t ,codersdk .WorkspaceTransitionStart ,ws .LatestBuild .Transition ,"latest build must be a start transition" )
154
+ // Then: we expect 3 builds, as we manually stopped the workspace.
155
+ require .Equal (t ,int32 (3 ),ws .LatestBuild .BuildNumber ,"workspace must have 3 builds after update" )
156
+ })
99
157
}
100
158
101
159
func TestUpdateWithRichParameters (t * testing.T ) {