Files
upstream-corteza/server/pkg/dal/alteration_test.go
upstream-mirror 7e385fc126
Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
snapshot of https://github.com/cortezaproject/corteza.git (2024.9.x, 2026-09-18; blobs > 131072B omitted)
2026-09-18 01:22:23 +05:00

601 lines
11 KiB
Go

package dal
import (
"encoding/json"
"reflect"
"testing"
"github.com/stretchr/testify/require"
)
func TestMerge(t *testing.T) {
tcc := []struct {
name string
aa AlterationSet
bb AlterationSet
cc AlterationSet
}{
{
name: "empty",
aa: AlterationSet{},
bb: AlterationSet{},
cc: AlterationSet{},
},
{
name: "aa empty",
aa: AlterationSet{},
bb: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "bb empty",
aa: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "remove duplicates",
aa: AlterationSet{},
bb: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "un matching types",
aa: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "match AttributeAdd",
aa: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "not match AttributeAdd",
aa: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "bar",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
&Alteration{
AttributeAdd: &AttributeAdd{
Attr: &Attribute{
Ident: "bar",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "match AttributeDelete",
aa: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "not match AttributeDelete",
aa: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "bar",
Type: &TypeJSON{Nullable: false},
},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "foo",
Type: &TypeJSON{Nullable: false},
},
},
},
&Alteration{
AttributeDelete: &AttributeDelete{
Attr: &Attribute{
Ident: "bar",
Type: &TypeJSON{Nullable: false},
},
},
},
},
},
{
name: "match AttributeReType",
aa: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeBoolean{Nullable: false},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeBoolean{Nullable: false},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeBoolean{Nullable: false},
},
},
},
},
{
name: "not match AttributeReType",
aa: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeBoolean{Nullable: false},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeText{Nullable: false},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeBoolean{Nullable: false},
},
},
&Alteration{
AttributeReType: &AttributeReType{
Attr: &Attribute{
Ident: "foo",
},
To: &TypeText{Nullable: false},
},
},
},
},
{
name: "match AttributeReEncode",
aa: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecPlain{},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecPlain{},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecPlain{},
},
},
},
},
{
name: "not match AttributeReEncode",
aa: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecPlain{},
},
},
},
bb: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecAlias{Ident: "foo2"},
},
},
},
cc: AlterationSet{
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecPlain{},
},
},
&Alteration{
AttributeReEncode: &AttributeReEncode{
Attr: &Attribute{Ident: "foo"},
To: &CodecAlias{Ident: "foo2"},
},
},
},
},
{
name: "match ModelAdd",
aa: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "foo"},
},
},
},
bb: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "foo"},
},
},
},
cc: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "foo"},
},
},
},
},
{
name: "not match ModelAdd",
aa: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "foo"},
},
},
},
bb: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "bar"},
},
},
},
cc: AlterationSet{
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "foo"},
},
},
&Alteration{
ModelAdd: &ModelAdd{
Model: &Model{Ident: "bar"},
},
},
},
},
{
name: "match ModelDelete",
aa: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "foo"},
},
},
},
bb: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "foo"},
},
},
},
cc: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "foo"},
},
},
},
},
{
name: "not match ModelDelete",
aa: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "foo"},
},
},
},
bb: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "bar"},
},
},
},
cc: AlterationSet{
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "foo"},
},
},
&Alteration{
ModelDelete: &ModelDelete{
Model: &Model{Ident: "bar"},
},
},
},
},
}
req := require.New(t)
for _, tc := range tcc {
t.Run(tc.name, func(t *testing.T) {
cc := tc.aa.Merge(tc.bb)
req.Len(cc, len(tc.cc))
for i, c := range cc {
cmp := c.compare(*tc.cc[i])
req.True(cmp)
}
})
}
}
func TestReTypeMarshling(t *testing.T) {
a := &AttributeReType{
Attr: &Attribute{
Ident: "foo",
Type: &TypeBlob{},
Store: &CodecPlain{},
},
To: &TypeBoolean{},
}
bb, err := json.Marshal(a)
require.NoError(t, err)
b := &AttributeReType{}
err = json.Unmarshal(bb, &b)
require.NoError(t, err)
require.True(t, reflect.DeepEqual(a, b))
}
func TestReEncodeMarshling(t *testing.T) {
a := &AttributeReEncode{
Attr: &Attribute{
Ident: "foo",
Type: &TypeBlob{},
Store: &CodecPlain{},
},
To: &CodecAlias{Ident: "bar"},
}
bb, err := json.Marshal(a)
require.NoError(t, err)
b := &AttributeReEncode{}
err = json.Unmarshal(bb, &b)
require.NoError(t, err)
require.True(t, reflect.DeepEqual(a, b))
}