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 }