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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy