Some checks failed
Docs Deploy / build_and_deploy (push) Has been cancelled
Generate Docs / cli (push) Has been cancelled
Generate Config Doc / cli (push) Has been cancelled
Go formatting / go-formatting (push) Has been cancelled
Check links / markdown-link-check (push) Has been cancelled
Integration / pre-test (push) Has been cancelled
Integration / test on (push) Has been cancelled
Integration / status (push) Has been cancelled
Lint / Lint Go code (push) Has been cancelled
Test / test (ubuntu-latest) (push) Has been cancelled
293 lines
6.1 KiB
Go
293 lines
6.1 KiB
Go
package field
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"git.cw.tr/mukan-network/mukan-ignite/ignite/pkg/errors"
|
|
"git.cw.tr/mukan-network/mukan-ignite/ignite/pkg/multiformatname"
|
|
"git.cw.tr/mukan-network/mukan-ignite/ignite/templates/field/datatype"
|
|
)
|
|
|
|
var (
|
|
noCheck = func(string) error { return nil }
|
|
alwaysInvalid = func(string) error { return errors.New("invalid Name") }
|
|
)
|
|
|
|
func TestForbiddenParseFields(t *testing.T) {
|
|
// check doesn't pass
|
|
_, err := ParseFields([]string{"foo"}, alwaysInvalid)
|
|
require.Error(t, err)
|
|
|
|
// duplicated field
|
|
_, err = ParseFields([]string{"foo", "foo:int"}, noCheck)
|
|
require.Error(t, err)
|
|
|
|
// invalid type
|
|
_, err = ParseFields([]string{"foo:invalid"}, alwaysInvalid)
|
|
require.Error(t, err)
|
|
|
|
// invalid field Name
|
|
_, err = ParseFields([]string{"foo@bar:int"}, alwaysInvalid)
|
|
require.Error(t, err)
|
|
|
|
// invalid format
|
|
_, err = ParseFields([]string{"foo:int:int"}, alwaysInvalid)
|
|
require.Error(t, err)
|
|
}
|
|
|
|
func TestParseFields1(t *testing.T) {
|
|
name1, err := multiformatname.NewName("foo")
|
|
require.NoError(t, err)
|
|
name2, err := multiformatname.NewName("fooBar")
|
|
require.NoError(t, err)
|
|
name3, err := multiformatname.NewName("bar-foo")
|
|
require.NoError(t, err)
|
|
name4, err := multiformatname.NewName("foo_foo")
|
|
require.NoError(t, err)
|
|
|
|
tests := []struct {
|
|
name string
|
|
fields []string
|
|
want Fields
|
|
err error
|
|
}{
|
|
{
|
|
name: "test string types",
|
|
fields: []string{
|
|
name1.Original,
|
|
name2.Original + ":string",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.String,
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.String,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test number types",
|
|
fields: []string{
|
|
name1.Original + ":uint",
|
|
name2.Original + ":int",
|
|
name3.Original + ":bool",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.Uint,
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.Int,
|
|
},
|
|
{
|
|
Name: name3,
|
|
DatatypeName: datatype.Bool,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test list types",
|
|
fields: []string{
|
|
name1.Original + ":array.uint",
|
|
name2.Original + ":array.int",
|
|
name3.Original + ":array.string",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.UintSlice,
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.IntSlice,
|
|
},
|
|
{
|
|
Name: name3,
|
|
DatatypeName: datatype.StringSlice,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test mixed types",
|
|
fields: []string{
|
|
name1.Original + ":uint",
|
|
name2.Original + ":array.coin",
|
|
name3.Original,
|
|
name4.Original + ":strings",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.Uint,
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.Coins,
|
|
},
|
|
{
|
|
Name: name3,
|
|
DatatypeName: datatype.String,
|
|
},
|
|
{
|
|
Name: name4,
|
|
DatatypeName: datatype.StringSliceAlias,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test custom types",
|
|
fields: []string{
|
|
name1.Original + ":Bla",
|
|
name2.Original + ":Test",
|
|
name4.Original + ":array.ProductDetails",
|
|
name3.Original,
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.Custom,
|
|
Datatype: "Bla",
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.Custom,
|
|
Datatype: "Test",
|
|
},
|
|
{
|
|
Name: name4,
|
|
DatatypeName: datatype.CustomSlice,
|
|
Datatype: "ProductDetails",
|
|
},
|
|
{
|
|
Name: name3,
|
|
DatatypeName: datatype.String,
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test lowercase custom types",
|
|
fields: []string{
|
|
name1.Original + ":employee",
|
|
name2.Original + ":array.employee",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.Custom,
|
|
Datatype: "Employee",
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.CustomSlice,
|
|
Datatype: "Employee",
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: "test sdk.Coin types",
|
|
fields: []string{
|
|
name1.Original + ":coin",
|
|
name2.Original + ":array.coin",
|
|
},
|
|
want: Fields{
|
|
{
|
|
Name: name1,
|
|
DatatypeName: datatype.Coin,
|
|
},
|
|
{
|
|
Name: name2,
|
|
DatatypeName: datatype.Coins,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := ParseFields(tt.fields, noCheck)
|
|
if tt.err != nil {
|
|
require.ErrorIs(t, err, tt.err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestMultipleCoins(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
fields []string
|
|
want bool
|
|
err error
|
|
}{
|
|
{
|
|
name: "single coin field",
|
|
fields: []string{"amount:coin"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "multiple coin fields",
|
|
fields: []string{"amount:coin", "price:coin"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "coin and coins fields",
|
|
fields: []string{"amount:coin", "price:coins"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "multiple coins and decimal coins fields",
|
|
fields: []string{"amount:array.coin", "price:array.dec.coin"},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "single coins field",
|
|
fields: []string{"amount:array.coin"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "multiple coins fields",
|
|
fields: []string{"amount:array.coin", "price:coins"},
|
|
want: true,
|
|
},
|
|
{
|
|
name: "mixed coin and coins fields",
|
|
fields: []string{"amount:coin", "price:dec.coins"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "no coin fields",
|
|
fields: []string{"name:string", "age:int"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "mixed types with single coin",
|
|
fields: []string{"name:string", "amount:coin", "age:int"},
|
|
want: false,
|
|
},
|
|
{
|
|
name: "mixed types with multiple coins",
|
|
fields: []string{"name:string", "amount:array.coin", "price:dec.coins", "age:int"},
|
|
want: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := MultipleCoins(tt.fields)
|
|
if tt.err != nil {
|
|
require.ErrorIs(t, err, tt.err)
|
|
return
|
|
}
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, tt.want, got)
|
|
})
|
|
}
|
|
}
|