Skip to content

Commit f1a0fd5

Browse files
committed
exploring an idea
1 parent f871a43 commit f1a0fd5

File tree

2 files changed

+252
-0
lines changed

2 files changed

+252
-0
lines changed

provider/parameter_test.go

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
689866
func 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) {

provider/table_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package provider_test
2+
3+
import (
4+
"strconv"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestMDtable(t *testing.T) {
10+
// Copy and paste the table to https://www.tablesgenerator.com/markdown_tables for easier editing
11+
table := strings.TrimSpace(`
12+
| Name | Type | Input Value | Default | Options | Validation | -> | Output Value | Optional | Error |
13+
|------------------|---------------|-------------|-----------|---------|------------|----|--------------|----------|-------|
14+
| Empty | string,number | undefined | undefined | | undefined | | "" | false | - |
15+
| EmptyWithOptions | number | undefined | undefined | | undefined | | "" | false | - |
16+
| DefaultSet | number | undefined | 5 | | undefined | | 5 | true | - |
17+
`)
18+
19+
type row struct {
20+
Name string
21+
Types []string
22+
InputValue string
23+
Default string
24+
Options string
25+
Validation string
26+
OutputValue string
27+
Optional bool
28+
Error string
29+
}
30+
31+
rows := make([]row, 0)
32+
lines := strings.Split(table, "\n")
33+
for _, line := range lines[2:] {
34+
columns := strings.Split(line, "|")
35+
columns = columns[1 : len(columns)-2]
36+
for i := range columns {
37+
columns[i] = strings.TrimSpace(columns[i])
38+
}
39+
40+
optional, err := strconv.ParseBool(columns[8])
41+
if err != nil {
42+
t.Fatalf("failed to parse optional column %q: %v", columns[8], err)
43+
}
44+
rows = append(rows, row{
45+
Name: columns[0],
46+
Types: strings.Split(columns[1], ","),
47+
InputValue: columns[2],
48+
Default: columns[3],
49+
Options: columns[4],
50+
Validation: columns[5],
51+
OutputValue: columns[7],
52+
Optional: optional,
53+
Error: columns[9],
54+
})
55+
}
56+
}

0 commit comments

Comments
 (0)