@@ -302,6 +302,57 @@ func TestDynamicParameterBuild(t *testing.T) {
302302require .ErrorContains (t ,err ,"Number must be between 0 and 10" )
303303})
304304})
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+ })
305356}
306357
307358// TestDynamicParameterTemplate uses a template with some dynamic elements, and