@@ -302,6 +302,57 @@ func TestDynamicParameterBuild(t *testing.T) {
302
302
require .ErrorContains (t ,err ,"Number must be between 0 and 10" )
303
303
})
304
304
})
305
+
306
+ t .Run ("ImmutableValidation" ,func (t * testing.T ) {
307
+ t .Parallel ()
308
+
309
+ // NewImmutable tests the case where a new immutable parameter is added to a template
310
+ // after a workspace has been created with an older version of the template.
311
+ // The test tries to delete the workspace, which should succeed.
312
+ t .Run ("NewImmutable" ,func (t * testing.T ) {
313
+ t .Parallel ()
314
+
315
+ ctx := testutil .Context (t ,testutil .WaitShort )
316
+ // Start with a new template that has 0 parameters
317
+ empty ,_ := coderdtest .DynamicParameterTemplate (t ,templateAdmin ,orgID , coderdtest.DynamicParameterTemplateParams {
318
+ MainTF :string (must (os .ReadFile ("testdata/parameters/none/main.tf" ))),
319
+ })
320
+
321
+ // Create the workspace with 0 parameters
322
+ wrk ,err := templateAdmin .CreateUserWorkspace (ctx ,codersdk .Me , codersdk.CreateWorkspaceRequest {
323
+ TemplateID :empty .ID ,
324
+ Name :coderdtest .RandomUsername (t ),
325
+ RichParameterValues : []codersdk.WorkspaceBuildParameter {},
326
+ })
327
+ require .NoError (t ,err )
328
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t ,templateAdmin ,wrk .LatestBuild .ID )
329
+
330
+ // Update the template with a new immutable parameter
331
+ _ ,immutable := coderdtest .DynamicParameterTemplate (t ,templateAdmin ,orgID , coderdtest.DynamicParameterTemplateParams {
332
+ MainTF :string (must (os .ReadFile ("testdata/parameters/immutable/main.tf" ))),
333
+ TemplateID :empty .ID ,
334
+ })
335
+
336
+ bld ,err := templateAdmin .CreateWorkspaceBuild (ctx ,wrk .ID , codersdk.CreateWorkspaceBuildRequest {
337
+ TemplateVersionID :immutable .ID ,// Use the new template version with the immutable parameter
338
+ Transition :codersdk .WorkspaceTransitionDelete ,
339
+ DryRun :false ,
340
+ })
341
+ require .NoError (t ,err )
342
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t ,templateAdmin ,bld .ID )
343
+
344
+ // Verify the immutable parameter is set on the workspace build
345
+ params ,err := templateAdmin .WorkspaceBuildParameters (ctx ,bld .ID )
346
+ require .NoError (t ,err )
347
+ require .Len (t ,params ,1 )
348
+ require .Equal (t ,"Hello World" ,params [0 ].Value )
349
+
350
+ // Verify the workspace is deleted
351
+ deleted ,err := templateAdmin .DeletedWorkspace (ctx ,wrk .ID )
352
+ require .NoError (t ,err )
353
+ require .Equal (t ,wrk .ID ,deleted .ID ,"workspace should be deleted" )
354
+ })
355
+ })
305
356
}
306
357
307
358
// TestDynamicParameterTemplate uses a template with some dynamic elements, and