cosmos-sdk/schema/diff/state_object_diff_test.go
Aaron Craelius ae40e809b9
refactor(schema)!: rename ObjectType -> StateObjectType (#21691)
Co-authored-by: cool-developer <51834436+cool-develope@users.noreply.github.com>
2024-09-16 08:17:52 +00:00

270 lines
8.6 KiB
Go

package diff
import (
"reflect"
"testing"
"cosmossdk.io/schema"
)
func Test_objectTypeDiff(t *testing.T) {
tt := []struct {
name string
oldType schema.StateObjectType
newType schema.StateObjectType
diff StateObjectTypeDiff
trueF func(StateObjectTypeDiff) bool
hasCompatibleChanges bool
}{
{
name: "no change",
oldType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
newType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
diff: StateObjectTypeDiff{},
trueF: StateObjectTypeDiff.Empty,
hasCompatibleChanges: true,
},
{
name: "key fields changed",
oldType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
newType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "id", Kind: schema.StringKind}},
},
diff: StateObjectTypeDiff{
KeyFieldsDiff: FieldsDiff{
Changed: []FieldDiff{
{
Name: "id",
OldKind: schema.Int32Kind,
NewKind: schema.StringKind,
},
},
},
},
trueF: func(d StateObjectTypeDiff) bool { return !d.KeyFieldsDiff.Empty() },
hasCompatibleChanges: false,
},
{
name: "value fields changed",
oldType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "name", Kind: schema.StringKind}},
},
newType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "name", Kind: schema.Int32Kind}},
},
diff: StateObjectTypeDiff{
ValueFieldsDiff: FieldsDiff{
Changed: []FieldDiff{
{
Name: "name",
OldKind: schema.StringKind,
NewKind: schema.Int32Kind,
},
},
},
},
trueF: func(d StateObjectTypeDiff) bool { return !d.ValueFieldsDiff.Empty() },
hasCompatibleChanges: false,
},
{
name: "nullable value field added",
oldType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
newType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind, Nullable: true}},
},
diff: StateObjectTypeDiff{
ValueFieldsDiff: FieldsDiff{
Added: []schema.Field{{Name: "name", Kind: schema.StringKind, Nullable: true}},
},
},
trueF: func(d StateObjectTypeDiff) bool { return !d.ValueFieldsDiff.Empty() },
hasCompatibleChanges: true,
},
{
name: "non-nullable value field added",
oldType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
newType: schema.StateObjectType{
ValueFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
},
diff: StateObjectTypeDiff{
ValueFieldsDiff: FieldsDiff{
Added: []schema.Field{{Name: "name", Kind: schema.StringKind}},
},
},
trueF: func(d StateObjectTypeDiff) bool { return !d.ValueFieldsDiff.Empty() },
hasCompatibleChanges: false,
},
{
name: "fields reordered",
oldType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
ValueFields: []schema.Field{{Name: "x", Kind: schema.Int32Kind}, {Name: "y", Kind: schema.StringKind}},
},
newType: schema.StateObjectType{
KeyFields: []schema.Field{{Name: "name", Kind: schema.StringKind}, {Name: "id", Kind: schema.Int32Kind}},
ValueFields: []schema.Field{{Name: "y", Kind: schema.StringKind}, {Name: "x", Kind: schema.Int32Kind}},
},
diff: StateObjectTypeDiff{
KeyFieldsDiff: FieldsDiff{
OldOrder: []string{"id", "name"},
NewOrder: []string{"name", "id"},
},
ValueFieldsDiff: FieldsDiff{
OldOrder: []string{"x", "y"},
NewOrder: []string{"y", "x"},
},
},
trueF: func(d StateObjectTypeDiff) bool { return !d.KeyFieldsDiff.Empty() && !d.ValueFieldsDiff.Empty() },
hasCompatibleChanges: false,
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
got := compareObjectType(tc.oldType, tc.newType)
if !reflect.DeepEqual(got, tc.diff) {
t.Errorf("compareObjectType() = %v, want %v", got, tc.diff)
}
hasCompatibleChanges := got.HasCompatibleChanges()
if hasCompatibleChanges != tc.hasCompatibleChanges {
t.Errorf("HasCompatibleChanges() = %v, want %v", hasCompatibleChanges, tc.hasCompatibleChanges)
}
})
}
}
func Test_fieldsDiff(t *testing.T) {
tt := []struct {
name string
oldFields []schema.Field
newFields []schema.Field
diff FieldsDiff
}{
{
name: "no change",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
},
{
name: "field added",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
diff: FieldsDiff{
Added: []schema.Field{{Name: "name", Kind: schema.StringKind}},
},
},
{
name: "field removed",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
diff: FieldsDiff{
Removed: []schema.Field{{Name: "name", Kind: schema.StringKind}},
},
},
{
name: "field changed",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.Int32Kind}},
diff: FieldsDiff{
Changed: []FieldDiff{
{
Name: "name",
OldKind: schema.StringKind,
NewKind: schema.Int32Kind,
},
},
},
},
{
name: "field order changed",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.StringKind}},
newFields: []schema.Field{{Name: "name", Kind: schema.StringKind}, {Name: "id", Kind: schema.Int32Kind}},
diff: FieldsDiff{
OldOrder: []string{"id", "name"},
NewOrder: []string{"name", "id"},
},
},
{
name: "field order changed with added fields",
oldFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
newFields: []schema.Field{{Name: "name", Kind: schema.StringKind}, {Name: "id", Kind: schema.Int32Kind}},
diff: FieldsDiff{
Added: []schema.Field{{Name: "name", Kind: schema.StringKind}},
OldOrder: []string{"id"},
NewOrder: []string{"name", "id"},
},
},
{
name: "field order changed with removed fields",
oldFields: []schema.Field{{Name: "name", Kind: schema.StringKind}, {Name: "id", Kind: schema.Int32Kind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
diff: FieldsDiff{
Removed: []schema.Field{{Name: "name", Kind: schema.StringKind}},
OldOrder: []string{"name", "id"},
NewOrder: []string{"id"},
},
},
{
name: "field order changed with changed fields",
oldFields: []schema.Field{{Name: "name", Kind: schema.StringKind}, {Name: "id", Kind: schema.Int32Kind}},
newFields: []schema.Field{{Name: "id", Kind: schema.Int32Kind}, {Name: "name", Kind: schema.Int32Kind}},
diff: FieldsDiff{
Changed: []FieldDiff{
{
Name: "name",
OldKind: schema.StringKind,
NewKind: schema.Int32Kind,
},
},
OldOrder: []string{"name", "id"},
NewOrder: []string{"id", "name"},
},
},
{
name: "added, removed, changed and reordered fields",
oldFields: []schema.Field{
{Name: "id", Kind: schema.Int32Kind},
{Name: "name", Kind: schema.StringKind},
{Name: "age", Kind: schema.Int32Kind},
},
newFields: []schema.Field{
{Name: "name", Kind: schema.Int32Kind},
{Name: "age", Kind: schema.Int32Kind},
{Name: "email", Kind: schema.StringKind},
},
diff: FieldsDiff{
Added: []schema.Field{{Name: "email", Kind: schema.StringKind}},
Removed: []schema.Field{{Name: "id", Kind: schema.Int32Kind}},
Changed: []FieldDiff{
{
Name: "name",
OldKind: schema.StringKind,
NewKind: schema.Int32Kind,
},
},
OldOrder: []string{"id", "name", "age"},
NewOrder: []string{"name", "age", "email"},
},
},
}
for _, tc := range tt {
t.Run(tc.name, func(t *testing.T) {
got := compareFields(tc.oldFields, tc.newFields)
if !reflect.DeepEqual(got, tc.diff) {
t.Errorf("compareFields() = %v, want %v", got, tc.diff)
}
})
}
}