github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/instances/set_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package instances
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/terramate-io/tf/addrs"
    10  	"github.com/zclconf/go-cty/cty"
    11  )
    12  
    13  func TestSet(t *testing.T) {
    14  	exp := NewExpander()
    15  
    16  	// The following constructs the following imaginary module/resource tree:
    17  	// - root module
    18  	//   - test_thing.single: no repetition
    19  	//   - test_thing.count: count = 1
    20  	//   - test_thing.for_each: for_each = { c = "C" }
    21  	//   - module.single: no repetition
    22  	//     - test_thing.single: no repetition
    23  	//     - module.nested_single: no repetition
    24  	//       - module.zero_count: count = 0
    25  	//   - module.count: count = 2
    26  	//     - module.nested_for_each: [0] for_each = {}, [1] for_each = { e = "E" }
    27  	//   - module.for_each: for_each = { a = "A", b = "B" }
    28  	//     - test_thing.count: ["a"] count = 0, ["b"] count = 1
    29  	exp.SetModuleSingle(addrs.RootModuleInstance, addrs.ModuleCall{Name: "single"})
    30  	exp.SetModuleCount(addrs.RootModuleInstance, addrs.ModuleCall{Name: "count"}, 2)
    31  	exp.SetModuleForEach(addrs.RootModuleInstance, addrs.ModuleCall{Name: "for_each"}, map[string]cty.Value{
    32  		"a": cty.StringVal("A"),
    33  		"b": cty.StringVal("B"),
    34  	})
    35  	exp.SetModuleSingle(addrs.RootModuleInstance.Child("single", addrs.NoKey), addrs.ModuleCall{Name: "nested_single"})
    36  	exp.SetModuleForEach(addrs.RootModuleInstance.Child("count", addrs.IntKey(0)), addrs.ModuleCall{Name: "nested_for_each"}, nil)
    37  	exp.SetModuleForEach(addrs.RootModuleInstance.Child("count", addrs.IntKey(1)), addrs.ModuleCall{Name: "nested_for_each"}, map[string]cty.Value{
    38  		"e": cty.StringVal("E"),
    39  	})
    40  	exp.SetModuleCount(
    41  		addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nested_single", addrs.NoKey),
    42  		addrs.ModuleCall{Name: "zero_count"},
    43  		0,
    44  	)
    45  
    46  	rAddr := func(name string) addrs.Resource {
    47  		return addrs.Resource{
    48  			Mode: addrs.ManagedResourceMode,
    49  			Type: "test_thing",
    50  			Name: name,
    51  		}
    52  	}
    53  	exp.SetResourceSingle(addrs.RootModuleInstance, rAddr("single"))
    54  	exp.SetResourceCount(addrs.RootModuleInstance, rAddr("count"), 1)
    55  	exp.SetResourceForEach(addrs.RootModuleInstance, rAddr("for_each"), map[string]cty.Value{
    56  		"c": cty.StringVal("C"),
    57  	})
    58  	exp.SetResourceSingle(addrs.RootModuleInstance.Child("single", addrs.NoKey), rAddr("single"))
    59  	exp.SetResourceCount(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("a")), rAddr("count"), 0)
    60  	exp.SetResourceCount(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("b")), rAddr("count"), 1)
    61  
    62  	set := exp.AllInstances()
    63  
    64  	// HasModuleInstance tests
    65  	if input := addrs.RootModuleInstance; !set.HasModuleInstance(input) {
    66  		t.Errorf("missing %T %s", input, input.String())
    67  	}
    68  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey); !set.HasModuleInstance(input) {
    69  		t.Errorf("missing %T %s", input, input.String())
    70  	}
    71  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nested_single", addrs.NoKey); !set.HasModuleInstance(input) {
    72  		t.Errorf("missing %T %s", input, input.String())
    73  	}
    74  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(0)); !set.HasModuleInstance(input) {
    75  		t.Errorf("missing %T %s", input, input.String())
    76  	}
    77  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(1)); !set.HasModuleInstance(input) {
    78  		t.Errorf("missing %T %s", input, input.String())
    79  	}
    80  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(1)).Child("nested_for_each", addrs.StringKey("e")); !set.HasModuleInstance(input) {
    81  		t.Errorf("missing %T %s", input, input.String())
    82  	}
    83  	if input := addrs.RootModuleInstance.Child("for_each", addrs.StringKey("a")); !set.HasModuleInstance(input) {
    84  		t.Errorf("missing %T %s", input, input.String())
    85  	}
    86  	if input := addrs.RootModuleInstance.Child("for_each", addrs.StringKey("b")); !set.HasModuleInstance(input) {
    87  		t.Errorf("missing %T %s", input, input.String())
    88  	}
    89  	if input := addrs.RootModuleInstance.Child("single", addrs.IntKey(0)); set.HasModuleInstance(input) {
    90  		t.Errorf("unexpected %T %s", input, input.String())
    91  	}
    92  	if input := addrs.RootModuleInstance.Child("single", addrs.StringKey("a")); set.HasModuleInstance(input) {
    93  		t.Errorf("unexpected %T %s", input, input.String())
    94  	}
    95  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nonexist", addrs.NoKey); set.HasModuleInstance(input) {
    96  		t.Errorf("unexpected %T %s", input, input.String())
    97  	}
    98  	if input := addrs.RootModuleInstance.Child("count", addrs.NoKey); set.HasModuleInstance(input) {
    99  		t.Errorf("unexpected %T %s", input, input.String())
   100  	}
   101  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(2)); set.HasModuleInstance(input) {
   102  		t.Errorf("unexpected %T %s", input, input.String())
   103  	}
   104  	if input := addrs.RootModuleInstance.Child("count", addrs.StringKey("a")); set.HasModuleInstance(input) {
   105  		t.Errorf("unexpected %T %s", input, input.String())
   106  	}
   107  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(0)).Child("nested_for_each", addrs.StringKey("e")); set.HasModuleInstance(input) {
   108  		t.Errorf("unexpected %T %s", input, input.String())
   109  	}
   110  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nested_single", addrs.NoKey).Child("zero_count", addrs.NoKey); set.HasModuleInstance(input) {
   111  		t.Errorf("unexpected %T %s", input, input.String())
   112  	}
   113  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nested_single", addrs.NoKey).Child("zero_count", addrs.IntKey(0)); set.HasModuleInstance(input) {
   114  		t.Errorf("unexpected %T %s", input, input.String())
   115  	}
   116  
   117  	// HasModuleCall tests
   118  	if input := addrs.RootModuleInstance.ChildCall("single"); !set.HasModuleCall(input) {
   119  		t.Errorf("missing %T %s", input, input.String())
   120  	}
   121  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).ChildCall("nested_single"); !set.HasModuleCall(input) {
   122  		t.Errorf("missing %T %s", input, input.String())
   123  	}
   124  	if input := addrs.RootModuleInstance.ChildCall("count"); !set.HasModuleCall(input) {
   125  		t.Errorf("missing %T %s", input, input.String())
   126  	}
   127  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(0)).ChildCall("nested_for_each"); !set.HasModuleCall(input) {
   128  		t.Errorf("missing %T %s", input, input.String())
   129  	}
   130  	if input := addrs.RootModuleInstance.Child("count", addrs.IntKey(1)).ChildCall("nested_for_each"); !set.HasModuleCall(input) {
   131  		t.Errorf("missing %T %s", input, input.String())
   132  	}
   133  	if input := addrs.RootModuleInstance.ChildCall("for_each"); !set.HasModuleCall(input) {
   134  		t.Errorf("missing %T %s", input, input.String())
   135  	}
   136  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).Child("nested_single", addrs.NoKey).ChildCall("zero_count"); !set.HasModuleCall(input) {
   137  		t.Errorf("missing %T %s", input, input.String())
   138  	}
   139  	if input := addrs.RootModuleInstance.ChildCall("nonexist"); set.HasModuleCall(input) {
   140  		t.Errorf("unexpected %T %s", input, input.String())
   141  	}
   142  	if input := addrs.RootModuleInstance.Child("single", addrs.NoKey).ChildCall("nonexist"); set.HasModuleCall(input) {
   143  		t.Errorf("unexpected %T %s", input, input.String())
   144  	}
   145  
   146  	// HasResourceInstance tests
   147  	if input := rAddr("single").Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance); !set.HasResourceInstance(input) {
   148  		t.Errorf("missing %T %s", input, input.String())
   149  	}
   150  	if input := rAddr("count").Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance); !set.HasResourceInstance(input) {
   151  		t.Errorf("missing %T %s", input, input.String())
   152  	}
   153  	if input := rAddr("for_each").Instance(addrs.StringKey("c")).Absolute(addrs.RootModuleInstance); !set.HasResourceInstance(input) {
   154  		t.Errorf("missing %T %s", input, input.String())
   155  	}
   156  	if input := rAddr("single").Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("single", addrs.NoKey)); !set.HasResourceInstance(input) {
   157  		t.Errorf("missing %T %s", input, input.String())
   158  	}
   159  	if input := rAddr("count").Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("b"))); !set.HasResourceInstance(input) {
   160  		t.Errorf("missing %T %s", input, input.String())
   161  	}
   162  	if input := rAddr("single").Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance); set.HasResourceInstance(input) {
   163  		t.Errorf("unexpected %T %s", input, input.String())
   164  	}
   165  	if input := rAddr("single").Instance(addrs.StringKey("")).Absolute(addrs.RootModuleInstance); set.HasResourceInstance(input) {
   166  		t.Errorf("unexpected %T %s", input, input.String())
   167  	}
   168  	if input := rAddr("count").Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance); set.HasResourceInstance(input) {
   169  		t.Errorf("unexpected %T %s", input, input.String())
   170  	}
   171  	if input := rAddr("count").Instance(addrs.StringKey("")).Absolute(addrs.RootModuleInstance); set.HasResourceInstance(input) {
   172  		t.Errorf("unexpected %T %s", input, input.String())
   173  	}
   174  	if input := rAddr("count").Instance(addrs.IntKey(1)).Absolute(addrs.RootModuleInstance); set.HasResourceInstance(input) {
   175  		t.Errorf("unexpected %T %s", input, input.String())
   176  	}
   177  	if input := rAddr("single").Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("single", addrs.IntKey(0))); set.HasResourceInstance(input) {
   178  		t.Errorf("unexpected %T %s", input, input.String())
   179  	}
   180  	if input := rAddr("count").Instance(addrs.IntKey(0)).Absolute(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("a"))); set.HasResourceInstance(input) {
   181  		t.Errorf("unexpected %T %s", input, input.String())
   182  	}
   183  
   184  	// HasResource tests
   185  	if input := rAddr("single").Absolute(addrs.RootModuleInstance); !set.HasResource(input) {
   186  		t.Errorf("missing %T %s", input, input.String())
   187  	}
   188  	if input := rAddr("count").Absolute(addrs.RootModuleInstance); !set.HasResource(input) {
   189  		t.Errorf("missing %T %s", input, input.String())
   190  	}
   191  	if input := rAddr("for_each").Absolute(addrs.RootModuleInstance); !set.HasResource(input) {
   192  		t.Errorf("missing %T %s", input, input.String())
   193  	}
   194  	if input := rAddr("single").Absolute(addrs.RootModuleInstance.Child("single", addrs.NoKey)); !set.HasResource(input) {
   195  		t.Errorf("missing %T %s", input, input.String())
   196  	}
   197  	if input := rAddr("count").Absolute(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("a"))); !set.HasResource(input) {
   198  		t.Errorf("missing %T %s", input, input.String())
   199  	}
   200  	if input := rAddr("count").Absolute(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("b"))); !set.HasResource(input) {
   201  		t.Errorf("missing %T %s", input, input.String())
   202  	}
   203  	if input := rAddr("nonexist").Absolute(addrs.RootModuleInstance); set.HasResource(input) {
   204  		t.Errorf("unexpected %T %s", input, input.String())
   205  	}
   206  	if input := rAddr("count").Absolute(addrs.RootModuleInstance.Child("for_each", addrs.StringKey("nonexist"))); set.HasResource(input) {
   207  		t.Errorf("unexpected %T %s", input, input.String())
   208  	}
   209  
   210  	// ensure we can lookup non-existent addrs in a set without panic
   211  	if set.InstancesForModule(addrs.RootModule.Child("missing")) != nil {
   212  		t.Error("unexpected instances from missing module")
   213  	}
   214  }