Merge pull request #19950 from hashicorp/jbardin/resource-tests

Container checks in TestCheckFuncs
This commit is contained in:
James Bardin 2019-01-09 14:26:08 -05:00 committed by GitHub
commit 35365e8ccf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 88 additions and 1 deletions

View File

@ -971,7 +971,19 @@ func TestCheckModuleResourceAttr(mp []string, name string, key string, value str
}
func testCheckResourceAttr(is *terraform.InstanceState, name string, key string, value string) error {
// Empty containers may be elided from the state.
// If the intent here is to check for an empty container, allow the key to
// also be non-existent.
emptyCheck := false
if value == "0" && (strings.HasSuffix(key, ".#") || strings.HasSuffix(key, ".%")) {
emptyCheck = true
}
if v, ok := is.Attributes[key]; !ok || v != value {
if emptyCheck && !ok {
return nil
}
if !ok {
return fmt.Errorf("%s: Attribute '%s' not found", name, key)
}
@ -1014,7 +1026,20 @@ func TestCheckModuleNoResourceAttr(mp []string, name string, key string) TestChe
}
func testCheckNoResourceAttr(is *terraform.InstanceState, name string, key string) error {
if _, ok := is.Attributes[key]; ok {
// Empty containers may sometimes be included in the state.
// If the intent here is to check for an empty container, allow the value to
// also be "0".
emptyCheck := false
if strings.HasSuffix(key, ".#") || strings.HasSuffix(key, ".%") {
emptyCheck = true
}
val, exists := is.Attributes[key]
if emptyCheck && val == "0" {
return nil
}
if exists {
return fmt.Errorf("%s: Attribute '%s' found when not expected", name, key)
}

View File

@ -1113,3 +1113,65 @@ resource "test_instance" "foo" {}
const testConfigStrProvider = `
provider "test" {}
`
func TestCheckResourceAttr_empty(t *testing.T) {
s := terraform.NewState()
s.AddModuleState(&terraform.ModuleState{
Path: []string{"root"},
Resources: map[string]*terraform.ResourceState{
"test_resource": &terraform.ResourceState{
Primary: &terraform.InstanceState{
Attributes: map[string]string{
"empty_list.#": "0",
"empty_map.%": "0",
},
},
},
},
})
for _, key := range []string{
"empty_list.#",
"empty_map.%",
"missing_list.#",
"missing_map.%",
} {
t.Run(key, func(t *testing.T) {
check := TestCheckResourceAttr("test_resource", key, "0")
if err := check(s); err != nil {
t.Fatal(err)
}
})
}
}
func TestCheckNoResourceAttr_empty(t *testing.T) {
s := terraform.NewState()
s.AddModuleState(&terraform.ModuleState{
Path: []string{"root"},
Resources: map[string]*terraform.ResourceState{
"test_resource": &terraform.ResourceState{
Primary: &terraform.InstanceState{
Attributes: map[string]string{
"empty_list.#": "0",
"empty_map.%": "0",
},
},
},
},
})
for _, key := range []string{
"empty_list.#",
"empty_map.%",
"missing_list.#",
"missing_map.%",
} {
t.Run(key, func(t *testing.T) {
check := TestCheckNoResourceAttr("test_resource", key)
if err := check(s); err != nil {
t.Fatal(err)
}
})
}
}