github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/terraform/transform_orphan_count_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/muratcelep/terraform/not-internal/addrs"
     8  	"github.com/muratcelep/terraform/not-internal/states"
     9  )
    10  
    11  func TestOrphanResourceCountTransformer(t *testing.T) {
    12  	state := states.NewState()
    13  	root := state.RootModule()
    14  	root.SetResourceInstanceCurrent(
    15  		mustResourceInstanceAddr("aws_instance.web").Resource,
    16  		&states.ResourceInstanceObjectSrc{
    17  			Status:    states.ObjectReady,
    18  			AttrsJSON: []byte(`{"id":"foo"}`),
    19  		},
    20  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    21  	)
    22  	root.SetResourceInstanceCurrent(
    23  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
    24  		&states.ResourceInstanceObjectSrc{
    25  			Status:    states.ObjectReady,
    26  			AttrsJSON: []byte(`{"id":"foo"}`),
    27  		},
    28  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    29  	)
    30  	root.SetResourceInstanceCurrent(
    31  		mustResourceInstanceAddr("aws_instance.foo[2]").Resource,
    32  		&states.ResourceInstanceObjectSrc{
    33  			Status:    states.ObjectReady,
    34  			AttrsJSON: []byte(`{"id":"foo"}`),
    35  		},
    36  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    37  	)
    38  
    39  	g := Graph{Path: addrs.RootModuleInstance}
    40  
    41  	{
    42  		tf := &OrphanResourceInstanceCountTransformer{
    43  			Concrete: testOrphanResourceConcreteFunc,
    44  			Addr: addrs.RootModuleInstance.Resource(
    45  				addrs.ManagedResourceMode, "aws_instance", "foo",
    46  			),
    47  			InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")},
    48  			State:         state,
    49  		}
    50  		if err := tf.Transform(&g); err != nil {
    51  			t.Fatalf("err: %s", err)
    52  		}
    53  	}
    54  
    55  	actual := strings.TrimSpace(g.String())
    56  	expected := strings.TrimSpace(testTransformOrphanResourceCountBasicStr)
    57  	if actual != expected {
    58  		t.Fatalf("bad:\n\n%s", actual)
    59  	}
    60  }
    61  
    62  func TestOrphanResourceCountTransformer_zero(t *testing.T) {
    63  	state := states.NewState()
    64  	root := state.RootModule()
    65  	root.SetResourceInstanceCurrent(
    66  		mustResourceInstanceAddr("aws_instance.web").Resource,
    67  		&states.ResourceInstanceObjectSrc{
    68  			Status:    states.ObjectReady,
    69  			AttrsJSON: []byte(`{"id":"foo"}`),
    70  		},
    71  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    72  	)
    73  	root.SetResourceInstanceCurrent(
    74  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
    75  		&states.ResourceInstanceObjectSrc{
    76  			Status:    states.ObjectReady,
    77  			AttrsJSON: []byte(`{"id":"foo"}`),
    78  		},
    79  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    80  	)
    81  	root.SetResourceInstanceCurrent(
    82  		mustResourceInstanceAddr("aws_instance.foo[2]").Resource,
    83  		&states.ResourceInstanceObjectSrc{
    84  			Status:    states.ObjectReady,
    85  			AttrsJSON: []byte(`{"id":"foo"}`),
    86  		},
    87  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
    88  	)
    89  
    90  	g := Graph{Path: addrs.RootModuleInstance}
    91  
    92  	{
    93  		tf := &OrphanResourceInstanceCountTransformer{
    94  			Concrete: testOrphanResourceConcreteFunc,
    95  			Addr: addrs.RootModuleInstance.Resource(
    96  				addrs.ManagedResourceMode, "aws_instance", "foo",
    97  			),
    98  			InstanceAddrs: []addrs.AbsResourceInstance{},
    99  			State:         state,
   100  		}
   101  		if err := tf.Transform(&g); err != nil {
   102  			t.Fatalf("err: %s", err)
   103  		}
   104  	}
   105  
   106  	actual := strings.TrimSpace(g.String())
   107  	expected := strings.TrimSpace(testTransformOrphanResourceCountZeroStr)
   108  	if actual != expected {
   109  		t.Fatalf("bad:\n\n%s", actual)
   110  	}
   111  }
   112  
   113  func TestOrphanResourceCountTransformer_oneIndex(t *testing.T) {
   114  	state := states.NewState()
   115  	root := state.RootModule()
   116  	root.SetResourceInstanceCurrent(
   117  		mustResourceInstanceAddr("aws_instance.web").Resource,
   118  		&states.ResourceInstanceObjectSrc{
   119  			Status:    states.ObjectReady,
   120  			AttrsJSON: []byte(`{"id":"foo"}`),
   121  		},
   122  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   123  	)
   124  	root.SetResourceInstanceCurrent(
   125  		mustResourceInstanceAddr("aws_instance.foo[0]").Resource,
   126  		&states.ResourceInstanceObjectSrc{
   127  			Status:    states.ObjectReady,
   128  			AttrsJSON: []byte(`{"id":"foo"}`),
   129  		},
   130  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   131  	)
   132  	root.SetResourceInstanceCurrent(
   133  		mustResourceInstanceAddr("aws_instance.foo[1]").Resource,
   134  		&states.ResourceInstanceObjectSrc{
   135  			Status:    states.ObjectReady,
   136  			AttrsJSON: []byte(`{"id":"foo"}`),
   137  		},
   138  		mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   139  	)
   140  
   141  	g := Graph{Path: addrs.RootModuleInstance}
   142  
   143  	{
   144  		tf := &OrphanResourceInstanceCountTransformer{
   145  			Concrete: testOrphanResourceConcreteFunc,
   146  			Addr: addrs.RootModuleInstance.Resource(
   147  				addrs.ManagedResourceMode, "aws_instance", "foo",
   148  			),
   149  			InstanceAddrs: []addrs.AbsResourceInstance{mustResourceInstanceAddr("aws_instance.foo[0]")},
   150  			State:         state,
   151  		}
   152  		if err := tf.Transform(&g); err != nil {
   153  			t.Fatalf("err: %s", err)
   154  		}
   155  	}
   156  
   157  	actual := strings.TrimSpace(g.String())
   158  	expected := strings.TrimSpace(testTransformOrphanResourceCountOneIndexStr)
   159  	if actual != expected {
   160  		t.Fatalf("bad:\n\n%s", actual)
   161  	}
   162  }
   163  
   164  // When converting from a NoEach mode to an EachMap via a switch to for_each,
   165  // an edge is necessary to ensure that the map-key'd instances
   166  // are evaluated after the NoKey resource, because the final instance evaluated
   167  // sets the whole resource's EachMode.
   168  func TestOrphanResourceCountTransformer_ForEachEdgesAdded(t *testing.T) {
   169  	state := states.BuildState(func(s *states.SyncState) {
   170  		// "bar" key'd resource
   171  		s.SetResourceInstanceCurrent(
   172  			addrs.Resource{
   173  				Mode: addrs.ManagedResourceMode,
   174  				Type: "aws_instance",
   175  				Name: "foo",
   176  			}.Instance(addrs.StringKey("bar")).Absolute(addrs.RootModuleInstance),
   177  			&states.ResourceInstanceObjectSrc{
   178  				AttrsFlat: map[string]string{
   179  					"id": "foo",
   180  				},
   181  				Status: states.ObjectReady,
   182  			},
   183  			mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   184  		)
   185  
   186  		// NoKey'd resource
   187  		s.SetResourceInstanceCurrent(
   188  			addrs.Resource{
   189  				Mode: addrs.ManagedResourceMode,
   190  				Type: "aws_instance",
   191  				Name: "foo",
   192  			}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
   193  			&states.ResourceInstanceObjectSrc{
   194  				AttrsFlat: map[string]string{
   195  					"id": "foo",
   196  				},
   197  				Status: states.ObjectReady,
   198  			},
   199  			mustProviderConfig(`provider["registry.terraform.io/hashicorp/aws"]`),
   200  		)
   201  	})
   202  
   203  	g := Graph{Path: addrs.RootModuleInstance}
   204  
   205  	{
   206  		tf := &OrphanResourceInstanceCountTransformer{
   207  			Concrete: testOrphanResourceConcreteFunc,
   208  			Addr: addrs.RootModuleInstance.Resource(
   209  				addrs.ManagedResourceMode, "aws_instance", "foo",
   210  			),
   211  			InstanceAddrs: []addrs.AbsResourceInstance{},
   212  			State:         state,
   213  		}
   214  		if err := tf.Transform(&g); err != nil {
   215  			t.Fatalf("err: %s", err)
   216  		}
   217  	}
   218  
   219  	actual := strings.TrimSpace(g.String())
   220  	expected := strings.TrimSpace(testTransformOrphanResourceForEachStr)
   221  	if actual != expected {
   222  		t.Fatalf("bad:\n\n%s", actual)
   223  	}
   224  }
   225  
   226  const testTransformOrphanResourceCountBasicStr = `
   227  aws_instance.foo[2] (orphan)
   228  `
   229  
   230  const testTransformOrphanResourceCountZeroStr = `
   231  aws_instance.foo[0] (orphan)
   232  aws_instance.foo[2] (orphan)
   233  `
   234  
   235  const testTransformOrphanResourceCountOneIndexStr = `
   236  aws_instance.foo[1] (orphan)
   237  `
   238  
   239  const testTransformOrphanResourceForEachStr = `
   240  aws_instance.foo (orphan)
   241  aws_instance.foo["bar"] (orphan)
   242  `