Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9bb9a1f

Browse files
committed
begin adding invalid unit tests
1 parent875b316 commit9bb9a1f

File tree

2 files changed

+155
-33
lines changed

2 files changed

+155
-33
lines changed

‎provider/parameter.go

Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ const (
5050
)
5151

5252
typeParameterstruct {
53-
Valuestring
5453
Namestring
5554
DisplayNamestring`mapstructure:"display_name"`
5655
Descriptionstring
@@ -86,7 +85,6 @@ func parameterDataSource() *schema.Resource {
8685

8786
varparameterParameter
8887
err=mapstructure.Decode(struct {
89-
Valueinterface{}
9088
Nameinterface{}
9189
DisplayNameinterface{}
9290
Descriptioninterface{}
@@ -101,7 +99,6 @@ func parameterDataSource() *schema.Resource {
10199
Orderinterface{}
102100
Ephemeralinterface{}
103101
}{
104-
Value:rd.Get("value"),
105102
Name:rd.Get("name"),
106103
DisplayName:rd.Get("display_name"),
107104
Description:rd.Get("description"),
@@ -126,14 +123,7 @@ func parameterDataSource() *schema.Resource {
126123
iferr!=nil {
127124
returndiag.Errorf("decode parameter: %s",err)
128125
}
129-
varvaluestring
130-
ifparameter.Default!="" {
131-
err:=valueIsType(parameter.Type,parameter.Default,defaultValuePath)
132-
iferr!=nil {
133-
returnerr
134-
}
135-
value=parameter.Default
136-
}
126+
value:=parameter.Default
137127
envValue,ok:=os.LookupEnv(ParameterEnvironmentVariable(parameter.Name))
138128
ifok {
139129
value=envValue
@@ -381,27 +371,27 @@ func fixValidationResourceData(rawConfig cty.Value, validation interface{}) (int
381371
returnvArr,nil
382372
}
383373

384-
funcvalueIsType(typOptionType,valuestring,attrPath cty.Path) diag.Diagnostics {
374+
funcvalueIsType(typOptionType,valuestring)error {
385375
switchtyp {
386376
caseOptionTypeNumber:
387377
_,err:=strconv.ParseFloat(value,64)
388378
iferr!=nil {
389-
returndiag.Errorf("%q is not a number",value)
379+
returnfmt.Errorf("%q is not a number",value)
390380
}
391381
caseOptionTypeBoolean:
392382
_,err:=strconv.ParseBool(value)
393383
iferr!=nil {
394-
returndiag.Errorf("%q is not a bool",value)
384+
returnfmt.Errorf("%q is not a bool",value)
395385
}
396386
caseOptionTypeListString:
397-
_,diags:=valueIsListString(value,attrPath)
398-
ifdiags.HasError() {
399-
returndiags
387+
_,err:=valueIsListString(value)
388+
iferr!=nil {
389+
returnerr
400390
}
401391
caseOptionTypeString:
402392
// Anything is a string!
403393
default:
404-
returndiag.Errorf("invalid type %q",typ)
394+
returnfmt.Errorf("invalid type %q",typ)
405395
}
406396
returnnil
407397
}
@@ -447,9 +437,15 @@ func (v *Parameter) Valid(value string) diag.Diagnostics {
447437
},
448438
}
449439
}
450-
diags:=valueIsType(optionType,option.Value, cty.Path{})
451-
ifdiags.HasError() {
452-
returndiags
440+
err=valueIsType(optionType,option.Value)
441+
iferr!=nil {
442+
return diag.Diagnostics{
443+
{
444+
Severity:diag.Error,
445+
Summary:fmt.Sprintf("Option %q with value=%q is not of type %q",option.Name,option.Value,optionType),
446+
Detail:err.Error(),
447+
},
448+
}
453449
}
454450
optionValues[option.Value]=nil
455451
optionNames[option.Name]=nil
@@ -461,6 +457,18 @@ func (v *Parameter) Valid(value string) diag.Diagnostics {
461457

462458
// Validate the default value
463459
ifv.Default!="" {
460+
err:=valueIsType(v.Type,v.Default)
461+
iferr!=nil {
462+
return diag.Diagnostics{
463+
{
464+
Severity:diag.Error,
465+
Summary:fmt.Sprintf("Default value is not of type %q",v.Type),
466+
Detail:err.Error(),
467+
AttributePath:defaultValuePath,
468+
},
469+
}
470+
}
471+
464472
d:=v.validValue(v.Default,optionType,optionValues,defaultValuePath)
465473
ifd.HasError() {
466474
returnd
@@ -473,6 +481,17 @@ func (v *Parameter) Valid(value string) diag.Diagnostics {
473481
returnd
474482
}
475483

484+
err=valueIsType(v.Type,value)
485+
iferr!=nil {
486+
return diag.Diagnostics{
487+
{
488+
Severity:diag.Error,
489+
Summary:fmt.Sprintf("Parameter value is not of type %q",v.Type),
490+
Detail:err.Error(),
491+
},
492+
}
493+
}
494+
476495
returnnil
477496
}
478497

@@ -488,9 +507,16 @@ func (v *Parameter) validValue(value string, optionType OptionType, optionValues
488507
ifv.Type==OptionTypeListString&&optionType==OptionTypeString {
489508
// If the type is list(string) and optionType is string, we have
490509
// to ensure all elements of the default exist as options.
491-
listValues,diags:=valueIsListString(value,defaultValuePath)
492-
ifdiags.HasError() {
493-
returndiags
510+
listValues,err:=valueIsListString(value)
511+
iferr!=nil {
512+
return diag.Diagnostics{
513+
{
514+
Severity:diag.Error,
515+
Summary:"When using list(string) type, value must be a json encoded list of strings",
516+
Detail:err.Error(),
517+
AttributePath:defaultValuePath,
518+
},
519+
}
494520
}
495521

496522
// missing is used to construct a more helpful error message
@@ -608,18 +634,11 @@ func (v *Validation) Valid(typ OptionType, value string) error {
608634
returnnil
609635
}
610636

611-
funcvalueIsListString(valuestring,path cty.Path) ([]string,diag.Diagnostics) {
637+
funcvalueIsListString(valuestring) ([]string,error) {
612638
varitems []string
613639
err:=json.Unmarshal([]byte(value),&items)
614640
iferr!=nil {
615-
returnnil, diag.Diagnostics{
616-
{
617-
Severity:diag.Error,
618-
Summary:"When using list(string) type, value must be a json encoded list of strings",
619-
Detail:fmt.Sprintf("value %q is not a valid list of strings",value),
620-
AttributePath:path,
621-
},
622-
}
641+
returnnil,fmt.Errorf("value %q is not a valid list of strings",value)
623642
}
624643
returnitems,nil
625644
}

‎provider/parameter_test.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1212
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
13+
"github.com/stretchr/testify/assert"
1314
"github.com/stretchr/testify/require"
1415

1516
"github.com/coder/terraform-provider-coder/v2/provider"
@@ -688,6 +689,7 @@ data "coder_parameter" "region" {
688689
}
689690
}
690691

692+
<<<<<<<HEAD
691693
// TestParameterValidationEnforcement tests various parameter states and the
692694
// validation enforcement that should be applied to them. The table is described
693695
// by a markdown table. This is done so that the test cases can be more easily
@@ -896,6 +898,107 @@ func TestParameterValidationEnforcement(t *testing.T) {
896898
})
897899
})
898900
}
901+
=======
902+
funcTestParameterValidation(t*testing.T) {
903+
t.Parallel()
904+
opts:=func(vals...string) []provider.Option {
905+
options:=make([]provider.Option,0,len(vals))
906+
for_,val:=rangevals {
907+
options=append(options, provider.Option{
908+
Name:val,
909+
Value:val,
910+
})
911+
}
912+
returnoptions
913+
}
914+
915+
for_,tc:=range []struct {
916+
Namestring
917+
Parameter provider.Parameter
918+
Valuestring
919+
ExpectError*regexp.Regexp
920+
}{
921+
{
922+
Name:"ValidStringParameter",
923+
Parameter: provider.Parameter{
924+
Type:"string",
925+
},
926+
Value:"alpha",
927+
},
928+
// Test invalid states
929+
{
930+
Name:"InvalidFormType",
931+
Parameter: provider.Parameter{
932+
Type:"string",
933+
Option:opts("alpha","bravo","charlie"),
934+
FormType:provider.ParameterFormTypeSlider,
935+
},
936+
Value:"alpha",
937+
ExpectError:regexp.MustCompile("Invalid form_type for parameter"),
938+
},
939+
{
940+
Name:"NotInOptions",
941+
Parameter: provider.Parameter{
942+
Type:"string",
943+
Option:opts("alpha","bravo","charlie"),
944+
},
945+
Value:"delta",// not in option set
946+
ExpectError:regexp.MustCompile("Value must be a valid option"),
947+
},
948+
{
949+
Name:"NonUniqueOptionNames",
950+
Parameter: provider.Parameter{
951+
Type:"string",
952+
Option:opts("alpha","alpha"),
953+
},
954+
Value:"alpha",
955+
ExpectError:regexp.MustCompile("Option names must be unique"),
956+
},
957+
{
958+
Name:"NonUniqueOptionValues",
959+
Parameter: provider.Parameter{
960+
Type:"string",
961+
Option: []provider.Option{
962+
{Name:"Alpha",Value:"alpha"},
963+
{Name:"AlphaAgain",Value:"alpha"},
964+
},
965+
},
966+
Value:"alpha",
967+
ExpectError:regexp.MustCompile("Option values must be unique"),
968+
},
969+
{
970+
Name:"IncorrectValueTypeOption",
971+
Parameter: provider.Parameter{
972+
Type:"number",
973+
Option:opts("not-a-number"),
974+
},
975+
Value:"5",
976+
ExpectError:regexp.MustCompile("is not a number"),
977+
},
978+
{
979+
Name:"IncorrectValueType",
980+
Parameter: provider.Parameter{
981+
Type:"number",
982+
},
983+
Value:"not-a-number",
984+
ExpectError:regexp.MustCompile("Parameter value is not of type\"number\""),
985+
},
986+
} {
987+
tc:=tc
988+
t.Run(tc.Name,func(t*testing.T) {
989+
t.Parallel()
990+
diags:=tc.Parameter.Valid(tc.Value)
991+
iftc.ExpectError!=nil {
992+
require.True(t,diags.HasError())
993+
errMsg:=fmt.Sprintf("%+v",diags[0])// close enough
994+
require.Truef(t,tc.ExpectError.MatchString(errMsg),"got: %s",errMsg)
995+
}else {
996+
if!assert.False(t,diags.HasError()) {
997+
t.Logf("got: %+v",diags[0])
998+
}
999+
}
1000+
})
1001+
>>>>>>>c640b02 (beginaddinginvalidunittests)
8991002
}
9001003
}
9011004

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp