@@ -780,3 +780,162 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
780
780
require .Error (t , err )
781
781
})
782
782
}
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
+ }
0 commit comments