@@ -28,9 +28,11 @@ type paramAssert struct {
28
28
}
29
29
30
30
type formTypeCheck struct {
31
- formType provider.ParameterFormType
32
- optionType provider.OptionType
33
- options bool
31
+ formType provider.ParameterFormType
32
+ optionType provider.OptionType
33
+ defValue string
34
+ options bool
35
+ customOptions []string
34
36
}
35
37
36
38
func (c formTypeCheck ) String () string {
@@ -40,10 +42,12 @@ func (c formTypeCheck) String() string {
40
42
func TestValidateFormType (t * testing.T ) {
41
43
t .Parallel ()
42
44
43
- //formTypesChecked := make(map[provider.ParameterFormType]map[provider.OptionType]map[bool]struct{})
45
+ // formTypesChecked keeps track of all checks run. It will be used to
46
+ // ensure all combinations of form_type and option_type are tested.
47
+ // All untested options are assumed to throw an error.
44
48
formTypesChecked := make (map [string ]struct {})
45
49
46
- obvious := func (expected provider.ParameterFormType , opts formTypeCheck ) formTypeTestCase {
50
+ expectType := func (expected provider.ParameterFormType , opts formTypeCheck ) formTypeTestCase {
47
51
ftname := opts .formType
48
52
if ftname == "" {
49
53
ftname = "default"
@@ -64,6 +68,12 @@ func TestValidateFormType(t *testing.T) {
64
68
}
65
69
}
66
70
71
+ // obvious just assumes the FormType in the check is the expected
72
+ // FormType. Using `expectType` these fields can differ
73
+ obvious := func (opts formTypeCheck ) formTypeTestCase {
74
+ return expectType (opts .formType , opts )
75
+ }
76
+
67
77
cases := []formTypeTestCase {
68
78
{
69
79
// When nothing is specified
@@ -75,77 +85,125 @@ func TestValidateFormType(t *testing.T) {
75
85
Styling : "" ,
76
86
},
77
87
},
78
- // String
79
- obvious (provider .ParameterFormTypeRadio , formTypeCheck {
88
+ // All default behaviors. Essentially legacy behavior.
89
+ // String
90
+ expectType (provider .ParameterFormTypeRadio , formTypeCheck {
80
91
options : true ,
81
92
optionType : provider .OptionTypeString ,
82
93
}),
83
- obvious (provider .ParameterFormTypeRadio , formTypeCheck {
84
- options : true ,
94
+ expectType (provider .ParameterFormTypeInput , formTypeCheck {
95
+ options : false ,
85
96
optionType : provider .OptionTypeString ,
86
- formType : provider .ParameterFormTypeRadio ,
87
97
}),
88
- obvious (provider .ParameterFormTypeDropdown , formTypeCheck {
98
+ // Number
99
+ expectType (provider .ParameterFormTypeRadio , formTypeCheck {
100
+ options : true ,
101
+ optionType : provider .OptionTypeNumber ,
102
+ }),
103
+ expectType (provider .ParameterFormTypeInput , formTypeCheck {
104
+ options : false ,
105
+ optionType : provider .OptionTypeNumber ,
106
+ }),
107
+ // Boolean
108
+ expectType (provider .ParameterFormTypeRadio , formTypeCheck {
109
+ options : true ,
110
+ optionType : provider .OptionTypeBoolean ,
111
+ }),
112
+ expectType (provider .ParameterFormTypeCheckbox , formTypeCheck {
113
+ options : false ,
114
+ optionType : provider .OptionTypeBoolean ,
115
+ }),
116
+ // List(string)
117
+ expectType (provider .ParameterFormTypeRadio , formTypeCheck {
118
+ options : true ,
119
+ optionType : provider .OptionTypeListString ,
120
+ }),
121
+ expectType (provider .ParameterFormTypeTagSelect , formTypeCheck {
122
+ options : false ,
123
+ optionType : provider .OptionTypeListString ,
124
+ }),
125
+
126
+ // ---- New Behavior
127
+ // String
128
+ obvious (formTypeCheck {
89
129
options : true ,
90
130
optionType : provider .OptionTypeString ,
91
131
formType : provider .ParameterFormTypeDropdown ,
92
132
}),
93
- obvious (provider .ParameterFormTypeInput , formTypeCheck {
133
+ obvious (formTypeCheck {
134
+ options : true ,
135
+ optionType : provider .OptionTypeString ,
136
+ formType : provider .ParameterFormTypeRadio ,
137
+ }),
138
+ obvious (formTypeCheck {
94
139
options : false ,
95
140
optionType : provider .OptionTypeString ,
141
+ formType : provider .ParameterFormTypeInput ,
96
142
}),
97
- obvious (provider . ParameterFormTypeTextArea , formTypeCheck {
143
+ obvious (formTypeCheck {
98
144
options : false ,
99
145
optionType : provider .OptionTypeString ,
100
146
formType : provider .ParameterFormTypeTextArea ,
101
147
}),
102
- // Numbers
103
- obvious (provider . ParameterFormTypeRadio , formTypeCheck {
148
+ // Number
149
+ obvious (formTypeCheck {
104
150
options : true ,
105
151
optionType : provider .OptionTypeNumber ,
152
+ formType : provider .ParameterFormTypeDropdown ,
106
153
}),
107
- obvious (provider . ParameterFormTypeRadio , formTypeCheck {
154
+ obvious (formTypeCheck {
108
155
options : true ,
109
156
optionType : provider .OptionTypeNumber ,
110
157
formType : provider .ParameterFormTypeRadio ,
111
158
}),
112
- obvious (provider .ParameterFormTypeDropdown , formTypeCheck {
113
- options : true ,
114
- optionType : provider .OptionTypeNumber ,
115
- formType : provider .ParameterFormTypeDropdown ,
116
- }),
117
- obvious (provider .ParameterFormTypeInput , formTypeCheck {
159
+ obvious (formTypeCheck {
118
160
options : false ,
119
161
optionType : provider .OptionTypeNumber ,
162
+ formType : provider .ParameterFormTypeInput ,
120
163
}),
121
- obvious (provider . ParameterFormTypeSlider , formTypeCheck {
164
+ obvious (formTypeCheck {
122
165
options : false ,
123
166
optionType : provider .OptionTypeNumber ,
124
167
formType : provider .ParameterFormTypeSlider ,
125
168
}),
126
- // booleans
127
- obvious (provider . ParameterFormTypeRadio , formTypeCheck {
169
+ // Boolean
170
+ obvious (formTypeCheck {
128
171
options : true ,
129
172
optionType : provider .OptionTypeBoolean ,
173
+ formType : provider .ParameterFormTypeRadio ,
130
174
}),
131
- obvious (provider . ParameterFormTypeCheckbox , formTypeCheck {
175
+ obvious (formTypeCheck {
132
176
options : false ,
133
177
optionType : provider .OptionTypeBoolean ,
178
+ formType : provider .ParameterFormTypeSwitch ,
134
179
}),
135
- obvious (provider . ParameterFormTypeCheckbox , formTypeCheck {
180
+ obvious (formTypeCheck {
136
181
options : false ,
137
182
optionType : provider .OptionTypeBoolean ,
138
183
formType : provider .ParameterFormTypeCheckbox ,
139
184
}),
140
- obvious (provider .ParameterFormTypeSwitch , formTypeCheck {
185
+ // List(string)
186
+ obvious (formTypeCheck {
187
+ options : true ,
188
+ optionType : provider .OptionTypeListString ,
189
+ formType : provider .ParameterFormTypeRadio ,
190
+ }),
191
+ obvious (formTypeCheck {
192
+ options : true ,
193
+ optionType : provider .OptionTypeListString ,
194
+ formType : provider .ParameterFormTypeMultiSelect ,
195
+ customOptions : []string {"red" , "blue" , "green" },
196
+ defValue : `["red", "blue"]` ,
197
+ }),
198
+ obvious (formTypeCheck {
141
199
options : false ,
142
- optionType : provider .OptionTypeBoolean ,
143
- formType : provider .ParameterFormTypeSwitch ,
200
+ optionType : provider .OptionTypeListString ,
201
+ formType : provider .ParameterFormTypeTagSelect ,
144
202
}),
145
203
}
146
204
147
- // TabledCases runs through all the manual test cases
148
- t . Run ( " TabledCases" , func ( t * testing. T ) {
205
+ t . Run ( "TabledTests" , func ( t * testing. T ) {
206
+ // TabledCases runs through all the manual test cases
149
207
for _ , c := range cases {
150
208
t .Run (c .name , func (t * testing.T ) {
151
209
t .Parallel ()
@@ -154,6 +212,10 @@ func TestValidateFormType(t *testing.T) {
154
212
}
155
213
156
214
formTypeTest (t , c )
215
+ if _ , ok := formTypesChecked [c .config .String ()]; ok {
216
+ t .Log ("Duplicated form type check, delete this extra test case" )
217
+ t .Fatalf ("form type %q already checked" , c .config .String ())
218
+ }
157
219
formTypesChecked [c .config .String ()] = struct {}{}
158
220
})
159
221
}
@@ -221,29 +283,33 @@ func TestValidateFormType(t *testing.T) {
221
283
})
222
284
}
223
285
224
- func ezconfig (paramName string , cfg formTypeCheck ) string {
286
+ func ezconfig (paramName string , cfg formTypeCheck ) ( defaultValue string , tf string ) {
225
287
var body strings.Builder
226
- // if cfg.Default != "" {
227
- // body.WriteString(fmt.Sprintf("default = %q\n", cfg.Default ))
228
- // }
288
+ if cfg .defValue != "" {
289
+ body .WriteString (fmt .Sprintf ("default = %q\n " , cfg .defValue ))
290
+ }
229
291
if cfg .formType != "" {
230
292
body .WriteString (fmt .Sprintf ("form_type = %q\n " , cfg .formType ))
231
293
}
232
294
if cfg .optionType != "" {
233
295
body .WriteString (fmt .Sprintf ("type = %q\n " , cfg .optionType ))
234
296
}
235
297
236
- var options [] string
237
- if cfg .options {
298
+ options := cfg . customOptions
299
+ if cfg .options && len ( cfg . customOptions ) == 0 {
238
300
switch cfg .optionType {
239
301
case provider .OptionTypeString :
240
302
options = []string {"foo" }
303
+ defaultValue = "foo"
241
304
case provider .OptionTypeBoolean :
242
305
options = []string {"true" , "false" }
306
+ defaultValue = "true"
243
307
case provider .OptionTypeNumber :
244
308
options = []string {"1" }
309
+ defaultValue = "1"
245
310
case provider .OptionTypeListString :
246
311
options = []string {`["red", "blue"]` }
312
+ defaultValue = `["red"]`
247
313
default :
248
314
panic (fmt .Sprintf ("unknown option type %q when generating options" , cfg .optionType ))
249
315
}
@@ -256,31 +322,33 @@ func ezconfig(paramName string, cfg formTypeCheck) string {
256
322
body .WriteString ("}\n " )
257
323
}
258
324
259
- return coderParamHCL (paramName , body .String ())
260
- }
261
-
262
- func coderParamHCL (paramName string , body string ) string {
263
- return fmt .Sprintf (`
325
+ if cfg .defValue == "" {
326
+ cfg .defValue = defaultValue
327
+ }
328
+ return cfg .defValue , fmt .Sprintf (`
264
329
provider "coder" {
265
330
}
266
331
data "coder_parameter" "%s" {
267
332
name = "%s"
268
333
%s
269
334
}
270
- ` , paramName , paramName , body )
335
+ ` , paramName , paramName , body . String () )
271
336
}
272
337
273
338
func formTypeTest (t * testing.T , c formTypeTestCase ) {
339
+ t .Helper ()
274
340
const paramName = "test_param"
275
341
342
+ def , tf := ezconfig (paramName , c .config )
343
+ t .Logf ("Terraform config:\n %s" , tf )
276
344
checkFn := func (state * terraform.State ) error {
277
345
require .Len (t , state .Modules , 1 )
278
346
require .Len (t , state .Modules [0 ].Resources , 1 )
279
347
280
348
key := strings .Join ([]string {"data" , "coder_parameter" , paramName }, "." )
281
349
param := state .Modules [0 ].Resources [key ]
282
350
283
- // assert.Equal(t, c.assert.Default , param.Primary.Attributes["default"], "default value")
351
+ assert .Equal (t , def , param .Primary .Attributes ["default" ], "default value" )
284
352
assert .Equal (t , string (c .assert .FormType ), param .Primary .Attributes ["form_type" ], "form_type" )
285
353
assert .Equal (t , string (c .assert .Type ), param .Primary .Attributes ["type" ], "type" )
286
354
assert .JSONEq (t , c .assert .Styling , param .Primary .Attributes ["styling" ], "styling" )
@@ -303,7 +371,7 @@ func formTypeTest(t *testing.T, c formTypeTestCase) {
303
371
ProviderFactories : coderFactory (),
304
372
Steps : []resource.TestStep {
305
373
{
306
- Config : ezconfig ( paramName , c . config ) ,
374
+ Config : tf ,
307
375
Check : checkFn ,
308
376
ExpectError : c .expectError ,
309
377
},
0 commit comments