@@ -686,6 +686,183 @@ data "coder_parameter" "region" {
686686 }
687687}
688688
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+
689866func TestValueValidatesType (t * testing.T ) {
690867 t .Parallel ()
691868 for _ , tc := range []struct {
@@ -798,6 +975,25 @@ func TestValueValidatesType(t *testing.T) {
798975 Value : `[]` ,
799976 MinDisabled : true ,
800977 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 ,
801997 }} {
802998 tc := tc
803999 t .Run (tc .Name , func (t * testing.T ) {
0 commit comments