Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e278cc0

Browse files
committed
Validator tests
1 parent 125d861 commit e278cc0

File tree

2 files changed

+168
-0
lines changed

2 files changed

+168
-0
lines changed

coderd/workspacebuilds_test.go

+159
Original file line numberDiff line numberDiff line change
@@ -780,3 +780,162 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
780780
require.Error(t, err)
781781
})
782782
}
783+
784+
func TestWorkspaceBuildValidateRichParameters(t *testing.T) {
785+
t.Parallel()
786+
787+
const (
788+
stringParameterName = "string_parameter"
789+
stringParameterValue = "abc"
790+
791+
numberParameterName = "number_parameter"
792+
numberParameterValue = "7"
793+
794+
boolParameterName = "bool_parameter"
795+
boolParameterValue = "true"
796+
)
797+
798+
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
799+
{Name: stringParameterName, Value: stringParameterValue},
800+
{Name: numberParameterName, Value: numberParameterValue},
801+
{Name: boolParameterName, Value: boolParameterValue},
802+
}
803+
804+
prepareEchoResponses := func(richParameters []*proto.RichParameter) *echo.Responses {
805+
return &echo.Responses{
806+
Parse: echo.ParseComplete,
807+
ProvisionPlan: []*proto.Provision_Response{
808+
{
809+
Type: &proto.Provision_Response_Complete{
810+
Complete: &proto.Provision_Complete{
811+
Parameters: richParameters,
812+
},
813+
},
814+
}},
815+
ProvisionApply: []*proto.Provision_Response{
816+
{
817+
Type: &proto.Provision_Response_Complete{
818+
Complete: &proto.Provision_Complete{},
819+
},
820+
},
821+
},
822+
}
823+
}
824+
825+
t.Run("NoValidation", func(t *testing.T) {
826+
t.Parallel()
827+
828+
richParameters := []*proto.RichParameter{
829+
{Name: stringParameterName, Type: "string", Mutable: true},
830+
{Name: numberParameterName, Type: "number", Mutable: true},
831+
{Name: boolParameterName, Type: "bool", Mutable: true},
832+
}
833+
834+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
835+
user := coderdtest.CreateFirstUser(t, client)
836+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(richParameters))
837+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
838+
839+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
840+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
841+
cwr.RichParameterValues = initialBuildParameters
842+
})
843+
844+
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
845+
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
846+
847+
// Update build parameters
848+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
849+
defer cancel()
850+
851+
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
852+
{Name: numberParameterName, Value: "42"},
853+
}
854+
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
855+
Transition: codersdk.WorkspaceTransitionStart,
856+
RichParameterValues: nextBuildParameters,
857+
})
858+
require.NoError(t, err)
859+
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
860+
861+
_, err = client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
862+
require.NoError(t, err)
863+
})
864+
865+
t.Run("Validation", func(t *testing.T) {
866+
t.Parallel()
867+
868+
numberRichParameters := []*proto.RichParameter{
869+
{Name: stringParameterName, Type: "string", Mutable: true},
870+
{Name: numberParameterName, Type: "number", Mutable: true, ValidationMin: 3, ValidationMax: 10},
871+
{Name: boolParameterName, Type: "bool", Mutable: true},
872+
}
873+
874+
stringRichParameters := []*proto.RichParameter{
875+
{Name: stringParameterName, Type: "string", Mutable: true},
876+
{Name: numberParameterName, Type: "number", Mutable: true},
877+
{Name: boolParameterName, Type: "bool", Mutable: true},
878+
}
879+
880+
/* FIXME
881+
regexRichParameters := []*proto.RichParameter{
882+
{Name: stringParameterName, Type: "string", Mutable: true, ValidationRegex: "[a-z]+"},
883+
{Name: numberParameterName, Type: "number", Mutable: true},
884+
{Name: boolParameterName, Type: "bool", Mutable: true},
885+
}*/
886+
887+
tests := []struct {
888+
value string
889+
valid bool
890+
richParameters []*proto.RichParameter
891+
}{
892+
{"2", false, numberRichParameters},
893+
{"3", true, numberRichParameters},
894+
{"10", true, numberRichParameters},
895+
{"11", false, numberRichParameters},
896+
897+
{"", false, stringRichParameters},
898+
{"foobar", true, stringRichParameters},
899+
900+
/* FIXME can't validate build parameter "string_parameter": an error must be specified with a regex validation
901+
{"abcd", true, regexRichParameters},
902+
{"abcd1", false, regexRichParameters},*/
903+
}
904+
905+
for _, tc := range tests {
906+
t.Run("Value-"+tc.value, func(t *testing.T) {
907+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
908+
user := coderdtest.CreateFirstUser(t, client)
909+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(tc.richParameters))
910+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
911+
912+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
913+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
914+
cwr.RichParameterValues = initialBuildParameters
915+
})
916+
917+
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
918+
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
919+
920+
// Update build parameters
921+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
922+
defer cancel()
923+
924+
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
925+
{Name: numberParameterName, Value: tc.value},
926+
}
927+
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
928+
Transition: codersdk.WorkspaceTransitionStart,
929+
RichParameterValues: nextBuildParameters,
930+
})
931+
932+
if tc.valid {
933+
require.NoError(t, err)
934+
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
935+
} else {
936+
require.Error(t, err)
937+
}
938+
})
939+
}
940+
})
941+
}

codersdk/richparameters.go

+9
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,15 @@ func ValidateWorkspaceBuildParameter(richParameter TemplateVersionParameter, bui
4141
return nil
4242
}
4343

44+
if !validationEnabled(richParameter) {
45+
return nil
46+
}
47+
4448
validation := &provider.Validation{
4549
Min: int(richParameter.ValidationMin),
4650
Max: int(richParameter.ValidationMax),
4751
Regex: richParameter.ValidationRegex,
52+
// TODO Error: ?,
4853
}
4954
return validation.Valid(richParameter.Type, buildParameter.Value)
5055
}
@@ -65,3 +70,7 @@ func parameterValuesAsArray(options []TemplateVersionParameterOption) []string {
6570
}
6671
return arr
6772
}
73+
74+
func validationEnabled(param TemplateVersionParameter) bool {
75+
return len(param.ValidationRegex) > 0 || (param.ValidationMin != 0 && param.ValidationMax != 0)
76+
}

0 commit comments

Comments
 (0)