mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
a9a9cdaa15
Since our ignoring is now implemented in terms of cty objects and HCL traversals, rather than flatmap keys, it no longer makes sense to test for the flatmap detail of keeping the map count in a separate key. It _does_ make sense to ignore an entire block or map, but that's already covered by another existing tests for just []string{"resource"} above.
186 lines
3.8 KiB
Go
186 lines
3.8 KiB
Go
package terraform
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/hcl2/hcl/hclsyntax"
|
|
|
|
"github.com/hashicorp/hcl2/hcl"
|
|
"github.com/hashicorp/terraform/configs"
|
|
)
|
|
|
|
func TestEvalFilterDiff(t *testing.T) {
|
|
ctx := new(MockEvalContext)
|
|
|
|
cases := []struct {
|
|
Node *EvalFilterDiff
|
|
Input *InstanceDiff
|
|
Output *InstanceDiff
|
|
}{
|
|
// With no settings, it returns an empty diff
|
|
{
|
|
&EvalFilterDiff{},
|
|
&InstanceDiff{Destroy: true},
|
|
&InstanceDiff{},
|
|
},
|
|
|
|
// Destroy
|
|
{
|
|
&EvalFilterDiff{Destroy: true},
|
|
&InstanceDiff{Destroy: false},
|
|
&InstanceDiff{Destroy: false},
|
|
},
|
|
{
|
|
&EvalFilterDiff{Destroy: true},
|
|
&InstanceDiff{Destroy: true},
|
|
&InstanceDiff{Destroy: true},
|
|
},
|
|
{
|
|
&EvalFilterDiff{Destroy: true},
|
|
&InstanceDiff{
|
|
Destroy: true,
|
|
Attributes: map[string]*ResourceAttrDiff{
|
|
"foo": &ResourceAttrDiff{},
|
|
},
|
|
},
|
|
&InstanceDiff{Destroy: true},
|
|
},
|
|
{
|
|
&EvalFilterDiff{Destroy: true},
|
|
&InstanceDiff{
|
|
Attributes: map[string]*ResourceAttrDiff{
|
|
"foo": &ResourceAttrDiff{
|
|
RequiresNew: true,
|
|
},
|
|
},
|
|
},
|
|
&InstanceDiff{Destroy: true},
|
|
},
|
|
{
|
|
&EvalFilterDiff{Destroy: true},
|
|
&InstanceDiff{
|
|
Attributes: map[string]*ResourceAttrDiff{
|
|
"foo": &ResourceAttrDiff{},
|
|
},
|
|
},
|
|
&InstanceDiff{Destroy: false},
|
|
},
|
|
}
|
|
|
|
for i, tc := range cases {
|
|
var output *InstanceDiff
|
|
tc.Node.Diff = &tc.Input
|
|
tc.Node.Output = &output
|
|
if _, err := tc.Node.Eval(ctx); err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(output, tc.Output) {
|
|
t.Fatalf("bad: %d\n\n%#v", i, output)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestProcessIgnoreChanges(t *testing.T) {
|
|
var evalDiff *EvalDiff
|
|
var instanceDiff *InstanceDiff
|
|
|
|
var testDiffs = func(t *testing.T, ignoreChanges []string, newAttribute string) (*EvalDiff, *InstanceDiff) {
|
|
ignoreChangesTravs := make([]hcl.Traversal, len(ignoreChanges))
|
|
for i, s := range ignoreChanges {
|
|
traversal, travDiags := hclsyntax.ParseTraversalAbs([]byte(s), "", hcl.Pos{Line: 1, Column: 1})
|
|
if travDiags.HasErrors() {
|
|
t.Fatal(travDiags.Error())
|
|
}
|
|
ignoreChangesTravs[i] = traversal
|
|
}
|
|
|
|
return &EvalDiff{
|
|
Config: &configs.Resource{
|
|
Managed: &configs.ManagedResource{
|
|
IgnoreChanges: ignoreChangesTravs,
|
|
},
|
|
},
|
|
},
|
|
&InstanceDiff{
|
|
Destroy: true,
|
|
Attributes: map[string]*ResourceAttrDiff{
|
|
"resource.%": {
|
|
Old: "3",
|
|
New: "3",
|
|
},
|
|
"resource.changed": {
|
|
RequiresNew: true,
|
|
Type: DiffAttrInput,
|
|
Old: "old",
|
|
New: "new",
|
|
},
|
|
"resource.maybe": {
|
|
Old: "",
|
|
New: newAttribute,
|
|
},
|
|
"resource.same": {
|
|
Old: "same",
|
|
New: "same",
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|
|
for i, tc := range []struct {
|
|
ignore []string
|
|
newAttr string
|
|
attrDiffs int
|
|
}{
|
|
// attr diffs should be all (4), or nothing
|
|
{
|
|
ignore: []string{"resource.changed"},
|
|
attrDiffs: 0,
|
|
},
|
|
{
|
|
ignore: []string{"resource.changed"},
|
|
newAttr: "new",
|
|
attrDiffs: 4,
|
|
},
|
|
{
|
|
attrDiffs: 4,
|
|
},
|
|
{
|
|
ignore: []string{"resource.maybe"},
|
|
newAttr: "new",
|
|
attrDiffs: 4,
|
|
},
|
|
{
|
|
newAttr: "new",
|
|
attrDiffs: 4,
|
|
},
|
|
{
|
|
ignore: []string{"resource"},
|
|
newAttr: "new",
|
|
attrDiffs: 0,
|
|
},
|
|
{
|
|
// extra ignored values shouldn't affect the diff
|
|
ignore: []string{"resource.missing", "resource.maybe"},
|
|
newAttr: "new",
|
|
attrDiffs: 4,
|
|
},
|
|
} {
|
|
t.Run(fmt.Sprintf("%d", i), func(t *testing.T) {
|
|
evalDiff, instanceDiff = testDiffs(t, tc.ignore, tc.newAttr)
|
|
err := evalDiff.processIgnoreChanges(instanceDiff)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
if len(instanceDiff.Attributes) != tc.attrDiffs {
|
|
t.Errorf("expected %d diffs, found %d", tc.attrDiffs, len(instanceDiff.Attributes))
|
|
for k, attr := range instanceDiff.Attributes {
|
|
fmt.Printf(" %s:%#v\n", k, attr)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|