github.com/trawler/terraform@v0.10.8-0.20171106022149-4b1c7a1d9b48/terraform/plan_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"bytes"
     5  	"reflect"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/hashicorp/terraform/config/module"
    10  )
    11  
    12  func TestPlanContextOpts(t *testing.T) {
    13  	plan := &Plan{
    14  		Diff: &Diff{
    15  			Modules: []*ModuleDiff{
    16  				{
    17  					Path: []string{"test"},
    18  				},
    19  			},
    20  		},
    21  		Module: module.NewTree("test", nil),
    22  		State: &State{
    23  			TFVersion: "sigil",
    24  		},
    25  		Vars:    map[string]interface{}{"foo": "bar"},
    26  		Targets: []string{"baz"},
    27  
    28  		TerraformVersion: VersionString(),
    29  		ProviderSHA256s: map[string][]byte{
    30  			"test": []byte("placeholder"),
    31  		},
    32  	}
    33  
    34  	got, err := plan.contextOpts(&ContextOpts{})
    35  	if err != nil {
    36  		t.Fatalf("error creating context: %s", err)
    37  	}
    38  
    39  	want := &ContextOpts{
    40  		Diff:            plan.Diff,
    41  		Module:          plan.Module,
    42  		State:           plan.State,
    43  		Variables:       plan.Vars,
    44  		Targets:         plan.Targets,
    45  		ProviderSHA256s: plan.ProviderSHA256s,
    46  	}
    47  
    48  	if !reflect.DeepEqual(got, want) {
    49  		t.Errorf("wrong result\ngot:  %#v\nwant %#v", got, want)
    50  	}
    51  }
    52  
    53  func TestReadWritePlan(t *testing.T) {
    54  	plan := &Plan{
    55  		Module: testModule(t, "new-good"),
    56  		Diff: &Diff{
    57  			Modules: []*ModuleDiff{
    58  				&ModuleDiff{
    59  					Path: rootModulePath,
    60  					Resources: map[string]*InstanceDiff{
    61  						"nodeA": &InstanceDiff{
    62  							Attributes: map[string]*ResourceAttrDiff{
    63  								"foo": &ResourceAttrDiff{
    64  									Old: "foo",
    65  									New: "bar",
    66  								},
    67  								"bar": &ResourceAttrDiff{
    68  									Old:         "foo",
    69  									NewComputed: true,
    70  								},
    71  								"longfoo": &ResourceAttrDiff{
    72  									Old:         "foo",
    73  									New:         "bar",
    74  									RequiresNew: true,
    75  								},
    76  							},
    77  
    78  							Meta: map[string]interface{}{
    79  								"foo": []interface{}{1, 2, 3},
    80  							},
    81  						},
    82  					},
    83  				},
    84  			},
    85  		},
    86  		State: &State{
    87  			Modules: []*ModuleState{
    88  				&ModuleState{
    89  					Path: rootModulePath,
    90  					Resources: map[string]*ResourceState{
    91  						"foo": &ResourceState{
    92  							Primary: &InstanceState{
    93  								ID: "bar",
    94  							},
    95  						},
    96  					},
    97  				},
    98  			},
    99  		},
   100  		Vars: map[string]interface{}{
   101  			"foo": "bar",
   102  		},
   103  	}
   104  
   105  	buf := new(bytes.Buffer)
   106  	if err := WritePlan(plan, buf); err != nil {
   107  		t.Fatalf("err: %s", err)
   108  	}
   109  
   110  	actual, err := ReadPlan(buf)
   111  	if err != nil {
   112  		t.Fatalf("err: %s", err)
   113  	}
   114  
   115  	actualStr := strings.TrimSpace(actual.String())
   116  	expectedStr := strings.TrimSpace(plan.String())
   117  	if actualStr != expectedStr {
   118  		t.Fatalf("bad:\n\n%s\n\nexpected:\n\n%s", actualStr, expectedStr)
   119  	}
   120  }
   121  
   122  func TestPlanContextOptsOverrideStateGood(t *testing.T) {
   123  	plan := &Plan{
   124  		Diff: &Diff{
   125  			Modules: []*ModuleDiff{
   126  				{
   127  					Path: []string{"test"},
   128  				},
   129  			},
   130  		},
   131  		Module: module.NewTree("test", nil),
   132  		State: &State{
   133  			TFVersion: "sigil",
   134  			Serial:    1,
   135  		},
   136  		Vars:    map[string]interface{}{"foo": "bar"},
   137  		Targets: []string{"baz"},
   138  
   139  		TerraformVersion: VersionString(),
   140  		ProviderSHA256s: map[string][]byte{
   141  			"test": []byte("placeholder"),
   142  		},
   143  	}
   144  
   145  	base := &ContextOpts{
   146  		State: &State{
   147  			TFVersion: "sigil",
   148  			Serial:    2,
   149  		},
   150  	}
   151  
   152  	got, err := plan.contextOpts(base)
   153  	if err != nil {
   154  		t.Fatalf("error creating context: %s", err)
   155  	}
   156  
   157  	want := &ContextOpts{
   158  		Diff:            plan.Diff,
   159  		Module:          plan.Module,
   160  		State:           base.State,
   161  		Variables:       plan.Vars,
   162  		Targets:         plan.Targets,
   163  		ProviderSHA256s: plan.ProviderSHA256s,
   164  	}
   165  
   166  	if !reflect.DeepEqual(got, want) {
   167  		t.Errorf("wrong result\ngot:  %#v\nwant %#v", got, want)
   168  	}
   169  }