dynamo-browse/internal/dynamo-browse/models/attrcodec/codec_test.go
Leon Mika f65c5778a9
issue-50: fixed package name (#52)
Changed package name from github.com/lmika/audax to github.com/lmika/dynamo-browse
2023-04-17 08:31:03 +10:00

112 lines
4.2 KiB
Go

package attrcodec_test
import (
"bytes"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/lmika/dynamo-browse/internal/dynamo-browse/models/attrcodec"
"github.com/stretchr/testify/assert"
"strings"
"testing"
)
func TestCodec(t *testing.T) {
t.Run("should be able to encode and decode", func(t *testing.T) {
scenarios := []struct {
name string
val types.AttributeValue
}{
{name: "string", val: &types.AttributeValueMemberS{Value: "Hello world"}},
{name: "empty string", val: &types.AttributeValueMemberS{Value: ""}},
{name: "large string", val: &types.AttributeValueMemberS{Value: strings.Repeat("DynamoDB", 256)}},
{name: "number", val: &types.AttributeValueMemberN{Value: "12345"}},
{name: "large number", val: &types.AttributeValueMemberN{Value: "123456789012345678901234567890"}},
{name: "true bool", val: &types.AttributeValueMemberBOOL{Value: true}},
{name: "false bool", val: &types.AttributeValueMemberBOOL{Value: false}},
{name: "true null", val: &types.AttributeValueMemberNULL{Value: true}},
{name: "false null", val: &types.AttributeValueMemberNULL{Value: false}},
{name: "bytes", val: &types.AttributeValueMemberB{Value: []byte{1, 2, 3, 4, 5}}},
{name: "simple list", val: &types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberS{Value: "apple"},
&types.AttributeValueMemberS{Value: "banana"},
&types.AttributeValueMemberS{Value: "cherry"},
}}},
{name: "nested lists", val: &types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberS{Value: "red apple"},
&types.AttributeValueMemberS{Value: "green apple"},
}},
&types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberS{Value: "banana"},
&types.AttributeValueMemberS{Value: "banana bread"},
&types.AttributeValueMemberS{Value: "banana cake"},
}},
&types.AttributeValueMemberS{Value: "cherry"},
&types.AttributeValueMemberS{Value: "can't make anything with cherries"},
}}},
{name: "simple map", val: &types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
"alpha": &types.AttributeValueMemberS{Value: "I am an apple"},
"bravo": &types.AttributeValueMemberN{Value: "123.45"},
"charlie": &types.AttributeValueMemberS{Value: "things go here"},
}}},
{name: "nested maps", val: &types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
"alpha": &types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberS{Value: "red apple"},
&types.AttributeValueMemberS{Value: "green apple"},
}},
"bravo": &types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
"good": &types.AttributeValueMemberS{Value: "stuff"},
"is": &types.AttributeValueMemberS{Value: "written"},
"in": &types.AttributeValueMemberS{Value: "the unit tests"},
}},
"coords": &types.AttributeValueMemberL{Value: []types.AttributeValue{
&types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
"lat": &types.AttributeValueMemberN{Value: "12.34"},
"long": &types.AttributeValueMemberN{Value: "45.78"},
}},
&types.AttributeValueMemberM{Value: map[string]types.AttributeValue{
"lat": &types.AttributeValueMemberN{Value: "11.22"},
"long": &types.AttributeValueMemberN{Value: "33.44"},
}},
}},
}}},
{name: "binary set", val: &types.AttributeValueMemberBS{Value: [][]byte{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}}},
{name: "number set", val: &types.AttributeValueMemberNS{Value: []string{
"123",
"456",
"789",
}}},
{name: "string set", val: &types.AttributeValueMemberSS{Value: []string{
"more",
"string",
"stuff",
}}},
}
for _, scenario := range scenarios {
t.Run(scenario.name, func(t *testing.T) {
bfr := new(bytes.Buffer)
err := attrcodec.NewEncoder(bfr).Encode(scenario.val)
assert.NoError(t, err)
t.Logf("length = %v", bfr.Len())
otherVal, err := attrcodec.NewDecoder(bfr).Decode()
assert.NoError(t, err)
assert.Equal(t, scenario.val, otherVal)
})
}
})
}