Skip to content

Commit cd52cae

Browse files
committed
finish all table test cases
1 parent c0be472 commit cd52cae

File tree

2 files changed

+118
-48
lines changed

2 files changed

+118
-48
lines changed

provider/formtype.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import (
88

99
// OptionType is a type of option that can be used in the 'type' argument of
1010
// a parameter. These should match types as defined in terraform:
11-
// https://developer.hashicorp.com/terraform/language/expressions/types
11+
//
12+
// https://developer.hashicorp.com/terraform/language/expressions/types
13+
//
1214
// The value have to be string literals, as type constraint keywords are not
1315
// supported in providers. :'(
1416
type OptionType string
@@ -127,7 +129,7 @@ func ValidateFormType(paramType OptionType, optionCount int, specifiedFormType P
127129

128130
// Special case
129131
if paramType == OptionTypeListString && specifiedFormType == ParameterFormTypeMultiSelect {
130-
return OptionTypeListString, ParameterFormTypeMultiSelect, nil
132+
return OptionTypeString, ParameterFormTypeMultiSelect, nil
131133
}
132134

133135
return paramType, specifiedFormType, nil

provider/formtype_test.go

+114-46
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ type paramAssert struct {
2828
}
2929

3030
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
3436
}
3537

3638
func (c formTypeCheck) String() string {
@@ -40,10 +42,12 @@ func (c formTypeCheck) String() string {
4042
func TestValidateFormType(t *testing.T) {
4143
t.Parallel()
4244

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.
4448
formTypesChecked := make(map[string]struct{})
4549

46-
obvious := func(expected provider.ParameterFormType, opts formTypeCheck) formTypeTestCase {
50+
expectType := func(expected provider.ParameterFormType, opts formTypeCheck) formTypeTestCase {
4751
ftname := opts.formType
4852
if ftname == "" {
4953
ftname = "default"
@@ -64,6 +68,12 @@ func TestValidateFormType(t *testing.T) {
6468
}
6569
}
6670

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+
6777
cases := []formTypeTestCase{
6878
{
6979
// When nothing is specified
@@ -75,77 +85,125 @@ func TestValidateFormType(t *testing.T) {
7585
Styling: "",
7686
},
7787
},
78-
// String
79-
obvious(provider.ParameterFormTypeRadio, formTypeCheck{
88+
// All default behaviors. Essentially legacy behavior.
89+
// String
90+
expectType(provider.ParameterFormTypeRadio, formTypeCheck{
8091
options: true,
8192
optionType: provider.OptionTypeString,
8293
}),
83-
obvious(provider.ParameterFormTypeRadio, formTypeCheck{
84-
options: true,
94+
expectType(provider.ParameterFormTypeInput, formTypeCheck{
95+
options: false,
8596
optionType: provider.OptionTypeString,
86-
formType: provider.ParameterFormTypeRadio,
8797
}),
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{
89129
options: true,
90130
optionType: provider.OptionTypeString,
91131
formType: provider.ParameterFormTypeDropdown,
92132
}),
93-
obvious(provider.ParameterFormTypeInput, formTypeCheck{
133+
obvious(formTypeCheck{
134+
options: true,
135+
optionType: provider.OptionTypeString,
136+
formType: provider.ParameterFormTypeRadio,
137+
}),
138+
obvious(formTypeCheck{
94139
options: false,
95140
optionType: provider.OptionTypeString,
141+
formType: provider.ParameterFormTypeInput,
96142
}),
97-
obvious(provider.ParameterFormTypeTextArea, formTypeCheck{
143+
obvious(formTypeCheck{
98144
options: false,
99145
optionType: provider.OptionTypeString,
100146
formType: provider.ParameterFormTypeTextArea,
101147
}),
102-
// Numbers
103-
obvious(provider.ParameterFormTypeRadio, formTypeCheck{
148+
// Number
149+
obvious(formTypeCheck{
104150
options: true,
105151
optionType: provider.OptionTypeNumber,
152+
formType: provider.ParameterFormTypeDropdown,
106153
}),
107-
obvious(provider.ParameterFormTypeRadio, formTypeCheck{
154+
obvious(formTypeCheck{
108155
options: true,
109156
optionType: provider.OptionTypeNumber,
110157
formType: provider.ParameterFormTypeRadio,
111158
}),
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{
118160
options: false,
119161
optionType: provider.OptionTypeNumber,
162+
formType: provider.ParameterFormTypeInput,
120163
}),
121-
obvious(provider.ParameterFormTypeSlider, formTypeCheck{
164+
obvious(formTypeCheck{
122165
options: false,
123166
optionType: provider.OptionTypeNumber,
124167
formType: provider.ParameterFormTypeSlider,
125168
}),
126-
// booleans
127-
obvious(provider.ParameterFormTypeRadio, formTypeCheck{
169+
// Boolean
170+
obvious(formTypeCheck{
128171
options: true,
129172
optionType: provider.OptionTypeBoolean,
173+
formType: provider.ParameterFormTypeRadio,
130174
}),
131-
obvious(provider.ParameterFormTypeCheckbox, formTypeCheck{
175+
obvious(formTypeCheck{
132176
options: false,
133177
optionType: provider.OptionTypeBoolean,
178+
formType: provider.ParameterFormTypeSwitch,
134179
}),
135-
obvious(provider.ParameterFormTypeCheckbox, formTypeCheck{
180+
obvious(formTypeCheck{
136181
options: false,
137182
optionType: provider.OptionTypeBoolean,
138183
formType: provider.ParameterFormTypeCheckbox,
139184
}),
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{
141199
options: false,
142-
optionType: provider.OptionTypeBoolean,
143-
formType: provider.ParameterFormTypeSwitch,
200+
optionType: provider.OptionTypeListString,
201+
formType: provider.ParameterFormTypeTagSelect,
144202
}),
145203
}
146204

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
149207
for _, c := range cases {
150208
t.Run(c.name, func(t *testing.T) {
151209
t.Parallel()
@@ -154,6 +212,10 @@ func TestValidateFormType(t *testing.T) {
154212
}
155213

156214
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+
}
157219
formTypesChecked[c.config.String()] = struct{}{}
158220
})
159221
}
@@ -221,29 +283,33 @@ func TestValidateFormType(t *testing.T) {
221283
})
222284
}
223285

224-
func ezconfig(paramName string, cfg formTypeCheck) string {
286+
func ezconfig(paramName string, cfg formTypeCheck) (defaultValue string, tf string) {
225287
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+
}
229291
if cfg.formType != "" {
230292
body.WriteString(fmt.Sprintf("form_type = %q\n", cfg.formType))
231293
}
232294
if cfg.optionType != "" {
233295
body.WriteString(fmt.Sprintf("type = %q\n", cfg.optionType))
234296
}
235297

236-
var options []string
237-
if cfg.options {
298+
options := cfg.customOptions
299+
if cfg.options && len(cfg.customOptions) == 0 {
238300
switch cfg.optionType {
239301
case provider.OptionTypeString:
240302
options = []string{"foo"}
303+
defaultValue = "foo"
241304
case provider.OptionTypeBoolean:
242305
options = []string{"true", "false"}
306+
defaultValue = "true"
243307
case provider.OptionTypeNumber:
244308
options = []string{"1"}
309+
defaultValue = "1"
245310
case provider.OptionTypeListString:
246311
options = []string{`["red", "blue"]`}
312+
defaultValue = `["red"]`
247313
default:
248314
panic(fmt.Sprintf("unknown option type %q when generating options", cfg.optionType))
249315
}
@@ -256,31 +322,33 @@ func ezconfig(paramName string, cfg formTypeCheck) string {
256322
body.WriteString("}\n")
257323
}
258324

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(`
264329
provider "coder" {
265330
}
266331
data "coder_parameter" "%s" {
267332
name = "%s"
268333
%s
269334
}
270-
`, paramName, paramName, body)
335+
`, paramName, paramName, body.String())
271336
}
272337

273338
func formTypeTest(t *testing.T, c formTypeTestCase) {
339+
t.Helper()
274340
const paramName = "test_param"
275341

342+
def, tf := ezconfig(paramName, c.config)
343+
t.Logf("Terraform config:\n%s", tf)
276344
checkFn := func(state *terraform.State) error {
277345
require.Len(t, state.Modules, 1)
278346
require.Len(t, state.Modules[0].Resources, 1)
279347

280348
key := strings.Join([]string{"data", "coder_parameter", paramName}, ".")
281349
param := state.Modules[0].Resources[key]
282350

283-
//assert.Equal(t, c.assert.Default, param.Primary.Attributes["default"], "default value")
351+
assert.Equal(t, def, param.Primary.Attributes["default"], "default value")
284352
assert.Equal(t, string(c.assert.FormType), param.Primary.Attributes["form_type"], "form_type")
285353
assert.Equal(t, string(c.assert.Type), param.Primary.Attributes["type"], "type")
286354
assert.JSONEq(t, c.assert.Styling, param.Primary.Attributes["styling"], "styling")
@@ -303,7 +371,7 @@ func formTypeTest(t *testing.T, c formTypeTestCase) {
303371
ProviderFactories: coderFactory(),
304372
Steps: []resource.TestStep{
305373
{
306-
Config: ezconfig(paramName, c.config),
374+
Config: tf,
307375
Check: checkFn,
308376
ExpectError: c.expectError,
309377
},

0 commit comments

Comments
 (0)