package meta_test import ( "bytes" "encoding/hex" "testing" "git.bit5.ru/backend/meta/v5" "github.com/stretchr/testify/require" ) func TestMsgpackReader(t *testing.T) { t.Run("reading parent", func(t *testing.T) { // ["blabla",[1],[2,4,6],[[10],[1024]],null] src := "95A6626C61626C6191019302040692910A91CD0400C0" expected := TestParent{ Field1: "blabla", Field2: TestFoo{ Field: 1, }, Field3: []int8{2, 4, 6}, Field4: []TestFoo{ {Field: 10}, {Field: 1024}, }, } data, err := hex.DecodeString(src) require.NoError(t, err) rdr := meta.NewMsgpackReader(bytes.NewReader(data)) var actual TestParent readErr := actual.Read(rdr) require.NoError(t, readErr) require.EqualValues(t, expected, actual) }) t.Run("reading child", func(t *testing.T) { // ["blabla",[1],[2,4,6],[[10],[1024]],null,"qwerty"] src := "96A6626C61626C6191019302040692910A91CD0400C0A6717765727479" expected := TestChild{ Field: "qwerty", TestParent: TestParent{ Field1: "blabla", Field2: TestFoo{ Field: 1, }, Field3: []int8{2, 4, 6}, Field4: []TestFoo{ {Field: 10}, {Field: 1024}, }, }, } data, err := hex.DecodeString(src) require.NoError(t, err) rdr := meta.NewMsgpackReader(bytes.NewReader(data)) var actual TestChild readErr := actual.Read(rdr) require.NoError(t, readErr) require.EqualValues(t, expected, actual) }) t.Run("fail reading parent as map", func(t *testing.T) { // {"f1":"blabla","f3":[2,4,6],"f2":{"field":1},"f4":[{"field":10},{"field":1024}]} src := "84a26631a6626c61626c61a2663393020406a2663281a56669656c6401a266349281a56669656c640a81a56669656c64cd0400" expected := TestParent{} data, err := hex.DecodeString(src) require.NoError(t, err) rdr := meta.NewMsgpackReader(bytes.NewReader(data)) var actual TestParent readErr := actual.Read(rdr) require.ErrorContains(t, readErr, "field `` is not an array") require.EqualValues(t, expected, actual) }) t.Run("fail reading parent as array with maps", func(t *testing.T) { // ["blabla",{"field":1},[2,4,6],[{"field":10},{"field":1024}]] src := "94a6626c61626c6181a56669656c6401930204069281a56669656c640a81a56669656c64cd0400" expected := TestParent{ Field1: "blabla", Field3: []int8{}, Field4: []TestFoo{}, } data, err := hex.DecodeString(src) require.NoError(t, err) rdr := meta.NewMsgpackReader(bytes.NewReader(data)) var actual TestParent readErr := actual.Read(rdr) require.ErrorContains(t, readErr, "field `f2` is not an array") require.EqualValues(t, expected, actual) }) t.Run("fail reading child struct as map", func(t *testing.T) { // {"f":"qwerty","f1":"blabla","f3":[2,4,6],"f2":{"field":1},"f4":[{"field":10},{"field":1024}]} src := "85a166a6717765727479a26631a6626c61626c61a2663393020406a2663281a56669656c6401a266349281a56669656c640a81a56669656c64cd0400" expected := TestChild{} data, err := hex.DecodeString(src) require.NoError(t, err) rdr := meta.NewMsgpackReader(bytes.NewReader(data)) var actual TestChild readErr := actual.Read(rdr) require.ErrorContains(t, readErr, "field `` is not an array") require.EqualValues(t, expected, actual) }) }