From efd0f5b0dbdcc79440e2ecc40d280d4419a9650c Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 17 Mar 2017 14:43:37 -0400 Subject: [PATCH] Fix logic when skipping schema input The Required||Optional logic in schemaMap.Input was incorrect, causing it to always request input. Fix the logic, and the associated tests which were passing "just because". --- helper/schema/schema.go | 4 +++- helper/schema/schema_test.go | 32 +++++++++++++++++++++----------- 2 files changed, 24 insertions(+), 12 deletions(-) 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 {