Skip to content

Commit f80d838

Browse files
committed
chore: add unit test for static values
1 parent 6299f43 commit f80d838

File tree

3 files changed

+101
-119
lines changed

3 files changed

+101
-119
lines changed

coderd/parameters_test.go

Lines changed: 98 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import (
1010
"github.com/coder/coder/v2/coderd/coderdtest"
1111
"github.com/coder/coder/v2/coderd/rbac"
1212
"github.com/coder/coder/v2/codersdk"
13+
"github.com/coder/coder/v2/codersdk/wsjson"
1314
"github.com/coder/coder/v2/provisioner/echo"
1415
"github.com/coder/coder/v2/provisioner/terraform"
16+
provProto "github.com/coder/coder/v2/provisionerd/proto"
1517
"github.com/coder/coder/v2/provisionersdk/proto"
1618
"github.com/coder/coder/v2/testutil"
1719
"github.com/coder/websocket"
@@ -135,45 +137,26 @@ func TestDynamicParametersOwnerSSHPublicKey(t *testing.T) {
135137
require.Equal(t, sshKey.PublicKey, preview.Parameters[0].Value.Value.AsString())
136138
}
137139

138-
func TestDynamicParametersWithTerraformModules(t *testing.T) {
140+
func TestDynamicParametersWithTerraformValues(t *testing.T) {
139141
t.Parallel()
140142

141-
t.Run("OK", func(t *testing.T) {
142-
cfg := coderdtest.DeploymentValues(t)
143-
cfg.Experiments = []string{string(codersdk.ExperimentDynamicParameters)}
144-
ownerClient, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true, DeploymentValues: cfg})
145-
defer func() {
146-
require.Equal(t, 0, api.FileCache.Count(), "file cache released all files")
147-
}()
148-
owner := coderdtest.CreateFirstUser(t, ownerClient)
149-
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.RoleTemplateAdmin())
150-
143+
t.Run("OK_Modules", func(t *testing.T) {
151144
dynamicParametersTerraformSource, err := os.ReadFile("testdata/parameters/modules/main.tf")
152145
require.NoError(t, err)
146+
153147
modulesArchive, err := terraform.GetModulesArchive(os.DirFS("testdata/parameters/modules"))
154148
require.NoError(t, err)
155149

156-
files := echo.WithExtraFiles(map[string][]byte{
157-
"main.tf": dynamicParametersTerraformSource,
150+
setup := setupDynamicParamsTest(t, setupDynamicParamsTestParams{
151+
provisionerDaemonVersion: provProto.CurrentVersion.String(),
152+
mainTF: dynamicParametersTerraformSource,
153+
modulesArchive: modulesArchive,
154+
plan: nil,
155+
static: nil,
158156
})
159-
files.ProvisionPlan = []*proto.Response{{
160-
Type: &proto.Response_Plan{
161-
Plan: &proto.PlanComplete{
162-
Plan: []byte("{}"),
163-
ModuleFiles: modulesArchive,
164-
},
165-
},
166-
}}
167-
168-
version := coderdtest.CreateTemplateVersion(t, templateAdmin, owner.OrganizationID, files)
169-
coderdtest.AwaitTemplateVersionJobCompleted(t, templateAdmin, version.ID)
170-
_ = coderdtest.CreateTemplate(t, templateAdmin, owner.OrganizationID, version.ID)
171157

172158
ctx := testutil.Context(t, testutil.WaitShort)
173-
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, templateAdminUser.ID, version.ID)
174-
require.NoError(t, err)
175-
defer stream.Close(websocket.StatusGoingAway)
176-
159+
stream := setup.stream
177160
previews := stream.Chan()
178161

179162
// Should see the output of the module represented
@@ -187,115 +170,118 @@ func TestDynamicParametersWithTerraformModules(t *testing.T) {
187170
require.Equal(t, "CL", preview.Parameters[0].Value.AsString())
188171
})
189172

173+
// OldProvisioners use the static parameters in the dynamic param flow
190174
t.Run("OldProvisioner", func(t *testing.T) {
191-
cfg := coderdtest.DeploymentValues(t)
192-
cfg.Experiments = []string{string(codersdk.ExperimentDynamicParameters)}
193-
ownerClient, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{
194-
ProvisionerDaemonVersion: "1.4", // Old provisioner daemon
195-
IncludeProvisionerDaemon: true,
196-
DeploymentValues: cfg,
197-
})
198-
defer func() {
199-
require.Equal(t, 0, api.FileCache.Count(), "file cache released all files")
200-
}()
201-
202-
owner := coderdtest.CreateFirstUser(t, ownerClient)
203-
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.RoleTemplateAdmin())
204-
205-
dynamicParametersTerraformSource, err := os.ReadFile("testdata/parameters/modules/main.tf")
206-
require.NoError(t, err)
207-
208-
files := echo.WithExtraFiles(map[string][]byte{
209-
"main.tf": dynamicParametersTerraformSource,
210-
})
211-
files.ProvisionPlan = []*proto.Response{{
212-
Type: &proto.Response_Plan{
213-
Plan: &proto.PlanComplete{
214-
Plan: []byte("{}"),
215-
ModuleFiles: nil,
216-
Parameters: []*proto.RichParameter{
175+
setup := setupDynamicParamsTest(t, setupDynamicParamsTestParams{
176+
provisionerDaemonVersion: "1.4",
177+
mainTF: nil,
178+
modulesArchive: nil,
179+
plan: nil,
180+
static: []*proto.RichParameter{
181+
{
182+
Name: "jetbrains_ide",
183+
Type: "string",
184+
DefaultValue: "PS",
185+
Icon: "",
186+
Options: []*proto.RichParameterOption{
217187
{
218-
Name: "jetbrains_ide",
219-
Type: "string",
220-
DefaultValue: "CL",
221-
Icon: "",
222-
Options: []*proto.RichParameterOption{
223-
{
224-
Name: "Clion",
225-
Description: "",
226-
Value: "CL",
227-
Icon: "",
228-
},
229-
{
230-
Name: "Golang",
231-
Description: "",
232-
Value: "GO",
233-
Icon: "",
234-
},
235-
},
236-
ValidationRegex: "[CG][LO]",
237-
ValidationError: "Regex check",
188+
Name: "PHPStorm",
189+
Description: "",
190+
Value: "PS",
191+
Icon: "",
192+
},
193+
{
194+
Name: "Golang",
195+
Description: "",
196+
Value: "GO",
197+
Icon: "",
238198
},
239199
},
200+
ValidationRegex: "[PG][SO]",
201+
ValidationError: "Regex check",
240202
},
241203
},
242-
}}
243-
244-
version := coderdtest.CreateTemplateVersion(t, templateAdmin, owner.OrganizationID, files)
245-
coderdtest.AwaitTemplateVersionJobCompleted(t, templateAdmin, version.ID)
246-
_ = coderdtest.CreateTemplate(t, templateAdmin, owner.OrganizationID, version.ID)
204+
})
247205

248206
ctx := testutil.Context(t, testutil.WaitShort)
249-
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, templateAdminUser.ID, version.ID)
250-
require.NoError(t, err)
251-
defer stream.Close(websocket.StatusGoingAway)
252-
207+
stream := setup.stream
253208
previews := stream.Chan()
254209

255-
// Should see the output of the module represented
210+
// Assert the initial state
256211
preview := testutil.RequireReceive(ctx, t, previews)
257-
require.Equal(t, -1, preview.ID)
258-
require.Empty(t, preview.Diagnostics)
259-
212+
diagCount := len(preview.Diagnostics)
213+
require.Equal(t, 1, diagCount)
214+
require.Contains(t, preview.Diagnostics[0].Summary, "classic creation flow")
260215
require.Len(t, preview.Parameters, 1)
261216
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
262217
require.True(t, preview.Parameters[0].Value.Valid())
263-
require.Equal(t, "CL", preview.Parameters[0].Value.AsString())
264-
})
218+
require.Equal(t, "PS", preview.Parameters[0].Value.AsString())
219+
220+
// Test some inputs
221+
for _, exp := range []string{"PS", "GO", "Invalid"} {
222+
err := stream.Send(codersdk.DynamicParametersRequest{
223+
ID: 1,
224+
Inputs: map[string]string{
225+
"jetbrains_ide": exp,
226+
},
227+
})
228+
require.NoError(t, err)
229+
230+
preview := testutil.RequireReceive(ctx, t, previews)
231+
diagCount := len(preview.Diagnostics)
232+
require.Equal(t, 1, diagCount)
233+
require.Contains(t, preview.Diagnostics[0].Summary, "classic creation flow")
234+
235+
require.Len(t, preview.Parameters, 1)
236+
if exp == "Invalid" { // Try an invalid option
237+
require.Len(t, preview.Parameters[0].Diagnostics, 1)
238+
} else {
239+
require.Len(t, preview.Parameters[0].Diagnostics, 0)
240+
}
241+
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
242+
require.True(t, preview.Parameters[0].Value.Valid())
243+
require.Equal(t, exp, preview.Parameters[0].Value.AsString())
244+
}
265245

246+
})
266247
}
267248

268-
type dynamicParamsTestSetupParams struct {
249+
type setupDynamicParamsTestParams struct {
250+
provisionerDaemonVersion string
251+
mainTF []byte
252+
modulesArchive []byte
253+
plan []byte
254+
255+
static []*proto.RichParameter
269256
}
270257

271258
type dynamicParamsTest struct {
272259
client *codersdk.Client
273260
api *coderd.API
261+
stream *wsjson.Stream[codersdk.DynamicParametersResponse, codersdk.DynamicParametersRequest]
274262
}
275263

276-
func dynamicParamsTestSetup(t *testing.T) dynamicParamsTest {
264+
func setupDynamicParamsTest(t *testing.T, args setupDynamicParamsTestParams) dynamicParamsTest {
277265
cfg := coderdtest.DeploymentValues(t)
278266
cfg.Experiments = []string{string(codersdk.ExperimentDynamicParameters)}
279-
ownerClient, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{IncludeProvisionerDaemon: true, DeploymentValues: cfg})
280-
defer func() {
281-
require.Equal(t, 0, api.FileCache.Count(), "file cache released all files")
282-
}()
267+
ownerClient, _, api := coderdtest.NewWithAPI(t, &coderdtest.Options{
268+
IncludeProvisionerDaemon: true,
269+
ProvisionerDaemonVersion: args.provisionerDaemonVersion,
270+
DeploymentValues: cfg,
271+
})
272+
283273
owner := coderdtest.CreateFirstUser(t, ownerClient)
284274
templateAdmin, templateAdminUser := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID, rbac.RoleTemplateAdmin())
285275

286-
dynamicParametersTerraformSource, err := os.ReadFile("testdata/parameters/modules/main.tf")
287-
require.NoError(t, err)
288-
modulesArchive, err := terraform.GetModulesArchive(os.DirFS("testdata/parameters/modules"))
289-
require.NoError(t, err)
290-
291276
files := echo.WithExtraFiles(map[string][]byte{
292-
"main.tf": dynamicParametersTerraformSource,
277+
"main.tf": args.mainTF,
293278
})
294279
files.ProvisionPlan = []*proto.Response{{
295280
Type: &proto.Response_Plan{
296281
Plan: &proto.PlanComplete{
297-
Plan: []byte("{}"),
298-
ModuleFiles: modulesArchive,
282+
Plan: args.plan,
283+
ModuleFiles: args.modulesArchive,
284+
Parameters: args.static,
299285
},
300286
},
301287
}}
@@ -307,22 +293,18 @@ func dynamicParamsTestSetup(t *testing.T) dynamicParamsTest {
307293
ctx := testutil.Context(t, testutil.WaitShort)
308294
stream, err := templateAdmin.TemplateVersionDynamicParameters(ctx, templateAdminUser.ID, version.ID)
309295
require.NoError(t, err)
310-
defer stream.Close(websocket.StatusGoingAway)
311296

312-
previews := stream.Chan()
313-
314-
// Should see the output of the module represented
315-
preview := testutil.RequireReceive(ctx, t, previews)
316-
require.Equal(t, -1, preview.ID)
317-
require.Empty(t, preview.Diagnostics)
318-
319-
require.Len(t, preview.Parameters, 1)
320-
require.Equal(t, "jetbrains_ide", preview.Parameters[0].Name)
321-
require.True(t, preview.Parameters[0].Value.Valid())
322-
require.Equal(t, "CL", preview.Parameters[0].Value.AsString())
297+
t.Cleanup(func() {
298+
_ = stream.Close(websocket.StatusGoingAway)
299+
// Cache should always have 0 files when the only stream is closed
300+
require.Eventually(t, func() bool {
301+
return api.FileCache.Count() == 0
302+
}, testutil.WaitShort/5, testutil.IntervalMedium)
303+
})
323304

324305
return dynamicParamsTest{
325306
client: ownerClient,
307+
stream: stream,
326308
api: api,
327309
}
328310
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ require (
485485

486486
require (
487487
github.com/anthropics/anthropic-sdk-go v0.2.0-beta.3
488-
github.com/coder/preview v0.0.2-0.20250509141204-fc9484dbe506
488+
github.com/coder/preview v0.0.2-0.20250510235314-66630669ff6f
489489
github.com/fsnotify/fsnotify v1.9.0
490490
github.com/kylecarbs/aisdk-go v0.0.8
491491
github.com/mark3labs/mcp-go v0.27.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -911,8 +911,8 @@ github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048 h1:3jzYUlGH7ZELIH4XggX
911911
github.com/coder/pq v1.10.5-0.20240813183442-0c420cb5a048/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
912912
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs=
913913
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc=
914-
github.com/coder/preview v0.0.2-0.20250509141204-fc9484dbe506 h1:rQ7Queq1IZwEBjEIk9EJsVx7XHQ+Rvo2h72/A88BnPg=
915-
github.com/coder/preview v0.0.2-0.20250509141204-fc9484dbe506/go.mod h1:wXVvHiSmZv/7Q+Ug5I0B45TGM2U+YAjY4K3aB/6+KKo=
914+
github.com/coder/preview v0.0.2-0.20250510235314-66630669ff6f h1:Q1AcLBpRRR8rf/H+GxcJaZ5Ox4UeIRkDgc6wvvmOJAo=
915+
github.com/coder/preview v0.0.2-0.20250510235314-66630669ff6f/go.mod h1:GfkwIv5gQLpL01qeGU1/YoxoFtt5trzCqnWZLo77clU=
916916
github.com/coder/quartz v0.1.3 h1:hA2nI8uUA2fNN9uhXv2I4xZD4aHkA7oH3g2t03v4xf8=
917917
github.com/coder/quartz v0.1.3/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA=
918918
github.com/coder/retry v1.5.1 h1:iWu8YnD8YqHs3XwqrqsjoBTAVqT9ml6z9ViJ2wlMiqc=

0 commit comments

Comments
 (0)