@@ -16,144 +16,240 @@ import (
16
16
17
17
type formTypeTestCase struct {
18
18
name string
19
- config string
19
+ config formTypeCheck
20
20
assert paramAssert
21
21
expectError * regexp.Regexp
22
22
}
23
23
24
24
type paramAssert struct {
25
- Default string
26
- FormType string
27
- Type string
25
+ FormType provider.ParameterFormType
26
+ Type provider.OptionType
28
27
Styling string
29
28
}
30
29
31
30
type formTypeCheck struct {
32
- formType provider.ParameterFormType
33
- optionType provider.OptionType
34
- optionsExist bool
31
+ formType provider.ParameterFormType
32
+ optionType provider.OptionType
33
+ options bool
34
+ }
35
+
36
+ func (c formTypeCheck ) String () string {
37
+ return fmt .Sprintf ("%s_%s_%t" , c .formType , c .optionType , c .options )
35
38
}
36
39
37
40
func TestValidateFormType (t * testing.T ) {
38
41
t .Parallel ()
39
42
40
43
//formTypesChecked := make(map[provider.ParameterFormType]map[provider.OptionType]map[bool]struct{})
41
- formTypesChecked := make (map [formTypeCheck ]struct {})
44
+ formTypesChecked := make (map [string ]struct {})
42
45
43
- const paramName = "test_me"
46
+ obvious := func (expected provider.ParameterFormType , opts formTypeCheck ) formTypeTestCase {
47
+ ftname := opts .formType
48
+ if ftname == "" {
49
+ ftname = "default"
50
+ }
51
+ return formTypeTestCase {
52
+ name : fmt .Sprintf ("%s_%s_%t" ,
53
+ ftname ,
54
+ opts .optionType ,
55
+ opts .options ,
56
+ ),
57
+ config : opts ,
58
+ assert : paramAssert {
59
+ FormType : expected ,
60
+ Type : opts .optionType ,
61
+ Styling : "" ,
62
+ },
63
+ expectError : nil ,
64
+ }
65
+ }
44
66
45
67
cases := []formTypeTestCase {
46
68
{
47
69
// When nothing is specified
48
70
name : "defaults" ,
49
- config : ezconfig (paramName , ezconfigOpts {}),
50
- assert : paramAssert {
51
- Default : "" ,
52
- FormType : "input" ,
53
- Type : "string" ,
54
- Styling : "" ,
55
- },
56
- },
57
- {
58
- name : "string radio" ,
59
- config : ezconfig (paramName , ezconfigOpts {Options : []string {"foo" }}),
71
+ config : formTypeCheck {},
60
72
assert : paramAssert {
61
- Default : "" ,
62
- FormType : "radio" ,
63
- Type : "string" ,
73
+ FormType : provider .ParameterFormTypeInput ,
74
+ Type : provider .OptionTypeString ,
64
75
Styling : "" ,
65
76
},
66
77
},
78
+ // String
79
+ obvious (provider .ParameterFormTypeRadio , formTypeCheck {
80
+ options : true ,
81
+ optionType : provider .OptionTypeString ,
82
+ }),
83
+ obvious (provider .ParameterFormTypeRadio , formTypeCheck {
84
+ options : true ,
85
+ optionType : provider .OptionTypeString ,
86
+ formType : provider .ParameterFormTypeRadio ,
87
+ }),
88
+ obvious (provider .ParameterFormTypeDropdown , formTypeCheck {
89
+ options : true ,
90
+ optionType : provider .OptionTypeString ,
91
+ formType : provider .ParameterFormTypeDropdown ,
92
+ }),
93
+ obvious (provider .ParameterFormTypeInput , formTypeCheck {
94
+ options : false ,
95
+ optionType : provider .OptionTypeString ,
96
+ }),
97
+ obvious (provider .ParameterFormTypeTextArea , formTypeCheck {
98
+ options : false ,
99
+ optionType : provider .OptionTypeString ,
100
+ formType : provider .ParameterFormTypeTextArea ,
101
+ }),
102
+ // Numbers
103
+ obvious (provider .ParameterFormTypeRadio , formTypeCheck {
104
+ options : true ,
105
+ optionType : provider .OptionTypeNumber ,
106
+ }),
107
+ obvious (provider .ParameterFormTypeRadio , formTypeCheck {
108
+ options : true ,
109
+ optionType : provider .OptionTypeNumber ,
110
+ formType : provider .ParameterFormTypeRadio ,
111
+ }),
112
+ obvious (provider .ParameterFormTypeDropdown , formTypeCheck {
113
+ options : true ,
114
+ optionType : provider .OptionTypeNumber ,
115
+ formType : provider .ParameterFormTypeDropdown ,
116
+ }),
117
+ obvious (provider .ParameterFormTypeInput , formTypeCheck {
118
+ options : false ,
119
+ optionType : provider .OptionTypeNumber ,
120
+ }),
121
+ obvious (provider .ParameterFormTypeSlider , formTypeCheck {
122
+ options : false ,
123
+ optionType : provider .OptionTypeNumber ,
124
+ formType : provider .ParameterFormTypeSlider ,
125
+ }),
126
+ // booleans
127
+ obvious (provider .ParameterFormTypeRadio , formTypeCheck {
128
+ options : true ,
129
+ optionType : provider .OptionTypeBoolean ,
130
+ }),
131
+ obvious (provider .ParameterFormTypeCheckbox , formTypeCheck {
132
+ options : false ,
133
+ optionType : provider .OptionTypeBoolean ,
134
+ }),
135
+ obvious (provider .ParameterFormTypeCheckbox , formTypeCheck {
136
+ options : false ,
137
+ optionType : provider .OptionTypeBoolean ,
138
+ formType : provider .ParameterFormTypeCheckbox ,
139
+ }),
140
+ obvious (provider .ParameterFormTypeSwitch , formTypeCheck {
141
+ options : false ,
142
+ optionType : provider .OptionTypeBoolean ,
143
+ formType : provider .ParameterFormTypeSwitch ,
144
+ }),
67
145
}
68
146
69
- for _ , c := range cases {
70
- t .Run (c .name , func (t * testing.T ) {
71
- t .Parallel ()
72
- if c .assert .Styling == "" {
73
- c .assert .Styling = "{}"
74
- }
147
+ // TabledCases runs through all the manual test cases
148
+ t .Run ("TabledCases" , func (t * testing.T ) {
149
+ for _ , c := range cases {
150
+ t .Run (c .name , func (t * testing.T ) {
151
+ t .Parallel ()
152
+ if c .assert .Styling == "" {
153
+ c .assert .Styling = "{}"
154
+ }
75
155
76
- formTypesChecked [formTypeTest (t , paramName , c )] = struct {}{}
77
- })
78
- }
156
+ formTypeTest (t , c )
157
+ formTypesChecked [c .config .String ()] = struct {}{}
158
+ })
159
+ }
160
+ })
79
161
80
- // TODO: assume uncovered cases should fail
162
+ // AssumeErrorCases assumes any uncovered test will return an error.
163
+ // This ensures all valid test case paths are covered.
81
164
t .Run ("AssumeErrorCases" , func (t * testing.T ) {
82
- t .Skip ()
83
165
// requiredChecks loops through all possible form_type and option_type
84
166
// combinations.
85
167
requiredChecks := make ([]formTypeCheck , 0 )
86
168
//requiredChecks := make(map[provider.ParameterFormType][]provider.OptionType)
87
- for _ , ft := range provider .ParameterFormTypes () {
169
+ for _ , ft := range append ( provider .ParameterFormTypes (), "" ) {
88
170
//requiredChecks[ft] = make([]provider.OptionType, 0)
89
171
for _ , ot := range provider .OptionTypes () {
90
172
requiredChecks = append (requiredChecks , formTypeCheck {
91
- formType : ft ,
92
- optionType : ot ,
93
- optionsExist : false ,
173
+ formType : ft ,
174
+ optionType : ot ,
175
+ options : false ,
94
176
})
95
177
requiredChecks = append (requiredChecks , formTypeCheck {
96
- formType : ft ,
97
- optionType : ot ,
98
- optionsExist : true ,
178
+ formType : ft ,
179
+ optionType : ot ,
180
+ options : true ,
99
181
})
100
- //requiredChecks[ft] = append(requiredChecks[ft], ot)
101
182
}
102
183
}
103
184
104
185
for _ , check := range requiredChecks {
105
- _ , alreadyChecked := formTypesChecked [check ]
186
+ _ , alreadyChecked := formTypesChecked [check . String () ]
106
187
if alreadyChecked {
107
188
continue
108
189
}
109
190
110
- // Assume it will fail
191
+ ftName := check .formType
192
+ if ftName == "" {
193
+ ftName = "default"
194
+ }
195
+ fc := formTypeTestCase {
196
+ name : fmt .Sprintf ("%s_%s_%t" ,
197
+ ftName ,
198
+ check .optionType ,
199
+ check .options ,
200
+ ),
201
+ config : check ,
202
+ assert : paramAssert {},
203
+ expectError : regexp .MustCompile ("is not supported" ),
204
+ }
111
205
112
- }
206
+ t .Run (fc .name , func (t * testing.T ) {
207
+ t .Parallel ()
113
208
114
- //checkedFormTypes := make([]provider.ParameterFormType, 0)
115
- //for ft, ot := range formTypesChecked {
116
- // checkedFormTypes = append(checkedFormTypes, ft)
117
- // var _ = ot
118
- //}
119
- //
120
- //// Fist check all form types have at least 1 test.
121
- //require.ElementsMatch(t, provider.ParameterFormTypes(), checkedFormTypes, "some form types are missing tests")
122
- //
123
- //// Then check each form type has tried with each option type
124
- //for expectedFt, expectedOptionTypes := range requiredChecks {
125
- // actual := formTypesChecked[expectedFt]
126
- //
127
- // assert.Equalf(t, expectedOptionTypes, maps.Keys(actual), "some option types are missing for form type %s", expectedFt)
128
- //
129
- // // Also check for a true/false
130
- // for _, expectedOptionType := range expectedOptionTypes {
131
- // assert.Equalf(t, []bool{true, false}, maps.Keys(actual[expectedOptionType]), "options should be both present and absent for form type %q, option type %q", expectedFt, expectedOptionType)
132
- // }
133
- //}
134
- })
135
- }
209
+ tcText := fmt .Sprintf (`
210
+ obvious(%s, ezconfigOpts{
211
+ Options: %t,
212
+ OptionType: %q,
213
+ FormType: %q,
214
+ }),
215
+ ` , "<expected_form_type>" , check .options , check .optionType , check .formType )
216
+ t .Logf ("To construct this test case:\n %s" , tcText )
217
+ formTypeTest (t , fc )
218
+ })
136
219
137
- type ezconfigOpts struct {
138
- Options []string
139
- FormType string
140
- OptionType string
141
- Default string
220
+ }
221
+ })
142
222
}
143
223
144
- func ezconfig (paramName string , cfg ezconfigOpts ) string {
224
+ func ezconfig (paramName string , cfg formTypeCheck ) string {
145
225
var body strings.Builder
146
- if cfg .Default != "" {
147
- body .WriteString (fmt .Sprintf ("default = %q\n " , cfg .Default ))
226
+ //if cfg.Default != "" {
227
+ // body.WriteString(fmt.Sprintf("default = %q\n", cfg.Default))
228
+ //}
229
+ if cfg .formType != "" {
230
+ body .WriteString (fmt .Sprintf ("form_type = %q\n " , cfg .formType ))
148
231
}
149
- if cfg .FormType != "" {
150
- body .WriteString (fmt .Sprintf ("form_type = %q\n " , cfg .FormType ))
232
+ if cfg .optionType != "" {
233
+ body .WriteString (fmt .Sprintf ("type = %q\n " , cfg .optionType ))
151
234
}
152
- if cfg .OptionType != "" {
153
- body .WriteString (fmt .Sprintf ("type = %q\n " , cfg .OptionType ))
235
+
236
+ var options []string
237
+ if cfg .options {
238
+ switch cfg .optionType {
239
+ case provider .OptionTypeString :
240
+ options = []string {"foo" }
241
+ case provider .OptionTypeBoolean :
242
+ options = []string {"true" , "false" }
243
+ case provider .OptionTypeNumber :
244
+ options = []string {"1" }
245
+ case provider .OptionTypeListString :
246
+ options = []string {`["red", "blue"]` }
247
+ default :
248
+ panic (fmt .Sprintf ("unknown option type %q when generating options" , cfg .optionType ))
249
+ }
154
250
}
155
251
156
- for i , opt := range cfg . Options {
252
+ for i , opt := range options {
157
253
body .WriteString ("option {\n " )
158
254
body .WriteString (fmt .Sprintf ("name = \" val_%d\" \n " , i ))
159
255
body .WriteString (fmt .Sprintf ("value = %q\n " , opt ))
@@ -174,42 +270,43 @@ func coderParamHCL(paramName string, body string) string {
174
270
` , paramName , paramName , body )
175
271
}
176
272
177
- func formTypeTest (t * testing.T , paramName string , c formTypeTestCase ) formTypeCheck {
178
- var check formTypeCheck
273
+ func formTypeTest (t * testing.T , c formTypeTestCase ) {
274
+ const paramName = "test_param"
275
+
276
+ checkFn := func (state * terraform.State ) error {
277
+ require .Len (t , state .Modules , 1 )
278
+ require .Len (t , state .Modules [0 ].Resources , 1 )
279
+
280
+ key := strings .Join ([]string {"data" , "coder_parameter" , paramName }, "." )
281
+ param := state .Modules [0 ].Resources [key ]
282
+
283
+ //assert.Equal(t, c.assert.Default, param.Primary.Attributes["default"], "default value")
284
+ assert .Equal (t , string (c .assert .FormType ), param .Primary .Attributes ["form_type" ], "form_type" )
285
+ assert .Equal (t , string (c .assert .Type ), param .Primary .Attributes ["type" ], "type" )
286
+ assert .JSONEq (t , c .assert .Styling , param .Primary .Attributes ["styling" ], "styling" )
287
+
288
+ //ft := provider.ParameterFormType(param.Primary.Attributes["form_type"])
289
+ //ot := provider.OptionType(param.Primary.Attributes["type"])
290
+
291
+ // Option blocks are not stored in a very friendly format
292
+ // here.
293
+ //options := param.Primary.Attributes["option.0.name"] != ""
294
+
295
+ return nil
296
+ }
297
+ if c .expectError != nil {
298
+ checkFn = nil
299
+ }
300
+
179
301
resource .Test (t , resource.TestCase {
180
302
IsUnitTest : true ,
181
303
ProviderFactories : coderFactory (),
182
304
Steps : []resource.TestStep {
183
305
{
184
- Config : c .config ,
185
- Check : func (state * terraform.State ) error {
186
- require .Len (t , state .Modules , 1 )
187
- require .Len (t , state .Modules [0 ].Resources , 1 )
188
-
189
- key := strings .Join ([]string {"data" , "coder_parameter" , paramName }, "." )
190
- param := state .Modules [0 ].Resources [key ]
191
-
192
- assert .Equal (t , c .assert .Default , param .Primary .Attributes ["default" ], "default value" )
193
- assert .Equal (t , c .assert .FormType , param .Primary .Attributes ["form_type" ], "form_type" )
194
- assert .Equal (t , c .assert .Type , param .Primary .Attributes ["type" ], "type" )
195
- assert .JSONEq (t , c .assert .Styling , param .Primary .Attributes ["styling" ], "styling" )
196
-
197
- ft := provider .ParameterFormType (param .Primary .Attributes ["form_type" ])
198
- ot := provider .OptionType (param .Primary .Attributes ["type" ])
199
-
200
- // Option blocks are not stored in a very friendly format
201
- // here.
202
- optionsExist := param .Primary .Attributes ["option.0.name" ] != ""
203
- check = formTypeCheck {
204
- formType : ft ,
205
- optionType : ot ,
206
- optionsExist : optionsExist ,
207
- }
208
-
209
- return nil
210
- },
306
+ Config : ezconfig (paramName , c .config ),
307
+ Check : checkFn ,
308
+ ExpectError : c .expectError ,
211
309
},
212
310
},
213
311
})
214
- return check
215
312
}
0 commit comments