blob: 29b6115d62e9800975d49a98806977d48f6e0af2 [file] [log] [blame]
package configschema
import (
"testing"
"github.com/zclconf/go-cty/cty"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)
func TestFilter(t *testing.T) {
testCases := map[string]struct {
schema *Block
filterAttribute FilterT[*Attribute]
filterBlock FilterT[*NestedBlock]
want *Block
}{
"empty": {
schema: &Block{},
filterAttribute: FilterDeprecatedAttribute,
filterBlock: FilterDeprecatedBlock,
want: &Block{},
},
"noop": {
schema: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Required: true,
},
},
BlockTypes: map[string]*NestedBlock{
"list": {
Nesting: NestingList,
Block: Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Required: true,
},
},
},
},
},
},
filterAttribute: nil,
filterBlock: nil,
want: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Required: true,
},
},
BlockTypes: map[string]*NestedBlock{
"list": {
Nesting: NestingList,
Block: Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Required: true,
},
},
},
},
},
},
},
"filter_deprecated": {
schema: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"deprecated_string": {
Type: cty.String,
Deprecated: true,
},
"nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
},
"deprecated_string": {
Type: cty.String,
Deprecated: true,
},
},
Nesting: NestingList,
},
},
},
BlockTypes: map[string]*NestedBlock{
"list": {
Nesting: NestingList,
Block: Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
},
Deprecated: true,
},
},
},
},
filterAttribute: FilterDeprecatedAttribute,
filterBlock: FilterDeprecatedBlock,
want: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
},
},
Nesting: NestingList,
},
},
},
},
},
"filter_read_only": {
schema: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"read_only_string": {
Type: cty.String,
Computed: true,
},
"nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"read_only_string": {
Type: cty.String,
Computed: true,
},
"deeply_nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"number": {
Type: cty.Number,
Required: true,
},
"read_only_number": {
Type: cty.Number,
Computed: true,
},
},
Nesting: NestingList,
},
},
},
Nesting: NestingList,
},
},
},
BlockTypes: map[string]*NestedBlock{
"list": {
Nesting: NestingList,
Block: Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"read_only_string": {
Type: cty.String,
Computed: true,
},
},
},
},
},
},
filterAttribute: FilterReadOnlyAttribute,
filterBlock: nil,
want: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
"deeply_nested": {
NestedType: &Object{
Attributes: map[string]*Attribute{
"number": {
Type: cty.Number,
Required: true,
},
},
Nesting: NestingList,
},
},
},
Nesting: NestingList,
},
},
},
BlockTypes: map[string]*NestedBlock{
"list": {
Nesting: NestingList,
Block: Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
},
},
},
},
},
},
},
"filter_optional_computed_id": {
schema: &Block{
Attributes: map[string]*Attribute{
"id": {
Type: cty.String,
Optional: true,
Computed: true,
},
"string": {
Type: cty.String,
Optional: true,
Computed: true,
},
},
},
filterAttribute: FilterHelperSchemaIdAttribute,
filterBlock: nil,
want: &Block{
Attributes: map[string]*Attribute{
"string": {
Type: cty.String,
Optional: true,
Computed: true,
},
},
},
},
}
for name, tc := range testCases {
t.Run(name, func(t *testing.T) {
got := tc.schema.Filter(tc.filterAttribute, tc.filterBlock)
if !cmp.Equal(got, tc.want, cmp.Comparer(cty.Type.Equals), cmpopts.EquateEmpty()) {
t.Fatal(cmp.Diff(got, tc.want, cmp.Comparer(cty.Type.Equals), cmpopts.EquateEmpty()))
}
})
}
}