add tests for actions in modules

pull/33629/merge
Daniel Schmidt 10 months ago
parent 6de74f5996
commit 3b2b4b017f

@ -101,7 +101,7 @@ resource "test_object" "a" {
}
if !action.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("test_object.a")) {
t.Fatal("expected action to have a triggering resource address, but it is nil")
t.Fatalf("expected action to have a triggering resource address 'test_object.a', got '%s'", action.TriggeringResourceAddr)
}
if action.ActionTriggerBlockIndex != 0 {
@ -863,6 +863,177 @@ action "test_linked" "hello" {}
})
},
},
"triggered within module": {
module: map[string]string{
"main.tf": `
module "mod" {
source = "./mod"
}
`,
"mod/mod.tf": `
action "test_unlinked" "hello" {}
resource "other_object" "a" {
lifecycle {
action_trigger {
events = [before_create]
actions = [action.test_unlinked.hello]
}
}
}
`,
},
expectPlanActionCalled: true,
assertPlan: func(t *testing.T, p *plans.Plan) {
if len(p.Changes.ActionInvocations) != 1 {
t.Fatalf("expected 1 action in plan, got %d", len(p.Changes.ActionInvocations))
}
action := p.Changes.ActionInvocations[0]
if action.Addr.String() != "module.mod.action.test_unlinked.hello" {
t.Fatalf("expected action address to be 'module.mod.action.test_unlinked.hello', got '%s'", action.Addr)
}
if !action.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod.other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod.other_object.a', but it is %s", action.TriggeringResourceAddr)
}
if action.ActionTriggerBlockIndex != 0 {
t.Fatalf("expected action to have a triggering block index of 0, got %d", action.ActionTriggerBlockIndex)
}
if action.TriggerEvent != configs.BeforeCreate {
t.Fatalf("expected action to have a triggering event of 'before_create', got '%s'", action.TriggerEvent)
}
if action.ActionsListIndex != 0 {
t.Fatalf("expected action to have a actions list index of 0, got %d", action.ActionsListIndex)
}
if action.ProviderAddr.Provider != addrs.NewDefaultProvider("test") {
t.Fatalf("expected action to have a provider address of 'provider[\"registry.terraform.io/hashicorp/test\"]', got '%s'", action.ProviderAddr)
}
},
},
"triggered within module instance": {
module: map[string]string{
"main.tf": `
module "mod" {
count = 2
source = "./mod"
}
`,
"mod/mod.tf": `
action "test_unlinked" "hello" {}
resource "other_object" "a" {
lifecycle {
action_trigger {
events = [before_create]
actions = [action.test_unlinked.hello]
}
}
}
`,
},
expectPlanActionCalled: true,
assertPlan: func(t *testing.T, p *plans.Plan) {
if len(p.Changes.ActionInvocations) != 2 {
t.Fatalf("expected 1 action in plan, got %d", len(p.Changes.ActionInvocations))
}
// We know we are run within two child modules, so we can just sort by the triggering resource address
slices.SortFunc(p.Changes.ActionInvocations, func(a, b *plans.ActionInvocationInstanceSrc) int {
if a.TriggeringResourceAddr.String() < b.TriggeringResourceAddr.String() {
return -1
} else {
return 1
}
})
action := p.Changes.ActionInvocations[0]
if action.Addr.String() != "module.mod[0].action.test_unlinked.hello" {
t.Fatalf("expected action address to be 'module.mod[0].action.test_unlinked.hello', got '%s'", action.Addr)
}
if !action.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod[0].other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod[0].other_object.a', but it is %s", action.TriggeringResourceAddr)
}
if action.ActionTriggerBlockIndex != 0 {
t.Fatalf("expected action to have a triggering block index of 0, got %d", action.ActionTriggerBlockIndex)
}
if action.TriggerEvent != configs.BeforeCreate {
t.Fatalf("expected action to have a triggering event of 'before_create', got '%s'", action.TriggerEvent)
}
if action.ActionsListIndex != 0 {
t.Fatalf("expected action to have a actions list index of 0, got %d", action.ActionsListIndex)
}
if action.ProviderAddr.Provider != addrs.NewDefaultProvider("test") {
t.Fatalf("expected action to have a provider address of 'provider[\"registry.terraform.io/hashicorp/test\"]', got '%s'", action.ProviderAddr)
}
action2 := p.Changes.ActionInvocations[1]
if action2.Addr.String() != "module.mod[1].action.test_unlinked.hello" {
t.Fatalf("expected action address to be 'module.mod[1].action.test_unlinked.hello', got '%s'", action2.Addr)
}
if !action2.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod[1].other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod[1].other_object.a', but it is %s", action2.TriggeringResourceAddr)
}
},
},
"provider is within module": {
toBeImplemented: true,
module: map[string]string{
"main.tf": `
module "mod" {
source = "./mod"
}
`,
"mod/mod.tf": `
provider "test" {
alias = "inthemodule"
}
action "test_unlinked" "hello" {
provider = test.inthemodule
}
resource "other_object" "a" {
lifecycle {
action_trigger {
events = [before_create]
actions = [action.test_unlinked.hello]
}
}
}
`,
},
expectPlanActionCalled: true,
assertPlan: func(t *testing.T, p *plans.Plan) {
if len(p.Changes.ActionInvocations) != 1 {
t.Fatalf("expected 1 action in plan, got %d", len(p.Changes.ActionInvocations))
}
action := p.Changes.ActionInvocations[0]
if action.Addr.String() != "module.mod.action.test_unlinked.hello" {
t.Fatalf("expected action address to be 'module.mod.action.test_unlinked.hello', got '%s'", action.Addr)
}
if !action.TriggeringResourceAddr.Equal(mustResourceInstanceAddr("module.mod.other_object.a")) {
t.Fatalf("expected action to have triggering resource address 'module.mod.other_object.a', but it is %s", action.TriggeringResourceAddr)
}
if action.ProviderAddr.Module.String() != "module.mod" {
t.Fatalf("expected action to have a provider module address of 'module.mod' got '%s'", action.ProviderAddr.Module.String())
}
if action.ProviderAddr.Alias != "inthemodule" {
t.Fatalf("expected action to have a provider alias of 'inthemodule', got '%s'", action.ProviderAddr.Alias)
}
},
},
} {
t.Run(name, func(t *testing.T) {
if tc.toBeImplemented {
@ -938,6 +1109,23 @@ action "test_linked" "hello" {}
},
}
other := &testing_provider.MockProvider{
GetProviderSchemaResponse: &providers.GetProviderSchemaResponse{
ResourceTypes: map[string]providers.Schema{
"other_object": {
Body: &configschema.Block{
Attributes: map[string]*configschema.Attribute{
"name": {
Type: cty.String,
Optional: true,
},
},
},
},
},
},
}
if tc.planActionResponse != nil {
p.PlanActionResponse = *tc.planActionResponse
}
@ -946,7 +1134,8 @@ action "test_linked" "hello" {}
Providers: map[addrs.Provider]providers.Factory{
// The providers never actually going to get called here, we should
// catch the error long before anything happens.
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
addrs.NewDefaultProvider("other"): testProviderFuncFixed(other),
},
})

Loading…
Cancel
Save