Skip to content

Commit 510a1b0

Browse files
committed
Move parameter validation tests to richparameters_test.go
Signed-off-by: Spike Curtis <spike@coder.com>
1 parent cee21de commit 510a1b0

File tree

3 files changed

+152
-207
lines changed

3 files changed

+152
-207
lines changed

coderd/workspacebuilds_test.go

Lines changed: 0 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -637,210 +637,6 @@ func TestWorkspaceBuildStatus(t *testing.T) {
637637
require.EqualValues(t, codersdk.WorkspaceStatusDeleted, workspace.LatestBuild.Status)
638638
}
639639

640-
func TestWorkspaceBuildValidateRichParameters(t *testing.T) {
641-
t.Parallel()
642-
643-
const (
644-
stringParameterName = "string_parameter"
645-
stringParameterValue = "abc"
646-
647-
numberParameterName = "number_parameter"
648-
numberParameterValue = "7"
649-
650-
boolParameterName = "bool_parameter"
651-
boolParameterValue = "true"
652-
653-
listOfStringsParameterName = "list_of_strings_parameter"
654-
listOfStringsParameterValue = `["a","b","c"]`
655-
)
656-
657-
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
658-
{Name: stringParameterName, Value: stringParameterValue},
659-
{Name: numberParameterName, Value: numberParameterValue},
660-
{Name: boolParameterName, Value: boolParameterValue},
661-
{Name: listOfStringsParameterName, Value: listOfStringsParameterValue},
662-
}
663-
664-
prepareEchoResponses := func(richParameters []*proto.RichParameter) *echo.Responses {
665-
return &echo.Responses{
666-
Parse: echo.ParseComplete,
667-
ProvisionPlan: []*proto.Provision_Response{
668-
{
669-
Type: &proto.Provision_Response_Complete{
670-
Complete: &proto.Provision_Complete{
671-
Parameters: richParameters,
672-
},
673-
},
674-
},
675-
},
676-
ProvisionApply: []*proto.Provision_Response{
677-
{
678-
Type: &proto.Provision_Response_Complete{
679-
Complete: &proto.Provision_Complete{},
680-
},
681-
},
682-
},
683-
}
684-
}
685-
686-
t.Run("NoValidation", func(t *testing.T) {
687-
t.Parallel()
688-
689-
richParameters := []*proto.RichParameter{
690-
{Name: stringParameterName, Type: "string", Mutable: true},
691-
{Name: numberParameterName, Type: "number", Mutable: true},
692-
{Name: boolParameterName, Type: "bool", Mutable: true},
693-
}
694-
695-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
696-
user := coderdtest.CreateFirstUser(t, client)
697-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(richParameters))
698-
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
699-
700-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
701-
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
702-
cwr.RichParameterValues = initialBuildParameters
703-
})
704-
705-
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
706-
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
707-
708-
// Update build parameters
709-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
710-
defer cancel()
711-
712-
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
713-
{Name: numberParameterName, Value: "42"},
714-
}
715-
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
716-
Transition: codersdk.WorkspaceTransitionStart,
717-
RichParameterValues: nextBuildParameters,
718-
})
719-
require.NoError(t, err)
720-
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
721-
722-
_, err = client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
723-
require.NoError(t, err)
724-
})
725-
726-
t.Run("Validation", func(t *testing.T) {
727-
t.Parallel()
728-
729-
numberRichParameters := []*proto.RichParameter{
730-
{Name: stringParameterName, Type: "string", Mutable: true},
731-
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10},
732-
{Name: boolParameterName, Type: "bool", Mutable: true},
733-
}
734-
735-
monotonicIncreasingNumberRichParameters := []*proto.RichParameter{
736-
{Name: stringParameterName, Type: "string", Mutable: true},
737-
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10, ValidationMonotonic: "increasing"},
738-
{Name: boolParameterName, Type: "bool", Mutable: true},
739-
}
740-
741-
monotonicDecreasingNumberRichParameters := []*proto.RichParameter{
742-
{Name: stringParameterName, Type: "string", Mutable: true},
743-
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10, ValidationMonotonic: "decreasing"},
744-
{Name: boolParameterName, Type: "bool", Mutable: true},
745-
}
746-
747-
stringRichParameters := []*proto.RichParameter{
748-
{Name: stringParameterName, Type: "string", Mutable: true},
749-
{Name: numberParameterName, Type: "number", Mutable: true},
750-
{Name: boolParameterName, Type: "bool", Mutable: true},
751-
}
752-
753-
boolRichParameters := []*proto.RichParameter{
754-
{Name: stringParameterName, Type: "string", Mutable: true},
755-
{Name: numberParameterName, Type: "number", Mutable: true},
756-
{Name: boolParameterName, Type: "bool", Mutable: true},
757-
}
758-
759-
regexRichParameters := []*proto.RichParameter{
760-
{Name: stringParameterName, Type: "string", Mutable: true, ValidationRegex: "^[a-z]+$", ValidationError: "this is error"},
761-
{Name: numberParameterName, Type: "number", Mutable: true},
762-
{Name: boolParameterName, Type: "bool", Mutable: true},
763-
}
764-
765-
listOfStringsRichParameters := []*proto.RichParameter{
766-
{Name: listOfStringsParameterName, Type: "list(string)", Mutable: true},
767-
}
768-
769-
tests := []struct {
770-
parameterName string
771-
value string
772-
valid bool
773-
richParameters []*proto.RichParameter
774-
}{
775-
{numberParameterName, "2", false, numberRichParameters},
776-
{numberParameterName, "3", true, numberRichParameters},
777-
{numberParameterName, "10", true, numberRichParameters},
778-
{numberParameterName, "11", false, numberRichParameters},
779-
780-
{numberParameterName, "6", false, monotonicIncreasingNumberRichParameters},
781-
{numberParameterName, "7", true, monotonicIncreasingNumberRichParameters},
782-
{numberParameterName, "8", true, monotonicIncreasingNumberRichParameters},
783-
784-
{numberParameterName, "6", true, monotonicDecreasingNumberRichParameters},
785-
{numberParameterName, "7", true, monotonicDecreasingNumberRichParameters},
786-
{numberParameterName, "8", false, monotonicDecreasingNumberRichParameters},
787-
788-
{stringParameterName, "", true, stringRichParameters},
789-
{stringParameterName, "foobar", true, stringRichParameters},
790-
791-
{stringParameterName, "abcd", true, regexRichParameters},
792-
{stringParameterName, "abcd1", false, regexRichParameters},
793-
794-
{boolParameterName, "true", true, boolRichParameters},
795-
{boolParameterName, "false", true, boolRichParameters},
796-
{boolParameterName, "cat", false, boolRichParameters},
797-
798-
{listOfStringsParameterName, `[]`, true, listOfStringsRichParameters},
799-
{listOfStringsParameterName, `["aa"]`, true, listOfStringsRichParameters},
800-
{listOfStringsParameterName, `["aa]`, false, listOfStringsRichParameters},
801-
{listOfStringsParameterName, ``, false, listOfStringsRichParameters},
802-
}
803-
804-
for _, tc := range tests {
805-
tc := tc
806-
t.Run(tc.parameterName+"-"+tc.value, func(t *testing.T) {
807-
t.Parallel()
808-
809-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
810-
user := coderdtest.CreateFirstUser(t, client)
811-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(tc.richParameters))
812-
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
813-
814-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
815-
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
816-
cwr.RichParameterValues = initialBuildParameters
817-
})
818-
819-
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
820-
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
821-
822-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
823-
defer cancel()
824-
825-
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
826-
{Name: tc.parameterName, Value: tc.value},
827-
}
828-
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
829-
Transition: codersdk.WorkspaceTransitionStart,
830-
RichParameterValues: nextBuildParameters,
831-
})
832-
833-
if tc.valid {
834-
require.NoError(t, err)
835-
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
836-
} else {
837-
require.Error(t, err)
838-
}
839-
})
840-
}
841-
})
842-
}
843-
844640
func TestMigrateLegacyToRichParameters(t *testing.T) {
845641
t.Parallel()
846642

coderd/wsbuilder/wsbuilder.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,6 @@ func (b *Builder) getLastBuild() (*database.WorkspaceBuild, error) {
486486
return nil, *b.lastBuildErr
487487
}
488488
bld, err := b.store.GetLatestWorkspaceBuildByWorkspaceID(b.ctx, b.workspace.ID)
489-
490489
if err != nil {
491490
err = xerrors.Errorf("get workspace %s last build: %w", b.workspace.ID, err)
492491
b.lastBuildErr = &err

codersdk/richparameters_test.go

Lines changed: 152 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package codersdk_test
22

33
import (
4-
"github.com/coder/coder/codersdk"
5-
"github.com/stretchr/testify/require"
64
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
8+
"github.com/coder/coder/codersdk"
79
)
810

911
func TestParameterResolver_ValidateResolve_New(t *testing.T) {
@@ -172,3 +174,151 @@ func TestParameterResolver_ValidateResolve_PreferRichOverLegacy(t *testing.T) {
172174
require.NoError(t, err)
173175
require.Equal(t, "7", v)
174176
}
177+
178+
func TestRichParameterValidation(t *testing.T) {
179+
t.Parallel()
180+
181+
const (
182+
stringParameterName = "string_parameter"
183+
stringParameterValue = "abc"
184+
185+
numberParameterName = "number_parameter"
186+
numberParameterValue = "7"
187+
188+
boolParameterName = "bool_parameter"
189+
boolParameterValue = "true"
190+
191+
listOfStringsParameterName = "list_of_strings_parameter"
192+
listOfStringsParameterValue = `["a","b","c"]`
193+
)
194+
195+
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
196+
{Name: stringParameterName, Value: stringParameterValue},
197+
{Name: numberParameterName, Value: numberParameterValue},
198+
{Name: boolParameterName, Value: boolParameterValue},
199+
{Name: listOfStringsParameterName, Value: listOfStringsParameterValue},
200+
}
201+
202+
t.Run("NoValidation", func(t *testing.T) {
203+
t.Parallel()
204+
205+
p := codersdk.TemplateVersionParameter{
206+
Name: numberParameterName, Type: "number", Mutable: true,
207+
}
208+
209+
uut := codersdk.ParameterResolver{
210+
Rich: initialBuildParameters,
211+
}
212+
v, err := uut.ValidateResolve(p, &codersdk.WorkspaceBuildParameter{
213+
Name: numberParameterName, Value: "42",
214+
})
215+
require.NoError(t, err)
216+
require.Equal(t, v, "42")
217+
})
218+
219+
t.Run("Validation", func(t *testing.T) {
220+
t.Parallel()
221+
222+
numberRichParameters := []codersdk.TemplateVersionParameter{
223+
{Name: stringParameterName, Type: "string", Mutable: true},
224+
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10},
225+
{Name: boolParameterName, Type: "bool", Mutable: true},
226+
}
227+
228+
monotonicIncreasingNumberRichParameters := []codersdk.TemplateVersionParameter{
229+
{Name: stringParameterName, Type: "string", Mutable: true},
230+
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10, ValidationMonotonic: "increasing"},
231+
{Name: boolParameterName, Type: "bool", Mutable: true},
232+
}
233+
234+
monotonicDecreasingNumberRichParameters := []codersdk.TemplateVersionParameter{
235+
{Name: stringParameterName, Type: "string", Mutable: true},
236+
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10, ValidationMonotonic: "decreasing"},
237+
{Name: boolParameterName, Type: "bool", Mutable: true},
238+
}
239+
240+
stringRichParameters := []codersdk.TemplateVersionParameter{
241+
{Name: stringParameterName, Type: "string", Mutable: true},
242+
{Name: numberParameterName, Type: "number", Mutable: true},
243+
{Name: boolParameterName, Type: "bool", Mutable: true},
244+
}
245+
246+
boolRichParameters := []codersdk.TemplateVersionParameter{
247+
{Name: stringParameterName, Type: "string", Mutable: true},
248+
{Name: numberParameterName, Type: "number", Mutable: true},
249+
{Name: boolParameterName, Type: "bool", Mutable: true},
250+
}
251+
252+
regexRichParameters := []codersdk.TemplateVersionParameter{
253+
{Name: stringParameterName, Type: "string", Mutable: true, ValidationRegex: "^[a-z]+$", ValidationError: "this is error"},
254+
{Name: numberParameterName, Type: "number", Mutable: true},
255+
{Name: boolParameterName, Type: "bool", Mutable: true},
256+
}
257+
258+
listOfStringsRichParameters := []codersdk.TemplateVersionParameter{
259+
{Name: listOfStringsParameterName, Type: "list(string)", Mutable: true},
260+
}
261+
262+
tests := []struct {
263+
parameterName string
264+
value string
265+
valid bool
266+
richParameters []codersdk.TemplateVersionParameter
267+
}{
268+
{numberParameterName, "2", false, numberRichParameters},
269+
{numberParameterName, "3", true, numberRichParameters},
270+
{numberParameterName, "10", true, numberRichParameters},
271+
{numberParameterName, "11", false, numberRichParameters},
272+
273+
{numberParameterName, "6", false, monotonicIncreasingNumberRichParameters},
274+
{numberParameterName, "7", true, monotonicIncreasingNumberRichParameters},
275+
{numberParameterName, "8", true, monotonicIncreasingNumberRichParameters},
276+
277+
{numberParameterName, "6", true, monotonicDecreasingNumberRichParameters},
278+
{numberParameterName, "7", true, monotonicDecreasingNumberRichParameters},
279+
{numberParameterName, "8", false, monotonicDecreasingNumberRichParameters},
280+
281+
{stringParameterName, "", true, stringRichParameters},
282+
{stringParameterName, "foobar", true, stringRichParameters},
283+
284+
{stringParameterName, "abcd", true, regexRichParameters},
285+
{stringParameterName, "abcd1", false, regexRichParameters},
286+
287+
{boolParameterName, "true", true, boolRichParameters},
288+
{boolParameterName, "false", true, boolRichParameters},
289+
{boolParameterName, "cat", false, boolRichParameters},
290+
291+
{listOfStringsParameterName, `[]`, true, listOfStringsRichParameters},
292+
{listOfStringsParameterName, `["aa"]`, true, listOfStringsRichParameters},
293+
{listOfStringsParameterName, `["aa]`, false, listOfStringsRichParameters},
294+
{listOfStringsParameterName, ``, false, listOfStringsRichParameters},
295+
}
296+
297+
for _, tc := range tests {
298+
tc := tc
299+
t.Run(tc.parameterName+"-"+tc.value, func(t *testing.T) {
300+
t.Parallel()
301+
302+
uut := codersdk.ParameterResolver{
303+
Rich: initialBuildParameters,
304+
}
305+
306+
for _, p := range tc.richParameters {
307+
if p.Name != tc.parameterName {
308+
continue
309+
}
310+
v, err := uut.ValidateResolve(p, &codersdk.WorkspaceBuildParameter{
311+
Name: tc.parameterName,
312+
Value: tc.value,
313+
})
314+
if tc.valid {
315+
require.NoError(t, err)
316+
require.Equal(t, tc.value, v)
317+
} else {
318+
require.Error(t, err)
319+
}
320+
}
321+
})
322+
}
323+
})
324+
}

0 commit comments

Comments
 (0)