mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
terraform: some tests for the eval nodes
This commit is contained in:
parent
128c07e504
commit
ac92c67cba
@ -19,8 +19,10 @@ type EvalNode interface {
|
|||||||
// and not used at runtime.
|
// and not used at runtime.
|
||||||
Args() ([]EvalNode, []EvalType)
|
Args() ([]EvalNode, []EvalType)
|
||||||
|
|
||||||
// Eval evaluates this node with the given context.
|
// Eval evaluates this node with the given context. The second parameter
|
||||||
Eval(EvalContext) (interface{}, error)
|
// are the argument values. These will match in order and 1-1 with the
|
||||||
|
// results of the Args() return value.
|
||||||
|
Eval(EvalContext, []interface{}) (interface{}, error)
|
||||||
|
|
||||||
// Type returns the type that will be returned by this node.
|
// Type returns the type that will be returned by this node.
|
||||||
Type() EvalType
|
Type() EvalType
|
||||||
@ -31,3 +33,28 @@ type EvalNode interface {
|
|||||||
type GraphNodeEvalable interface {
|
type GraphNodeEvalable interface {
|
||||||
EvalTree() EvalNode
|
EvalTree() EvalNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MockEvalContext is a mock version of EvalContext that can be used
|
||||||
|
// for tests.
|
||||||
|
type MockEvalContext struct {
|
||||||
|
InitProviderCalled bool
|
||||||
|
InitProviderName string
|
||||||
|
InitProviderProvider ResourceProvider
|
||||||
|
InitProviderError error
|
||||||
|
|
||||||
|
ProviderCalled bool
|
||||||
|
ProviderName string
|
||||||
|
ProviderProvider ResourceProvider
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MockEvalContext) InitProvider(n string) (ResourceProvider, error) {
|
||||||
|
c.InitProviderCalled = true
|
||||||
|
c.InitProviderName = n
|
||||||
|
return c.InitProviderProvider, c.InitProviderError
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *MockEvalContext) Provider(n string) ResourceProvider {
|
||||||
|
c.ProviderCalled = true
|
||||||
|
c.ProviderName = n
|
||||||
|
return c.ProviderProvider
|
||||||
|
}
|
||||||
|
@ -14,7 +14,8 @@ func (n *EvalInterpolate) Args() ([]EvalNode, []EvalType) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *EvalInterpolate) Eval(ctx EvalContext) (interface{}, error) {
|
func (n *EvalInterpolate) Eval(
|
||||||
|
ctx EvalContext, args []interface{}) (interface{}, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
terraform/eval_literal.go
Normal file
20
terraform/eval_literal.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package terraform
|
||||||
|
|
||||||
|
// EvalLiteral is an EvalNode implementation that returns a literal
|
||||||
|
// value. This is very useful for testing as well as in practice.
|
||||||
|
type EvalLiteral struct {
|
||||||
|
Value interface{}
|
||||||
|
ValueType EvalType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalLiteral) Args() ([]EvalNode, []EvalType) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalLiteral) Eval(EvalContext, []interface{}) (interface{}, error) {
|
||||||
|
return n.Value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n *EvalLiteral) Type() EvalType {
|
||||||
|
return n.ValueType
|
||||||
|
}
|
27
terraform/eval_literal_test.go
Normal file
27
terraform/eval_literal_test.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEvalLiteral_impl(t *testing.T) {
|
||||||
|
var _ EvalNode = new(EvalLiteral)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvalLiteralEval(t *testing.T) {
|
||||||
|
n := &EvalLiteral{Value: 42}
|
||||||
|
actual, err := n.Eval(nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
if actual != 42 {
|
||||||
|
t.Fatalf("bad: %#v", actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvalLiteralType(t *testing.T) {
|
||||||
|
n := &EvalLiteral{Value: 42, ValueType: EvalTypeConfig}
|
||||||
|
if actual := n.Type(); actual != EvalTypeConfig {
|
||||||
|
t.Fatalf("bad: %#v", actual)
|
||||||
|
}
|
||||||
|
}
|
@ -16,7 +16,8 @@ func (n *EvalConfigProvider) Args() ([]EvalNode, []EvalType) {
|
|||||||
[]EvalType{EvalTypeResourceProvider, EvalTypeConfig}
|
[]EvalType{EvalTypeResourceProvider, EvalTypeConfig}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *EvalConfigProvider) Eval(ctx EvalContext) (interface{}, error) {
|
func (n *EvalConfigProvider) Eval(
|
||||||
|
ctx EvalContext, args []interface{}) (interface{}, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +36,8 @@ func (n *EvalInitProvider) Args() ([]EvalNode, []EvalType) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *EvalInitProvider) Eval(ctx EvalContext) (interface{}, error) {
|
func (n *EvalInitProvider) Eval(
|
||||||
|
ctx EvalContext, args []interface{}) (interface{}, error) {
|
||||||
return ctx.InitProvider(n.Name)
|
return ctx.InitProvider(n.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +55,8 @@ func (n *EvalGetProvider) Args() ([]EvalNode, []EvalType) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *EvalGetProvider) Eval(ctx EvalContext) (interface{}, error) {
|
func (n *EvalGetProvider) Eval(
|
||||||
|
ctx EvalContext, args []interface{}) (interface{}, error) {
|
||||||
result := ctx.Provider(n.Name)
|
result := ctx.Provider(n.Name)
|
||||||
if result == nil {
|
if result == nil {
|
||||||
return nil, fmt.Errorf("provider %s not initialized", n.Name)
|
return nil, fmt.Errorf("provider %s not initialized", n.Name)
|
||||||
|
49
terraform/eval_provider_test.go
Normal file
49
terraform/eval_provider_test.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEvalInitProvider_impl(t *testing.T) {
|
||||||
|
var _ EvalNode = new(EvalInitProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvalInitProvider(t *testing.T) {
|
||||||
|
n := &EvalInitProvider{Name: "foo"}
|
||||||
|
provider := &MockResourceProvider{}
|
||||||
|
ctx := &MockEvalContext{InitProviderProvider: provider}
|
||||||
|
if actual, err := n.Eval(ctx, nil); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
} else if actual != provider {
|
||||||
|
t.Fatalf("bad: %#v", actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ctx.InitProviderCalled {
|
||||||
|
t.Fatal("should be called")
|
||||||
|
}
|
||||||
|
if ctx.InitProviderName != "foo" {
|
||||||
|
t.Fatalf("bad: %#v", ctx.InitProviderName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvalGetProvider_impl(t *testing.T) {
|
||||||
|
var _ EvalNode = new(EvalGetProvider)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEvalGetProvider(t *testing.T) {
|
||||||
|
n := &EvalGetProvider{Name: "foo"}
|
||||||
|
provider := &MockResourceProvider{}
|
||||||
|
ctx := &MockEvalContext{ProviderProvider: provider}
|
||||||
|
if actual, err := n.Eval(ctx, nil); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
} else if actual != provider {
|
||||||
|
t.Fatalf("bad: %#v", actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ctx.ProviderCalled {
|
||||||
|
t.Fatal("should be called")
|
||||||
|
}
|
||||||
|
if ctx.ProviderName != "foo" {
|
||||||
|
t.Fatalf("bad: %#v", ctx.ProviderName)
|
||||||
|
}
|
||||||
|
}
|
9
terraform/eval_test.go
Normal file
9
terraform/eval_test.go
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
package terraform
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMockEvalContext_impl(t *testing.T) {
|
||||||
|
var _ EvalContext = new(MockEvalContext)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user