github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/lang/globalref/analyzer_contributing_resources_test.go (about)

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