diff --git a/helper/schema/schema.go b/helper/schema/schema.go index ac55d7624..9f103d185 100644 --- a/helper/schema/schema.go +++ b/helper/schema/schema.go @@ -477,7 +477,9 @@ func (m schemaMap) Input( // Skip things that don't require config, if that is even valid // for a provider schema. - if !v.Required && !v.Optional { + // Required XOR Optional must always be true to validate, so we only + // need to check one. + if v.Optional { continue } diff --git a/helper/schema/schema_test.go b/helper/schema/schema_test.go index 031b0100e..2d79341b3 100644 --- a/helper/schema/schema_test.go +++ b/helper/schema/schema_test.go @@ -3173,7 +3173,7 @@ func TestSchemaMap_Input(t *testing.T) { * String decode */ - "uses input on optional field with no config": { + "no input on optional field with no config": { Schema: map[string]*Schema{ "availability_zone": &Schema{ Type: TypeString, @@ -3181,15 +3181,9 @@ func TestSchemaMap_Input(t *testing.T) { }, }, - Input: map[string]string{ - "availability_zone": "foo", - }, - - Result: map[string]interface{}{ - "availability_zone": "foo", - }, - - Err: false, + Input: map[string]string{}, + Result: map[string]interface{}{}, + Err: false, }, "input ignored when config has a value": { @@ -3276,7 +3270,7 @@ func TestSchemaMap_Input(t *testing.T) { DefaultFunc: func() (interface{}, error) { return nil, nil }, - Optional: true, + Required: true, }, }, @@ -3290,6 +3284,22 @@ func TestSchemaMap_Input(t *testing.T) { Err: false, }, + + "input not used when optional default function returns nil": { + Schema: map[string]*Schema{ + "availability_zone": &Schema{ + Type: TypeString, + DefaultFunc: func() (interface{}, error) { + return nil, nil + }, + Optional: true, + }, + }, + + Input: map[string]string{}, + Result: map[string]interface{}{}, + Err: false, + }, } for i, tc := range cases {