terraform-provider-google/google/test_utils.go
The Magician 78238d1ed6 update data source tests that compare lists of fields to compare all fields (#3652)
Signed-off-by: Modular Magician <magic-modules@google.com>
2019-05-20 16:11:01 -07:00

113 lines
2.6 KiB
Go

package google
import (
"fmt"
"reflect"
"strconv"
"github.com/hashicorp/terraform/terraform"
)
type ResourceDataMock struct {
FieldsInSchema map[string]interface{}
FieldsWithHasChange []string
id string
}
func (d *ResourceDataMock) HasChange(key string) bool {
exists := false
for _, val := range d.FieldsWithHasChange {
if key == val {
exists = true
}
}
return exists
}
func (d *ResourceDataMock) Get(key string) interface{} {
v, _ := d.GetOk(key)
return v
}
func (d *ResourceDataMock) GetOk(key string) (interface{}, bool) {
v, ok := d.GetOkExists(key)
if ok && !isEmptyValue(reflect.ValueOf(v)) {
return v, true
} else {
return v, false
}
}
func (d *ResourceDataMock) GetOkExists(key string) (interface{}, bool) {
for k, v := range d.FieldsInSchema {
if key == k {
return v, true
}
}
return nil, false
}
func (d *ResourceDataMock) Set(key string, value interface{}) error {
d.FieldsInSchema[key] = value
return nil
}
func (d *ResourceDataMock) SetId(v string) {
d.id = v
}
func (d *ResourceDataMock) Id() string {
return d.id
}
func toBool(attribute string) (bool, error) {
// Handle the case where an unset value defaults to false
if attribute == "" {
return false, nil
}
return strconv.ParseBool(attribute)
}
func checkDataSourceStateMatchesResourceState(dataSourceName, resourceName string) func(*terraform.State) error {
return checkDataSourceStateMatchesResourceStateWithIgnores(dataSourceName, resourceName, map[string]struct{}{})
}
func checkDataSourceStateMatchesResourceStateWithIgnores(dataSourceName, resourceName string, ignoreFields map[string]struct{}) func(*terraform.State) error {
return func(s *terraform.State) error {
ds, ok := s.RootModule().Resources[dataSourceName]
if !ok {
return fmt.Errorf("can't find %s in state", dataSourceName)
}
rs, ok := s.RootModule().Resources[resourceName]
if !ok {
return fmt.Errorf("can't find %s in state", resourceName)
}
dsAttr := ds.Primary.Attributes
rsAttr := rs.Primary.Attributes
errMsg := ""
// Data sources are often derived from resources, so iterate over the resource fields to
// make sure all fields are accounted for in the data source.
// If a field exists in the data source but not in the resource, its expected value should
// be checked separately.
for k := range rsAttr {
if _, ok := ignoreFields[k]; ok {
continue
}
if dsAttr[k] != rsAttr[k] {
errMsg += fmt.Sprintf("%s is %s; want %s\n", k, dsAttr[k], rsAttr[k])
}
}
if errMsg != "" {
return fmt.Errorf(errMsg)
}
return nil
}
}