Skip to content

Commit 19ec747

Browse files
committed
fix: add some more thorough testing for preset workspace creation
1 parent 979687c commit 19ec747

File tree

1 file changed

+244
-34
lines changed

1 file changed

+244
-34
lines changed

coderd/workspaces_test.go

+244-34
Original file line numberDiff line numberDiff line change
@@ -426,47 +426,257 @@ func TestWorkspace(t *testing.T) {
426426

427427
t.Run("TemplateVersionPreset", func(t *testing.T) {
428428
t.Parallel()
429-
client, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
430-
user := coderdtest.CreateFirstUser(t, client)
431-
authz := coderdtest.AssertRBAC(t, api, client)
432-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
433-
Parse: echo.ParseComplete,
434-
ProvisionPlan: []*proto.Response{{
435-
Type: &proto.Response_Plan{
436-
Plan: &proto.PlanComplete{
437-
Presets: []*proto.Preset{{
438-
Name: "test",
439-
}},
429+
430+
testCases := []struct {
431+
name string
432+
presets []*proto.Preset
433+
expectedCount int
434+
selectedPresetIndex int // Index of the preset to use, or -1 if no preset should be used
435+
}{
436+
{
437+
name: "No Presets",
438+
presets: []*proto.Preset{},
439+
expectedCount: 0,
440+
selectedPresetIndex: -1,
441+
},
442+
{
443+
name: "Single Preset - No Parameters",
444+
presets: []*proto.Preset{{
445+
Name: "test",
446+
Parameters: []*proto.PresetParameter{
447+
{Name: "param1", Value: "value1"},
448+
{Name: "param2", Value: "value2"},
449+
},
450+
}},
451+
expectedCount: 1,
452+
selectedPresetIndex: 0,
453+
},
454+
{
455+
name: "Single Preset - With Parameters",
456+
presets: []*proto.Preset{{
457+
Name: "test",
458+
Parameters: []*proto.PresetParameter{
459+
{Name: "param1", Value: "value1"},
460+
{Name: "param2", Value: "value2"},
440461
},
462+
}},
463+
expectedCount: 1,
464+
selectedPresetIndex: 0,
465+
},
466+
{
467+
name: "Multiple Presets - No Parameters",
468+
presets: []*proto.Preset{
469+
{Name: "test1"},
470+
{Name: "test2"},
471+
{Name: "test3"},
441472
},
442-
}},
443-
ProvisionApply: echo.ApplyComplete,
444-
})
445-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
446-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
473+
expectedCount: 3,
474+
selectedPresetIndex: 0,
475+
},
476+
{
477+
name: "Multiple Presets - First Has Parameters",
478+
presets: []*proto.Preset{
479+
{
480+
Name: "test1",
481+
Parameters: []*proto.PresetParameter{
482+
{Name: "param1", Value: "value1"},
483+
{Name: "param2", Value: "value2"},
484+
},
485+
},
486+
{Name: "test2"},
487+
{Name: "test3"},
488+
},
489+
expectedCount: 3,
490+
selectedPresetIndex: 0,
491+
},
492+
{
493+
name: "Multiple Presets - Middle Has Parameters",
494+
presets: []*proto.Preset{
495+
{Name: "test1"},
496+
{
497+
Name: "test2",
498+
Parameters: []*proto.PresetParameter{
499+
{Name: "param1", Value: "value1"},
500+
{Name: "param2", Value: "value2"},
501+
},
502+
},
503+
{Name: "test3"},
504+
},
505+
expectedCount: 3,
506+
selectedPresetIndex: 1,
507+
},
508+
{
509+
name: "Multiple Presets - Last Has Parameters",
510+
presets: []*proto.Preset{
511+
{Name: "test1"},
512+
{Name: "test2"},
513+
{
514+
Name: "test3",
515+
Parameters: []*proto.PresetParameter{
516+
{Name: "param1", Value: "value1"},
517+
{Name: "param2", Value: "value2"},
518+
},
519+
},
520+
},
521+
expectedCount: 3,
522+
selectedPresetIndex: 2,
523+
},
524+
{
525+
name: "Multiple Presets - All Have Parameters",
526+
presets: []*proto.Preset{
527+
{
528+
Name: "test1",
529+
Parameters: []*proto.PresetParameter{
530+
{Name: "param1", Value: "value1"},
531+
},
532+
},
533+
{
534+
Name: "test2",
535+
Parameters: []*proto.PresetParameter{
536+
{Name: "param2", Value: "value2"},
537+
},
538+
},
539+
{
540+
Name: "test3",
541+
Parameters: []*proto.PresetParameter{
542+
{Name: "param3", Value: "value3"},
543+
},
544+
},
545+
},
546+
expectedCount: 3,
547+
selectedPresetIndex: 1,
548+
},
549+
{
550+
name: "Multiple Presets - With Parameters But Not Used",
551+
presets: []*proto.Preset{
552+
{
553+
Name: "test1",
554+
Parameters: []*proto.PresetParameter{
555+
{Name: "param1", Value: "value1"},
556+
},
557+
},
558+
{
559+
Name: "test2",
560+
Parameters: []*proto.PresetParameter{
561+
{Name: "param2", Value: "value2"},
562+
},
563+
},
564+
},
565+
expectedCount: 2,
566+
selectedPresetIndex: -1,
567+
},
568+
}
447569

448-
ctx := testutil.Context(t, testutil.WaitLong)
570+
for _, tc := range testCases {
571+
tc := tc // Capture range variable
572+
t.Run(tc.name, func(t *testing.T) {
573+
t.Parallel()
449574

450-
presets, err := client.TemplateVersionPresets(ctx, version.ID)
451-
require.NoError(t, err)
452-
require.Equal(t, 1, len(presets))
453-
require.Equal(t, "test", presets[0].Name)
575+
client, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
576+
user := coderdtest.CreateFirstUser(t, client)
577+
authz := coderdtest.AssertRBAC(t, api, client)
454578

455-
workspace := coderdtest.CreateWorkspace(t, client, template.ID, func(request *codersdk.CreateWorkspaceRequest) {
456-
request.TemplateVersionPresetID = presets[0].ID
457-
})
579+
// Create a plan response with the specified presets
580+
planResponse := &proto.Response{
581+
Type: &proto.Response_Plan{
582+
Plan: &proto.PlanComplete{
583+
Presets: tc.presets,
584+
},
585+
},
586+
}
458587

459-
authz.Reset() // Reset all previous checks done in setup.
460-
ws, err := client.Workspace(ctx, workspace.ID)
461-
authz.AssertChecked(t, policy.ActionRead, ws)
462-
require.NoError(t, err)
463-
require.Equal(t, user.UserID, ws.LatestBuild.InitiatorID)
464-
require.Equal(t, codersdk.BuildReasonInitiator, ws.LatestBuild.Reason)
465-
require.Equal(t, presets[0].ID, *ws.LatestBuild.TemplateVersionPresetID)
588+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
589+
Parse: echo.ParseComplete,
590+
ProvisionPlan: []*proto.Response{planResponse},
591+
ProvisionApply: echo.ApplyComplete,
592+
})
593+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
594+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
466595

467-
org, err := client.Organization(ctx, ws.OrganizationID)
468-
require.NoError(t, err)
469-
require.Equal(t, ws.OrganizationName, org.Name)
596+
ctx := testutil.Context(t, testutil.WaitLong)
597+
598+
// Check presets
599+
presets, err := client.TemplateVersionPresets(ctx, version.ID)
600+
require.NoError(t, err)
601+
require.Equal(t, tc.expectedCount, len(presets))
602+
603+
if tc.expectedCount > 0 {
604+
// Verify preset names and parameters
605+
for i, preset := range presets {
606+
require.Equal(t, tc.presets[i].Name, preset.Name)
607+
608+
// Check if the preset should have parameters
609+
if tc.presets[i].Parameters != nil {
610+
// Verify that the preset has the expected parameters
611+
for _, param := range tc.presets[i].Parameters {
612+
found := false
613+
for _, presetParam := range preset.Parameters {
614+
if param.Name == presetParam.Name {
615+
require.Equal(t, param.Value, presetParam.Value,
616+
"Parameter %s should have value %s", param.Name, param.Value)
617+
found = true
618+
break
619+
}
620+
}
621+
require.True(t, found, "Parameter %s should be present in preset", param.Name)
622+
}
623+
}
624+
}
625+
}
626+
627+
// Create workspace with or without preset
628+
var workspace codersdk.Workspace
629+
if tc.selectedPresetIndex >= 0 && tc.expectedCount > 0 {
630+
// Use the selected preset
631+
selectedIndex := tc.selectedPresetIndex
632+
if selectedIndex >= len(presets) {
633+
selectedIndex = 0 // Fallback to first preset if index is out of bounds
634+
}
635+
636+
workspace = coderdtest.CreateWorkspace(t, client, template.ID, func(request *codersdk.CreateWorkspaceRequest) {
637+
request.TemplateVersionPresetID = presets[selectedIndex].ID
638+
})
639+
} else {
640+
workspace = coderdtest.CreateWorkspace(t, client, template.ID)
641+
}
642+
643+
// Verify workspace details
644+
authz.Reset() // Reset all previous checks done in setup.
645+
ws, err := client.Workspace(ctx, workspace.ID)
646+
authz.AssertChecked(t, policy.ActionRead, ws)
647+
require.NoError(t, err)
648+
require.Equal(t, user.UserID, ws.LatestBuild.InitiatorID)
649+
require.Equal(t, codersdk.BuildReasonInitiator, ws.LatestBuild.Reason)
650+
651+
// Check preset ID if expected
652+
if tc.selectedPresetIndex >= 0 && tc.expectedCount > 0 {
653+
require.NotNil(t, ws.LatestBuild.TemplateVersionPresetID)
654+
655+
// Use the selected preset index
656+
selectedIndex := tc.selectedPresetIndex
657+
if selectedIndex >= len(presets) {
658+
selectedIndex = 0 // Fallback to first preset if index is out of bounds
659+
}
660+
661+
require.Equal(t, presets[selectedIndex].ID, *ws.LatestBuild.TemplateVersionPresetID)
662+
663+
// If the selected preset has parameters, verify they were applied
664+
if tc.presets[selectedIndex].Parameters != nil {
665+
// This would require additional verification based on how parameters
666+
// are stored in the workspace. For now, we'll just log that we checked.
667+
t.Logf("Selected preset %s has parameters that should be applied to the workspace",
668+
tc.presets[selectedIndex].Name)
669+
}
670+
} else {
671+
require.Nil(t, ws.LatestBuild.TemplateVersionPresetID)
672+
}
673+
674+
// Verify organization
675+
org, err := client.Organization(ctx, ws.OrganizationID)
676+
require.NoError(t, err)
677+
require.Equal(t, ws.OrganizationName, org.Name)
678+
})
679+
}
470680
})
471681
}
472682

0 commit comments

Comments
 (0)