@@ -686,6 +686,183 @@ data "coder_parameter" "region" {
686
686
}
687
687
}
688
688
689
+ //nolint:paralleltest,tparallel // Parameters load values from env vars
690
+ func TestParameterValidationEnforcement (t * testing.T ) {
691
+ for _ ,tc := range []struct {
692
+ Name string
693
+ Config string
694
+ Value string
695
+ ExpectError * regexp.Regexp
696
+ Check func (state * terraform.ResourceState )
697
+ }{
698
+ // Empty
699
+ {
700
+ Name :"EmptyString" ,
701
+ Config :`
702
+ data "coder_parameter" "parameter" {
703
+ name = "parameter"
704
+ type = "string"
705
+ }
706
+ ` ,
707
+ ExpectError :nil ,
708
+ Check :func (state * terraform.ResourceState ) {
709
+ attrs := state .Primary .Attributes
710
+ for key ,value := range map [string ]interface {}{
711
+ "default" :"" ,
712
+ "value" :"" ,
713
+ "optional" :"false" ,
714
+ } {
715
+ require .Equal (t ,value ,attrs [key ])
716
+ }
717
+ },
718
+ },
719
+ {
720
+ Name :"EmptyNumber" ,
721
+ Config :`
722
+ data "coder_parameter" "parameter" {
723
+ name = "parameter"
724
+ type = "number"
725
+ }
726
+ ` ,
727
+ ExpectError :nil ,
728
+ Check :func (state * terraform.ResourceState ) {
729
+ attrs := state .Primary .Attributes
730
+ for key ,value := range map [string ]interface {}{
731
+ "default" :"" ,
732
+ "value" :"" ,
733
+ "optional" :"false" ,
734
+ } {
735
+ require .Equal (t ,value ,attrs [key ])
736
+ }
737
+ },
738
+ },
739
+ // EmptyWithOption
740
+ {
741
+ Name :"EmptyWithOption" ,
742
+ Config :`
743
+ data "coder_parameter" "parameter" {
744
+ name = "parameter"
745
+ type = "number"
746
+
747
+ option {
748
+ name = "option"
749
+ value = "5"
750
+ }
751
+ }
752
+ ` ,
753
+ ExpectError :nil ,
754
+ Check :func (state * terraform.ResourceState ) {
755
+ attrs := state .Primary .Attributes
756
+ for key ,value := range map [string ]interface {}{
757
+ "default" :"" ,
758
+ "value" :"" ,
759
+ "optional" :"false" ,
760
+ } {
761
+ require .Equal (t ,value ,attrs [key ])
762
+ }
763
+ },
764
+ },
765
+ // DefaultSet
766
+ {
767
+ Name :"DefaultSet" ,
768
+ Config :`
769
+ data "coder_parameter" "parameter" {
770
+ name = "parameter"
771
+ type = "number"
772
+ default = "5"
773
+ }
774
+ ` ,
775
+ ExpectError :nil ,
776
+ Check :func (state * terraform.ResourceState ) {
777
+ attrs := state .Primary .Attributes
778
+ for key ,value := range map [string ]interface {}{
779
+ "default" :"5" ,
780
+ "value" :"5" ,
781
+ "optional" :"true" ,
782
+ } {
783
+ require .Equal (t ,value ,attrs [key ])
784
+ }
785
+ },
786
+ },
787
+ {
788
+ Name :"DefaultSetInOption" ,
789
+ Config :`
790
+ data "coder_parameter" "parameter" {
791
+ name = "parameter"
792
+ type = "number"
793
+ default = "5"
794
+ option {
795
+ name = "option"
796
+ value = "5"
797
+ }
798
+ }
799
+ ` ,
800
+ ExpectError :nil ,
801
+ Check :func (state * terraform.ResourceState ) {
802
+ attrs := state .Primary .Attributes
803
+ for key ,value := range map [string ]interface {}{
804
+ "default" :"5" ,
805
+ "value" :"5" ,
806
+ "optional" :"true" ,
807
+ } {
808
+ require .Equal (t ,value ,attrs [key ])
809
+ }
810
+ },
811
+ },
812
+ {
813
+ Name :"DefaultSetOutOption" ,
814
+ Config :`
815
+ data "coder_parameter" "parameter" {
816
+ name = "parameter"
817
+ type = "number"
818
+ default = "2"
819
+ option {
820
+ name = "option"
821
+ value = "5"
822
+ }
823
+ }
824
+ ` ,
825
+ ExpectError :nil ,
826
+ Check :func (state * terraform.ResourceState ) {
827
+ attrs := state .Primary .Attributes
828
+ for key ,value := range map [string ]interface {}{
829
+ "default" :"5" ,
830
+ "value" :"5" ,
831
+ "optional" :"true" ,
832
+ } {
833
+ require .Equal (t ,value ,attrs [key ])
834
+ }
835
+ },
836
+ },
837
+ } {
838
+ tc := tc
839
+ //nolint:paralleltest,tparallel // Parameters load values from env vars
840
+ t .Run (tc .Name ,func (t * testing.T ) {
841
+ if tc .Value != "" {
842
+ t .Setenv (provider .ParameterEnvironmentVariable ("parameter" ),tc .Value )
843
+ }
844
+ resource .Test (t , resource.TestCase {
845
+ ProviderFactories :coderFactory (),
846
+ IsUnitTest :true ,
847
+ Steps : []resource.TestStep {{
848
+ Config :tc .Config ,
849
+ ExpectError :tc .ExpectError ,
850
+ Check :func (state * terraform.State )error {
851
+ require .Len (t ,state .Modules ,1 )
852
+ require .Len (t ,state .Modules [0 ].Resources ,1 )
853
+ param := state .Modules [0 ].Resources ["data.coder_parameter.parameter" ]
854
+ require .NotNil (t ,param )
855
+ if tc .Check != nil {
856
+ tc .Check (param )
857
+ }
858
+ return nil
859
+ },
860
+ }},
861
+ })
862
+ })
863
+ }
864
+ }
865
+
689
866
func TestValueValidatesType (t * testing.T ) {
690
867
t .Parallel ()
691
868
for _ ,tc := range []struct {
@@ -798,6 +975,25 @@ func TestValueValidatesType(t *testing.T) {
798
975
Value :`[]` ,
799
976
MinDisabled :true ,
800
977
MaxDisabled :true ,
978
+ }, {
979
+ Name :"ValidListOfStrings" ,
980
+ Type :"list(string)" ,
981
+ Value :`["first","second","third"]` ,
982
+ MinDisabled :true ,
983
+ MaxDisabled :true ,
984
+ }, {
985
+ Name :"InvalidListOfStrings" ,
986
+ Type :"list(string)" ,
987
+ Value :`["first","second","third"` ,
988
+ MinDisabled :true ,
989
+ MaxDisabled :true ,
990
+ Error :regexp .MustCompile ("is not valid list of strings" ),
991
+ }, {
992
+ Name :"EmptyListOfStrings" ,
993
+ Type :"list(string)" ,
994
+ Value :`[]` ,
995
+ MinDisabled :true ,
996
+ MaxDisabled :true ,
801
997
}} {
802
998
tc := tc
803
999
t .Run (tc .Name ,func (t * testing.T ) {