github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/lang/globalref/analyzer_contributing_resources_test.go (about)

     1  package globalref
     2  
     3  import (
     4  	"sort"
     5  	"testing"
     6  
     7  	"github.com/google/go-cmp/cmp"
     8  	"github.com/hashicorp/terraform/internal/addrs"
     9  )
    10  
    11  func TestAnalyzerContributingResources(t *testing.T) {
    12  	azr := testAnalyzer(t, "contributing-resources")
    13  
    14  	tests := map[string]struct {
    15  		StartRefs func() []Reference
    16  		WantAddrs []string
    17  	}{
    18  		"root output 'network'": {
    19  			func() []Reference {
    20  				return azr.ReferencesFromOutputValue(
    21  					addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance),
    22  				)
    23  			},
    24  			[]string{
    25  				`data.test_thing.environment`,
    26  				`module.network.test_thing.subnet`,
    27  				`module.network.test_thing.vpc`,
    28  			},
    29  		},
    30  		"root output 'c10s_url'": {
    31  			func() []Reference {
    32  				return azr.ReferencesFromOutputValue(
    33  					addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance),
    34  				)
    35  			},
    36  			[]string{
    37  				`data.test_thing.environment`,
    38  				`module.compute.test_thing.load_balancer`,
    39  				`module.network.test_thing.subnet`,
    40  				`module.network.test_thing.vpc`,
    41  
    42  				// NOTE: module.compute.test_thing.controller isn't here
    43  				// because we can see statically that the output value refers
    44  				// only to the "string" attribute of
    45  				// module.compute.test_thing.load_balancer , and so we
    46  				// don't consider references inside the "list" blocks.
    47  			},
    48  		},
    49  		"module.compute.test_thing.load_balancer": {
    50  			func() []Reference {
    51  				return azr.ReferencesFromResourceInstance(
    52  					addrs.Resource{
    53  						Mode: addrs.ManagedResourceMode,
    54  						Type: "test_thing",
    55  						Name: "load_balancer",
    56  					}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)),
    57  				)
    58  			},
    59  			[]string{
    60  				`data.test_thing.environment`,
    61  				`module.compute.test_thing.controller`,
    62  				`module.network.test_thing.subnet`,
    63  				`module.network.test_thing.vpc`,
    64  			},
    65  		},
    66  		"data.test_thing.environment": {
    67  			func() []Reference {
    68  				return azr.ReferencesFromResourceInstance(
    69  					addrs.Resource{
    70  						Mode: addrs.DataResourceMode,
    71  						Type: "test_thing",
    72  						Name: "environment",
    73  					}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    74  				)
    75  			},
    76  			[]string{
    77  				// Nothing! This one only refers to an input variable.
    78  			},
    79  		},
    80  	}
    81  
    82  	for name, test := range tests {
    83  		t.Run(name, func(t *testing.T) {
    84  			startRefs := test.StartRefs()
    85  			addrs := azr.ContributingResources(startRefs...)
    86  
    87  			want := test.WantAddrs
    88  			got := make([]string, len(addrs))
    89  			for i, addr := range addrs {
    90  				got[i] = addr.String()
    91  			}
    92  			if diff := cmp.Diff(want, got); diff != "" {
    93  				t.Errorf("wrong addresses\n%s", diff)
    94  			}
    95  		})
    96  	}
    97  }
    98  
    99  func TestAnalyzerContributingResourceAttrs(t *testing.T) {
   100  	azr := testAnalyzer(t, "contributing-resources")
   101  
   102  	tests := map[string]struct {
   103  		StartRefs func() []Reference
   104  		WantAttrs []string
   105  	}{
   106  		"root output 'network'": {
   107  			func() []Reference {
   108  				return azr.ReferencesFromOutputValue(
   109  					addrs.OutputValue{Name: "network"}.Absolute(addrs.RootModuleInstance),
   110  				)
   111  			},
   112  			[]string{
   113  				`data.test_thing.environment.any.base_cidr_block`,
   114  				`data.test_thing.environment.any.subnet_count`,
   115  				`module.network.test_thing.subnet`,
   116  				`module.network.test_thing.vpc.string`,
   117  			},
   118  		},
   119  		"root output 'c10s_url'": {
   120  			func() []Reference {
   121  				return azr.ReferencesFromOutputValue(
   122  					addrs.OutputValue{Name: "c10s_url"}.Absolute(addrs.RootModuleInstance),
   123  				)
   124  			},
   125  			[]string{
   126  				`data.test_thing.environment.any.base_cidr_block`,
   127  				`data.test_thing.environment.any.subnet_count`,
   128  				`module.compute.test_thing.load_balancer.string`,
   129  				`module.network.test_thing.subnet`,
   130  				`module.network.test_thing.vpc.string`,
   131  			},
   132  		},
   133  		"module.compute.test_thing.load_balancer": {
   134  			func() []Reference {
   135  				return azr.ReferencesFromResourceInstance(
   136  					addrs.Resource{
   137  						Mode: addrs.ManagedResourceMode,
   138  						Type: "test_thing",
   139  						Name: "load_balancer",
   140  					}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance.Child("compute", addrs.NoKey)),
   141  				)
   142  			},
   143  			[]string{
   144  				`data.test_thing.environment.any.base_cidr_block`,
   145  				`data.test_thing.environment.any.subnet_count`,
   146  				`module.compute.test_thing.controller`,
   147  				`module.network.test_thing.subnet`,
   148  				`module.network.test_thing.vpc.string`,
   149  			},
   150  		},
   151  		"data.test_thing.environment": {
   152  			func() []Reference {
   153  				return azr.ReferencesFromResourceInstance(
   154  					addrs.Resource{
   155  						Mode: addrs.DataResourceMode,
   156  						Type: "test_thing",
   157  						Name: "environment",
   158  					}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
   159  				)
   160  			},
   161  			[]string{
   162  				// Nothing! This one only refers to an input variable.
   163  			},
   164  		},
   165  	}
   166  
   167  	for name, test := range tests {
   168  		t.Run(name, func(t *testing.T) {
   169  			startRefs := test.StartRefs()
   170  			refs := azr.ContributingResourceReferences(startRefs...)
   171  
   172  			want := test.WantAttrs
   173  			got := make([]string, len(refs))
   174  			for i, ref := range refs {
   175  				resAttr, ok := ref.ResourceAttr()
   176  				if !ok {
   177  					t.Errorf("%s is not a resource attr reference", resAttr.DebugString())
   178  					continue
   179  				}
   180  				got[i] = resAttr.DebugString()
   181  			}
   182  
   183  			sort.Strings(got)
   184  
   185  			if diff := cmp.Diff(want, got); diff != "" {
   186  				t.Errorf("wrong addresses\n%s", diff)
   187  			}
   188  		})
   189  	}
   190  }