mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-29 10:21:01 -06:00
40f09027f0
While the Expander itself now handles the recursive expansion of modules, Resources themselves still need to be expanded twice, because the evaluation of the Resource, which entails evaluating the for_each or count expressions, is separate from the ResourceInstance expansion. Add a nodeExpandPlannableResource to do handle this expansion to allow all NodePlannableResources to call EvalWriteResourceState with an absolute address.
91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package terraform
|
|
|
|
import (
|
|
"reflect"
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/providers"
|
|
"github.com/zclconf/go-cty/cty"
|
|
)
|
|
|
|
func TestBuiltinEvalContextProviderInput(t *testing.T) {
|
|
var lock sync.Mutex
|
|
cache := make(map[string]map[string]cty.Value)
|
|
|
|
ctx1 := testBuiltinEvalContext(t)
|
|
ctx1 = ctx1.WithPath(addrs.RootModuleInstance).(*BuiltinEvalContext)
|
|
ctx1.ProviderInputConfig = cache
|
|
ctx1.ProviderLock = &lock
|
|
|
|
ctx2 := testBuiltinEvalContext(t)
|
|
ctx2 = ctx2.WithPath(addrs.RootModuleInstance.Child("child", addrs.NoKey)).(*BuiltinEvalContext)
|
|
ctx2.ProviderInputConfig = cache
|
|
ctx2.ProviderLock = &lock
|
|
|
|
providerAddr1 := addrs.AbsProviderConfig{
|
|
Module: addrs.RootModule,
|
|
Provider: addrs.NewLegacyProvider("foo"),
|
|
}
|
|
providerAddr2 := addrs.AbsProviderConfig{
|
|
Module: addrs.RootModule.Child("child"),
|
|
Provider: addrs.NewLegacyProvider("foo"),
|
|
}
|
|
|
|
expected1 := map[string]cty.Value{"value": cty.StringVal("foo")}
|
|
ctx1.SetProviderInput(providerAddr1, expected1)
|
|
|
|
try2 := map[string]cty.Value{"value": cty.StringVal("bar")}
|
|
ctx2.SetProviderInput(providerAddr2, try2) // ignored because not a root module
|
|
|
|
actual1 := ctx1.ProviderInput(providerAddr1)
|
|
actual2 := ctx2.ProviderInput(providerAddr2)
|
|
|
|
if !reflect.DeepEqual(actual1, expected1) {
|
|
t.Errorf("wrong result 1\ngot: %#v\nwant: %#v", actual1, expected1)
|
|
}
|
|
if actual2 != nil {
|
|
t.Errorf("wrong result 2\ngot: %#v\nwant: %#v", actual2, nil)
|
|
}
|
|
}
|
|
|
|
func TestBuildingEvalContextInitProvider(t *testing.T) {
|
|
var lock sync.Mutex
|
|
|
|
testP := &MockProvider{}
|
|
|
|
ctx := testBuiltinEvalContext(t)
|
|
ctx = ctx.WithPath(addrs.RootModuleInstance).(*BuiltinEvalContext)
|
|
ctx.ProviderLock = &lock
|
|
ctx.ProviderCache = make(map[string]providers.Interface)
|
|
ctx.Components = &basicComponentFactory{
|
|
providers: map[addrs.Provider]providers.Factory{
|
|
addrs.NewLegacyProvider("test"): providers.FactoryFixed(testP),
|
|
},
|
|
}
|
|
|
|
providerAddrDefault := addrs.AbsProviderConfig{
|
|
Module: addrs.RootModule,
|
|
Provider: addrs.NewLegacyProvider("test"),
|
|
}
|
|
providerAddrAlias := addrs.AbsProviderConfig{
|
|
Module: addrs.RootModule,
|
|
Provider: addrs.NewLegacyProvider("test"),
|
|
Alias: "foo",
|
|
}
|
|
|
|
_, err := ctx.InitProvider(providerAddrDefault)
|
|
if err != nil {
|
|
t.Fatalf("error initializing provider test: %s", err)
|
|
}
|
|
_, err = ctx.InitProvider(providerAddrAlias)
|
|
if err != nil {
|
|
t.Fatalf("error initializing provider test.foo: %s", err)
|
|
}
|
|
}
|
|
|
|
func testBuiltinEvalContext(t *testing.T) *BuiltinEvalContext {
|
|
return &BuiltinEvalContext{}
|
|
}
|