reverse call to TestConformance in objchange

The call to TestConformance needs to be reversed, since we want to
verify that the actual value returned conforms to the planned type.
While the inverse (checking that the planned value conforms to the
applied type) works for everything terraform has been exposed to up
until now, this fails when the planned type has dynamic attributes which
are allowed to become concrete types.
This commit is contained in:
James Bardin 2021-02-16 12:51:23 -05:00
parent 1ae3d30383
commit 22f21db229
2 changed files with 23 additions and 1 deletions

View File

@ -219,7 +219,7 @@ func assertValueCompatible(planned, actual cty.Value, path cty.Path) []error {
// Anything goes, then
return errs
}
if problems := planned.Type().TestConformance(actual.Type()); len(problems) > 0 {
if problems := actual.Type().TestConformance(planned.Type()); len(problems) > 0 {
errs = append(errs, path.NewErrorf("wrong final value type: %s", convert.MismatchMessage(actual.Type(), planned.Type())))
// If the types don't match then we can't do any other comparisons,
// so we bail early.

View File

@ -260,6 +260,28 @@ func TestAssertObjectCompatible(t *testing.T) {
}),
[]string{},
},
{
&configschema.Block{
Attributes: map[string]*configschema.Attribute{
"obj": {
Type: cty.Object(map[string]cty.Type{
"stuff": cty.DynamicPseudoType,
}),
},
},
},
cty.ObjectVal(map[string]cty.Value{
"obj": cty.ObjectVal(map[string]cty.Value{
"stuff": cty.DynamicVal,
}),
}),
cty.ObjectVal(map[string]cty.Value{
"obj": cty.ObjectVal(map[string]cty.Value{
"stuff": cty.NumberIntVal(3),
}),
}),
[]string{},
},
{
&configschema.Block{
Attributes: map[string]*configschema.Attribute{