From df692c422224e933391d96baf2bdc7e1beffe2a0 Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Thu, 26 Sep 2024 16:03:58 +0200 Subject: [PATCH] ephemeral: add tests for deferrals --- .../terraform/context_apply_deferred_test.go | 113 +++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/internal/terraform/context_apply_deferred_test.go b/internal/terraform/context_apply_deferred_test.go index bbf8589e3c..746446db19 100644 --- a/internal/terraform/context_apply_deferred_test.go +++ b/internal/terraform/context_apply_deferred_test.go @@ -3297,6 +3297,81 @@ resource "test" "a" { }, }, } + + ephemeralResourceOpenDeferral = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +ephemeral "test" "data" { + name = "deferred_open" +} + `, + }, + stages: []deferredActionsTestStage{ + { + complete: false, + wantActions: map[string]plans.Action{}, + wantPlanned: map[string]cty.Value{}, + wantDeferred: map[string]ExpectedDeferred{ + "ephemeral.test.data": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Read}, + }, + }, + }, + } + + ephemeralResourceOpenDeferralWithDependency = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` +ephemeral "test" "data" { + name = "deferred_open" +} + +ephemeral "test" "dep" { + name = ephemeral.test.data.value +} + `, + }, + stages: []deferredActionsTestStage{ + { + complete: false, + wantActions: map[string]plans.Action{}, + wantPlanned: map[string]cty.Value{}, + wantDeferred: map[string]ExpectedDeferred{ + "ephemeral.test.data": {Reason: providers.DeferredReasonProviderConfigUnknown, Action: plans.Read}, + "ephemeral.test.dep": {Reason: providers.DeferredReasonResourceConfigUnknown, Action: plans.Read}, + }, + }, + }, + } + + ephemeralResourceOpenDeferralExpanded = deferredActionsTest{ + configs: map[string]string{ + "main.tf": ` + +variable "each" { + type = set(string) +} + +ephemeral "test" "data" { + for_each = var.each + + name = each.value +} + `, + }, + stages: []deferredActionsTestStage{ + { + inputs: map[string]cty.Value{ + "each": cty.DynamicVal, + }, + complete: false, + wantActions: map[string]plans.Action{}, + wantPlanned: map[string]cty.Value{}, + wantDeferred: map[string]ExpectedDeferred{ + "ephemeral.test.*.data": {Reason: providers.DeferredReasonInstanceCountUnknown, Action: plans.Read}, + }, + }, + }, + } ) func TestContextApply_deferredActions(t *testing.T) { @@ -3346,6 +3421,9 @@ func TestContextApply_deferredActions(t *testing.T) { "plan_update_external_deferral": planUpdateExternalDeferral, "plan_delete_external_deferral": planDeleteExternalDeferral, "plan_delete_mode_external_deferral": planDeleteModeExternalDeferral, + "ephemeral_open_deferral": ephemeralResourceOpenDeferral, + "ephemeral_open_deferral_dependencies": ephemeralResourceOpenDeferralWithDependency, + "ephemeral_open_deferral_expanded": ephemeralResourceOpenDeferralExpanded, } for name, test := range tests { @@ -3466,7 +3544,6 @@ func TestContextApply_deferredActions(t *testing.T) { t.Errorf("wrong provider address in plan\n%s", diff) } } - }) if stage.wantApplied == nil { @@ -3590,6 +3667,22 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { }, }, }, + EphemeralResourceTypes: map[string]providers.Schema{ + "test": { + Block: &configschema.Block{ + Attributes: map[string]*configschema.Attribute{ + "name": { + Type: cty.String, + Required: true, + }, + "value": { + Type: cty.String, + Computed: true, + }, + }, + }, + }, + }, }, ReadResourceFn: func(req providers.ReadResourceRequest) providers.ReadResourceResponse { if key := req.PriorState.GetAttr("name"); key.IsKnown() && key.AsString() == "deferred_read" { @@ -3703,6 +3796,24 @@ func (provider *deferredActionsProvider) Provider() providers.Interface { }, } }, + OpenEphemeralResourceFn: func(op providers.OpenEphemeralResourceRequest) providers.OpenEphemeralResourceResponse { + name := op.Config.GetAttr("name").AsString() + + res := providers.OpenEphemeralResourceResponse{ + Result: cty.ObjectVal(map[string]cty.Value{ + "name": cty.StringVal(name), + "value": cty.StringVal("ephemeral_value"), + }), + } + + if name == "deferred_open" { + res.Deferred = &providers.Deferred{ + Reason: providers.DeferredReasonProviderConfigUnknown, + } + } + + return res + }, } }