mirror of
https://github.com/opentffoundation/opentf.git
synced 2026-02-20 19:00:38 -05:00
For resources which are planned to move, render the previous run address as additional information in the plan UI. For the case of a move-only resource (which otherwise is unchanged), we also render that as a planned change, but without any corresponding action symbol. If all changes in the plan are moves without changes, the plan is no longer considered "empty". In this case, we skip rendering the action symbols in the UI.
128 lines
3.4 KiB
Go
128 lines
3.4 KiB
Go
package views
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/internal/addrs"
|
|
"github.com/hashicorp/terraform/internal/command/arguments"
|
|
"github.com/hashicorp/terraform/internal/configs/configschema"
|
|
"github.com/hashicorp/terraform/internal/plans"
|
|
"github.com/hashicorp/terraform/internal/providers"
|
|
"github.com/hashicorp/terraform/internal/terminal"
|
|
"github.com/hashicorp/terraform/internal/terraform"
|
|
"github.com/zclconf/go-cty/cty"
|
|
)
|
|
|
|
// Ensure that the correct view type and in-automation settings propagate to the
|
|
// Operation view.
|
|
func TestPlanHuman_operation(t *testing.T) {
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
defer done(t)
|
|
v := NewPlan(arguments.ViewHuman, NewView(streams).SetRunningInAutomation(true)).Operation()
|
|
if hv, ok := v.(*OperationHuman); !ok {
|
|
t.Fatalf("unexpected return type %t", v)
|
|
} else if hv.inAutomation != true {
|
|
t.Fatalf("unexpected inAutomation value on Operation view")
|
|
}
|
|
}
|
|
|
|
// Verify that Hooks includes a UI hook
|
|
func TestPlanHuman_hooks(t *testing.T) {
|
|
streams, done := terminal.StreamsForTesting(t)
|
|
defer done(t)
|
|
v := NewPlan(arguments.ViewHuman, NewView(streams).SetRunningInAutomation((true)))
|
|
hooks := v.Hooks()
|
|
|
|
var uiHook *UiHook
|
|
for _, hook := range hooks {
|
|
if ch, ok := hook.(*UiHook); ok {
|
|
uiHook = ch
|
|
}
|
|
}
|
|
if uiHook == nil {
|
|
t.Fatalf("expected Hooks to include a UiHook: %#v", hooks)
|
|
}
|
|
}
|
|
|
|
// Helper functions to build a trivial test plan, to exercise the plan
|
|
// renderer.
|
|
func testPlan(t *testing.T) *plans.Plan {
|
|
t.Helper()
|
|
|
|
plannedVal := cty.ObjectVal(map[string]cty.Value{
|
|
"id": cty.UnknownVal(cty.String),
|
|
"foo": cty.StringVal("bar"),
|
|
})
|
|
priorValRaw, err := plans.NewDynamicValue(cty.NullVal(plannedVal.Type()), plannedVal.Type())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
plannedValRaw, err := plans.NewDynamicValue(plannedVal, plannedVal.Type())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
changes := plans.NewChanges()
|
|
addr := addrs.Resource{
|
|
Mode: addrs.ManagedResourceMode,
|
|
Type: "test_resource",
|
|
Name: "foo",
|
|
}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance)
|
|
|
|
changes.SyncWrapper().AppendResourceInstanceChange(&plans.ResourceInstanceChangeSrc{
|
|
Addr: addr,
|
|
PrevRunAddr: addr,
|
|
ProviderAddr: addrs.AbsProviderConfig{
|
|
Provider: addrs.NewDefaultProvider("test"),
|
|
Module: addrs.RootModule,
|
|
},
|
|
ChangeSrc: plans.ChangeSrc{
|
|
Action: plans.Create,
|
|
Before: priorValRaw,
|
|
After: plannedValRaw,
|
|
},
|
|
})
|
|
|
|
return &plans.Plan{
|
|
Changes: changes,
|
|
}
|
|
}
|
|
|
|
func testSchemas() *terraform.Schemas {
|
|
provider := testProvider()
|
|
return &terraform.Schemas{
|
|
Providers: map[addrs.Provider]*terraform.ProviderSchema{
|
|
addrs.NewDefaultProvider("test"): provider.ProviderSchema(),
|
|
},
|
|
}
|
|
}
|
|
|
|
func testProvider() *terraform.MockProvider {
|
|
p := new(terraform.MockProvider)
|
|
p.ReadResourceFn = func(req providers.ReadResourceRequest) providers.ReadResourceResponse {
|
|
return providers.ReadResourceResponse{NewState: req.PriorState}
|
|
}
|
|
|
|
p.GetProviderSchemaResponse = testProviderSchema()
|
|
|
|
return p
|
|
}
|
|
|
|
func testProviderSchema() *providers.GetProviderSchemaResponse {
|
|
return &providers.GetProviderSchemaResponse{
|
|
Provider: providers.Schema{
|
|
Block: &configschema.Block{},
|
|
},
|
|
ResourceTypes: map[string]providers.Schema{
|
|
"test_resource": {
|
|
Block: &configschema.Block{
|
|
Attributes: map[string]*configschema.Attribute{
|
|
"id": {Type: cty.String, Computed: true},
|
|
"foo": {Type: cty.String, Optional: true},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|