blob: b20fd4f0454800c3422a7933af36c8d7ab70e24c [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package plans
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/internal/configs/configschema"
"github.com/hashicorp/terraform/internal/lang/marks"
"github.com/hashicorp/terraform/internal/providers"
"github.com/zclconf/go-cty/cty"
)
func TestChangeEncodeSensitive(t *testing.T) {
testVals := []struct {
val cty.Value
schema providers.Schema
}{
{
val: cty.ObjectVal(map[string]cty.Value{
"ding": cty.StringVal("dong").Mark(marks.Sensitive),
}),
schema: providers.Schema{
Body: &configschema.Block{
Attributes: map[string]*configschema.Attribute{
"ding": {
Type: cty.String,
Required: true,
},
},
},
},
},
{
val: cty.ObjectVal(map[string]cty.Value{
"ding": cty.StringVal("bleep").Mark(marks.Sensitive),
}),
schema: providers.Schema{
Body: &configschema.Block{
Attributes: map[string]*configschema.Attribute{
"ding": {
Type: cty.String,
Required: true,
},
},
},
},
},
{
val: cty.ObjectVal(map[string]cty.Value{
"ding": cty.ListVal([]cty.Value{cty.UnknownVal(cty.String).Mark(marks.Sensitive)}),
}),
schema: providers.Schema{
Body: &configschema.Block{
Attributes: map[string]*configschema.Attribute{
"ding": {
Type: cty.List(cty.String),
Required: false,
},
},
},
},
},
}
for _, v := range testVals {
t.Run(fmt.Sprintf("%#v", v), func(t *testing.T) {
change := Change{
Before: cty.NullVal(v.val.Type()),
After: v.val,
}
encoded, err := change.Encode(&v.schema)
if err != nil {
t.Fatal(err)
}
decoded, err := encoded.Decode(&v.schema)
if err != nil {
t.Fatal(err)
}
if !v.val.RawEquals(decoded.After) {
t.Fatalf("%#v != %#v\n", decoded.After, v)
}
})
}
}
// make sure we get a valid value back even when faced with an error
func TestChangeEncodeError(t *testing.T) {
changes := &Changes{
Outputs: []*OutputChange{
{
// Missing Addr
Change: Change{
Before: cty.NullVal(cty.DynamicPseudoType),
// can't encode a marked value
After: cty.StringVal("test").Mark("shoult not be here"),
},
},
},
}
// no resources so we can get by with no schemas
changesSrc, err := changes.Encode(nil)
if err == nil {
t.Fatal("expected error")
}
if changesSrc == nil {
t.Fatal("changesSrc should not be nil")
}
}