github.com/hugorut/terraform@v1.1.3/src/command/views/plan_test.go (about)

     1  package views
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hugorut/terraform/src/addrs"
     7  	"github.com/hugorut/terraform/src/command/arguments"
     8  	"github.com/hugorut/terraform/src/configs/configschema"
     9  	"github.com/hugorut/terraform/src/plans"
    10  	"github.com/hugorut/terraform/src/providers"
    11  	"github.com/hugorut/terraform/src/terminal"
    12  	"github.com/hugorut/terraform/src/terraform"
    13  	"github.com/zclconf/go-cty/cty"
    14  )
    15  
    16  // Ensure that the correct view type and in-automation settings propagate to the
    17  // Operation view.
    18  func TestPlanHuman_operation(t *testing.T) {
    19  	streams, done := terminal.StreamsForTesting(t)
    20  	defer done(t)
    21  	v := NewPlan(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)).Operation()
    22  	if hv, ok := v.(*OperationHuman); !ok {
    23  		t.Fatalf("unexpected return type %t", v)
    24  	} else if hv.inAutomation != true {
    25  		t.Fatalf("unexpected inAutomation value on Operation view")
    26  	}
    27  }
    28  
    29  // Verify that Hooks includes a UI hook
    30  func TestPlanHuman_hooks(t *testing.T) {
    31  	streams, done := terminal.StreamsForTesting(t)
    32  	defer done(t)
    33  	v := NewPlan(arguments.ViewHuman, NewView(streams).SetRunningInAutomation((true)))
    34  	hooks := v.Hooks()
    35  
    36  	var uiHook *UiHook
    37  	for _, hook := range hooks {
    38  		if ch, ok := hook.(*UiHook); ok {
    39  			uiHook = ch
    40  		}
    41  	}
    42  	if uiHook == nil {
    43  		t.Fatalf("expected Hooks to include a UiHook: %#v", hooks)
    44  	}
    45  }
    46  
    47  // Helper functions to build a trivial test plan, to exercise the plan
    48  // renderer.
    49  func testPlan(t *testing.T) *plans.Plan {
    50  	t.Helper()
    51  
    52  	plannedVal := cty.ObjectVal(map[string]cty.Value{
    53  		"id":  cty.UnknownVal(cty.String),
    54  		"foo": cty.StringVal("bar"),
    55  	})
    56  	priorValRaw, err := plans.NewDynamicValue(cty.NullVal(plannedVal.Type()), plannedVal.Type())
    57  	if err != nil {
    58  		t.Fatal(err)
    59  	}
    60  	plannedValRaw, err := plans.NewDynamicValue(plannedVal, plannedVal.Type())
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	changes := plans.NewChanges()
    66  	addr := addrs.Resource{
    67  		Mode: addrs.ManagedResourceMode,
    68  		Type: "test_resource",
    69  		Name: "foo",
    70  	}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance)
    71  
    72  	changes.SyncWrapper().AppendResourceInstanceChange(&plans.ResourceInstanceChangeSrc{
    73  		Addr:        addr,
    74  		PrevRunAddr: addr,
    75  		ProviderAddr: addrs.AbsProviderConfig{
    76  			Provider: addrs.NewDefaultProvider("test"),
    77  			Module:   addrs.RootModule,
    78  		},
    79  		ChangeSrc: plans.ChangeSrc{
    80  			Action: plans.Create,
    81  			Before: priorValRaw,
    82  			After:  plannedValRaw,
    83  		},
    84  	})
    85  
    86  	return &plans.Plan{
    87  		Changes: changes,
    88  	}
    89  }
    90  
    91  func testSchemas() *terraform.Schemas {
    92  	provider := testProvider()
    93  	return &terraform.Schemas{
    94  		Providers: map[addrs.Provider]*terraform.ProviderSchema{
    95  			addrs.NewDefaultProvider("test"): provider.ProviderSchema(),
    96  		},
    97  	}
    98  }
    99  
   100  func testProvider() *terraform.MockProvider {
   101  	p := new(terraform.MockProvider)
   102  	p.ReadResourceFn = func(req providers.ReadResourceRequest) providers.ReadResourceResponse {
   103  		return providers.ReadResourceResponse{NewState: req.PriorState}
   104  	}
   105  
   106  	p.GetProviderSchemaResponse = testProviderSchema()
   107  
   108  	return p
   109  }
   110  
   111  func testProviderSchema() *providers.GetProviderSchemaResponse {
   112  	return &providers.GetProviderSchemaResponse{
   113  		Provider: providers.Schema{
   114  			Block: &configschema.Block{},
   115  		},
   116  		ResourceTypes: map[string]providers.Schema{
   117  			"test_resource": {
   118  				Block: &configschema.Block{
   119  					Attributes: map[string]*configschema.Attribute{
   120  						"id":  {Type: cty.String, Computed: true},
   121  						"foo": {Type: cty.String, Optional: true},
   122  					},
   123  				},
   124  			},
   125  		},
   126  	}
   127  }