helper/schema: skip StateFunc when value is nil

This takes the nil checking burden off of StateFunc.

fixes #3586, see that issue for further discussion
This commit is contained in:
Paul Hinze 2015-11-20 14:02:20 -06:00
parent 5ec446718a
commit c7dc1c10a3
2 changed files with 32 additions and 2 deletions

View File

@ -919,7 +919,7 @@ func (m schemaMap) diffString(
var originalN interface{}
var os, ns string
o, n, _, _ := d.diffChange(k)
if schema.StateFunc != nil {
if schema.StateFunc != nil && n != nil {
originalN = n
n = schema.StateFunc(n)
}

View File

@ -321,7 +321,7 @@ func TestSchemaMap_Diff(t *testing.T) {
Err: false,
},
"#7 String with StateFunc": {
"String with StateFunc": {
Schema: map[string]*Schema{
"availability_zone": &Schema{
Type: TypeString,
@ -352,6 +352,36 @@ func TestSchemaMap_Diff(t *testing.T) {
Err: false,
},
"StateFunc not called with nil value": {
Schema: map[string]*Schema{
"availability_zone": &Schema{
Type: TypeString,
Optional: true,
Computed: true,
StateFunc: func(a interface{}) string {
t.Fatalf("should not get here!")
return ""
},
},
},
State: nil,
Config: map[string]interface{}{},
Diff: &terraform.InstanceDiff{
Attributes: map[string]*terraform.ResourceAttrDiff{
"availability_zone": &terraform.ResourceAttrDiff{
Old: "",
New: "",
NewComputed: true,
},
},
},
Err: false,
},
"#8 Variable (just checking)": {
Schema: map[string]*Schema{
"availability_zone": &Schema{