@@ -689,7 +689,166 @@ data "coder_parameter" "region" {
689689 }
690690}
691691
692- << << << < HEAD
692+ func TestParameterValidation (t * testing.T ) {
693+ t .Parallel ()
694+ opts := func (vals ... string ) []provider.Option {
695+ options := make ([]provider.Option , 0 , len (vals ))
696+ for _ , val := range vals {
697+ options = append (options , provider.Option {
698+ Name : val ,
699+ Value : val ,
700+ })
701+ }
702+ return options
703+ }
704+
705+ for _ , tc := range []struct {
706+ Name string
707+ Parameter provider.Parameter
708+ Value string
709+ ExpectError * regexp.Regexp
710+ }{
711+ {
712+ Name : "ValidStringParameter" ,
713+ Parameter : provider.Parameter {
714+ Type : "string" ,
715+ },
716+ Value : "alpha" ,
717+ },
718+ // Test invalid states
719+ {
720+ Name : "InvalidFormType" ,
721+ Parameter : provider.Parameter {
722+ Type : "string" ,
723+ Option : opts ("alpha" , "bravo" , "charlie" ),
724+ FormType : provider .ParameterFormTypeSlider ,
725+ },
726+ Value : "alpha" ,
727+ ExpectError : regexp .MustCompile ("Invalid form_type for parameter" ),
728+ },
729+ {
730+ Name : "NotInOptions" ,
731+ Parameter : provider.Parameter {
732+ Type : "string" ,
733+ Option : opts ("alpha" , "bravo" , "charlie" ),
734+ },
735+ Value : "delta" , // not in option set
736+ ExpectError : regexp .MustCompile ("Value must be a valid option" ),
737+ },
738+ {
739+ Name : "NumberNotInOptions" ,
740+ Parameter : provider.Parameter {
741+ Type : "number" ,
742+ Option : opts ("1" , "2" , "3" ),
743+ },
744+ Value : "0" , // not in option set
745+ ExpectError : regexp .MustCompile ("Value must be a valid option" ),
746+ },
747+ {
748+ Name : "NonUniqueOptionNames" ,
749+ Parameter : provider.Parameter {
750+ Type : "string" ,
751+ Option : opts ("alpha" , "alpha" ),
752+ },
753+ Value : "alpha" ,
754+ ExpectError : regexp .MustCompile ("Option names must be unique" ),
755+ },
756+ {
757+ Name : "NonUniqueOptionValues" ,
758+ Parameter : provider.Parameter {
759+ Type : "string" ,
760+ Option : []provider.Option {
761+ {Name : "Alpha" , Value : "alpha" },
762+ {Name : "AlphaAgain" , Value : "alpha" },
763+ },
764+ },
765+ Value : "alpha" ,
766+ ExpectError : regexp .MustCompile ("Option values must be unique" ),
767+ },
768+ {
769+ Name : "IncorrectValueTypeOption" ,
770+ Parameter : provider.Parameter {
771+ Type : "number" ,
772+ Option : opts ("not-a-number" ),
773+ },
774+ Value : "5" ,
775+ ExpectError : regexp .MustCompile ("is not a number" ),
776+ },
777+ {
778+ Name : "IncorrectValueType" ,
779+ Parameter : provider.Parameter {
780+ Type : "number" ,
781+ },
782+ Value : "not-a-number" ,
783+ ExpectError : regexp .MustCompile ("Parameter value is not of type \" number\" " ),
784+ },
785+ {
786+ Name : "NotListStringDefault" ,
787+ Parameter : provider.Parameter {
788+ Type : "list(string)" ,
789+ Default : "not-a-list" ,
790+ },
791+ ExpectError : regexp .MustCompile ("not a valid list of strings" ),
792+ },
793+ {
794+ Name : "NotListStringDefault" ,
795+ Parameter : provider.Parameter {
796+ Type : "list(string)" ,
797+ },
798+ Value : "not-a-list" ,
799+ ExpectError : regexp .MustCompile ("not a valid list of strings" ),
800+ },
801+ {
802+ Name : "DefaultListStringNotInOptions" ,
803+ Parameter : provider.Parameter {
804+ Type : "list(string)" ,
805+ Default : `["red", "yellow", "black"]` ,
806+ Option : opts ("red" , "blue" , "green" ),
807+ FormType : provider .ParameterFormTypeMultiSelect ,
808+ },
809+ ExpectError : regexp .MustCompile ("is not a valid option, values \" yellow, black\" are missing from the options" ),
810+ },
811+ {
812+ Name : "ListStringNotInOptions" ,
813+ Parameter : provider.Parameter {
814+ Type : "list(string)" ,
815+ Default : `["red"]` ,
816+ Option : opts ("red" , "blue" , "green" ),
817+ FormType : provider .ParameterFormTypeMultiSelect ,
818+ },
819+ Value : `["red", "yellow", "black"]` ,
820+ ExpectError : regexp .MustCompile ("is not a valid option, values \" yellow, black\" are missing from the options" ),
821+ },
822+ {
823+ Name : "InvalidMiniumum" ,
824+ Parameter : provider.Parameter {
825+ Type : "number" ,
826+ Default : "5" ,
827+ Validation : []provider.Validation {{
828+ Min : 10 ,
829+ Error : "must be greater than 10" ,
830+ }},
831+ },
832+ ExpectError : regexp .MustCompile ("must be greater than 10" ),
833+ },
834+ } {
835+ tc := tc
836+ t .Run (tc .Name , func (t * testing.T ) {
837+ t .Parallel ()
838+ diags := tc .Parameter .Valid (tc .Value )
839+ if tc .ExpectError != nil {
840+ require .True (t , diags .HasError ())
841+ errMsg := fmt .Sprintf ("%+v" , diags [0 ]) // close enough
842+ require .Truef (t , tc .ExpectError .MatchString (errMsg ), "got: %s" , errMsg )
843+ } else {
844+ if ! assert .False (t , diags .HasError ()) {
845+ t .Logf ("got: %+v" , diags [0 ])
846+ }
847+ }
848+ })
849+ }
850+ }
851+
693852// TestParameterValidationEnforcement tests various parameter states and the
694853// validation enforcement that should be applied to them. The table is described
695854// by a markdown table. This is done so that the test cases can be more easily
@@ -898,165 +1057,6 @@ func TestParameterValidationEnforcement(t *testing.T) {
8981057 })
8991058 })
9001059 }
901- == == == =
902- func TestParameterValidation (t * testing .T ) {
903- t .Parallel ()
904- opts := func (vals ... string ) []provider.Option {
905- options := make ([]provider.Option , 0 , len (vals ))
906- for _ , val := range vals {
907- options = append (options , provider.Option {
908- Name : val ,
909- Value : val ,
910- })
911- }
912- return options
913- }
914-
915- for _ , tc := range []struct {
916- Name string
917- Parameter provider.Parameter
918- Value string
919- ExpectError * regexp.Regexp
920- }{
921- {
922- Name : "ValidStringParameter" ,
923- Parameter : provider.Parameter {
924- Type : "string" ,
925- },
926- Value : "alpha" ,
927- },
928- // Test invalid states
929- {
930- Name : "InvalidFormType" ,
931- Parameter : provider.Parameter {
932- Type : "string" ,
933- Option : opts ("alpha" , "bravo" , "charlie" ),
934- FormType : provider .ParameterFormTypeSlider ,
935- },
936- Value : "alpha" ,
937- ExpectError : regexp .MustCompile ("Invalid form_type for parameter" ),
938- },
939- {
940- Name : "NotInOptions" ,
941- Parameter : provider.Parameter {
942- Type : "string" ,
943- Option : opts ("alpha" , "bravo" , "charlie" ),
944- },
945- Value : "delta" , // not in option set
946- ExpectError : regexp .MustCompile ("Value must be a valid option" ),
947- },
948- {
949- Name : "NumberNotInOptions" ,
950- Parameter : provider.Parameter {
951- Type : "number" ,
952- Option : opts ("1" , "2" , "3" ),
953- },
954- Value : "0" , // not in option set
955- ExpectError : regexp .MustCompile ("Value must be a valid option" ),
956- },
957- {
958- Name : "NonUniqueOptionNames" ,
959- Parameter : provider.Parameter {
960- Type : "string" ,
961- Option : opts ("alpha" , "alpha" ),
962- },
963- Value : "alpha" ,
964- ExpectError : regexp .MustCompile ("Option names must be unique" ),
965- },
966- {
967- Name : "NonUniqueOptionValues" ,
968- Parameter : provider.Parameter {
969- Type : "string" ,
970- Option : []provider.Option {
971- {Name : "Alpha" , Value : "alpha" },
972- {Name : "AlphaAgain" , Value : "alpha" },
973- },
974- },
975- Value : "alpha" ,
976- ExpectError : regexp .MustCompile ("Option values must be unique" ),
977- },
978- {
979- Name : "IncorrectValueTypeOption" ,
980- Parameter : provider.Parameter {
981- Type : "number" ,
982- Option : opts ("not-a-number" ),
983- },
984- Value : "5" ,
985- ExpectError : regexp .MustCompile ("is not a number" ),
986- },
987- {
988- Name : "IncorrectValueType" ,
989- Parameter : provider.Parameter {
990- Type : "number" ,
991- },
992- Value : "not-a-number" ,
993- ExpectError : regexp .MustCompile ("Parameter value is not of type \" number\" " ),
994- },
995- {
996- Name : "NotListStringDefault" ,
997- Parameter : provider.Parameter {
998- Type : "list(string)" ,
999- Default : "not-a-list" ,
1000- },
1001- ExpectError : regexp .MustCompile ("not a valid list of strings" ),
1002- },
1003- {
1004- Name : "NotListStringDefault" ,
1005- Parameter : provider.Parameter {
1006- Type : "list(string)" ,
1007- },
1008- Value : "not-a-list" ,
1009- ExpectError : regexp .MustCompile ("not a valid list of strings" ),
1010- },
1011- {
1012- Name : "DefaultListStringNotInOptions" ,
1013- Parameter : provider.Parameter {
1014- Type : "list(string)" ,
1015- Default : `["red", "yellow", "black"]` ,
1016- Option : opts ("red" , "blue" , "green" ),
1017- FormType : provider .ParameterFormTypeMultiSelect ,
1018- },
1019- ExpectError : regexp .MustCompile ("is not a valid option, values \" yellow, black\" are missing from the options" ),
1020- },
1021- {
1022- Name : "ListStringNotInOptions" ,
1023- Parameter : provider.Parameter {
1024- Type : "list(string)" ,
1025- Default : `["red"]` ,
1026- Option : opts ("red" , "blue" , "green" ),
1027- FormType : provider .ParameterFormTypeMultiSelect ,
1028- },
1029- Value : `["red", "yellow", "black"]` ,
1030- ExpectError : regexp .MustCompile ("is not a valid option, values \" yellow, black\" are missing from the options" ),
1031- },
1032- {
1033- Name : "InvalidMiniumum" ,
1034- Parameter : provider.Parameter {
1035- Type : "number" ,
1036- Default : "5" ,
1037- Validation : []provider.Validation {{
1038- Min : 10 ,
1039- Error : "must be greater than 10" ,
1040- }},
1041- },
1042- ExpectError : regexp .MustCompile ("must be greater than 10" ),
1043- },
1044- } {
1045- tc := tc
1046- t .Run (tc .Name , func (t * testing.T ) {
1047- t .Parallel ()
1048- diags := tc .Parameter .Valid (tc .Value )
1049- if tc .ExpectError != nil {
1050- require .True (t , diags .HasError ())
1051- errMsg := fmt .Sprintf ("%+v" , diags [0 ]) // close enough
1052- require .Truef (t , tc .ExpectError .MatchString (errMsg ), "got: %s" , errMsg )
1053- } else {
1054- if ! assert .False (t , diags .HasError ()) {
1055- t .Logf ("got: %+v" , diags [0 ])
1056- }
1057- }
1058- })
1059- >> >> >> > c640b02 (begin adding invalid unit tests )
10601060 }
10611061}
10621062
0 commit comments