encode_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package dynamodbattribute
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. "github.com/aws/aws-sdk-go/aws"
  7. "github.com/aws/aws-sdk-go/aws/awserr"
  8. "github.com/aws/aws-sdk-go/service/dynamodb"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestMarshalErrorTypes(t *testing.T) {
  12. var _ awserr.Error = (*InvalidMarshalError)(nil)
  13. var _ awserr.Error = (*unsupportedMarshalTypeError)(nil)
  14. }
  15. func TestMarshalShared(t *testing.T) {
  16. for i, c := range sharedTestCases {
  17. av, err := Marshal(c.expected)
  18. assertConvertTest(t, i, av, c.in, err, c.err)
  19. }
  20. }
  21. func TestMarshalListShared(t *testing.T) {
  22. for i, c := range sharedListTestCases {
  23. av, err := MarshalList(c.expected)
  24. assertConvertTest(t, i, av, c.in, err, c.err)
  25. }
  26. }
  27. func TestMarshalMapShared(t *testing.T) {
  28. for i, c := range sharedMapTestCases {
  29. av, err := MarshalMap(c.expected)
  30. assertConvertTest(t, i, av, c.in, err, c.err)
  31. }
  32. }
  33. type marshalMarshaler struct {
  34. Value string
  35. Value2 int
  36. Value3 bool
  37. Value4 time.Time
  38. }
  39. func (m *marshalMarshaler) MarshalDynamoDBAttributeValue(av *dynamodb.AttributeValue) error {
  40. av.M = map[string]*dynamodb.AttributeValue{
  41. "abc": {S: &m.Value},
  42. "def": {N: aws.String(fmt.Sprintf("%d", m.Value2))},
  43. "ghi": {BOOL: &m.Value3},
  44. "jkl": {S: aws.String(m.Value4.Format(time.RFC3339Nano))},
  45. }
  46. return nil
  47. }
  48. func TestMarshalMashaler(t *testing.T) {
  49. m := &marshalMarshaler{
  50. Value: "value",
  51. Value2: 123,
  52. Value3: true,
  53. Value4: testDate,
  54. }
  55. expect := &dynamodb.AttributeValue{
  56. M: map[string]*dynamodb.AttributeValue{
  57. "abc": {S: aws.String("value")},
  58. "def": {N: aws.String("123")},
  59. "ghi": {BOOL: aws.Bool(true)},
  60. "jkl": {S: aws.String("2016-05-03T17:06:26.209072Z")},
  61. },
  62. }
  63. actual, err := Marshal(m)
  64. assert.NoError(t, err)
  65. assert.Equal(t, expect, actual)
  66. }
  67. type testOmitEmptyElemListStruct struct {
  68. Values []string `dynamodbav:",omitemptyelem"`
  69. }
  70. type testOmitEmptyElemMapStruct struct {
  71. Values map[string]interface{} `dynamodbav:",omitemptyelem"`
  72. }
  73. func TestMarshalListOmitEmptyElem(t *testing.T) {
  74. expect := &dynamodb.AttributeValue{
  75. M: map[string]*dynamodb.AttributeValue{
  76. "Values": {L: []*dynamodb.AttributeValue{
  77. {S: aws.String("abc")},
  78. {S: aws.String("123")},
  79. }},
  80. },
  81. }
  82. m := testOmitEmptyElemListStruct{Values: []string{"abc", "", "123"}}
  83. actual, err := Marshal(m)
  84. assert.NoError(t, err)
  85. assert.Equal(t, expect, actual)
  86. }
  87. func TestMarshalMapOmitEmptyElem(t *testing.T) {
  88. expect := &dynamodb.AttributeValue{
  89. M: map[string]*dynamodb.AttributeValue{
  90. "Values": {M: map[string]*dynamodb.AttributeValue{
  91. "abc": {N: aws.String("123")},
  92. "klm": {S: aws.String("abc")},
  93. }},
  94. },
  95. }
  96. m := testOmitEmptyElemMapStruct{Values: map[string]interface{}{
  97. "abc": 123.,
  98. "efg": nil,
  99. "hij": "",
  100. "klm": "abc",
  101. }}
  102. actual, err := Marshal(m)
  103. assert.NoError(t, err)
  104. assert.Equal(t, expect, actual)
  105. }
  106. type testOmitEmptyScalar struct {
  107. IntZero int `dynamodbav:",omitempty"`
  108. IntPtrNil *int `dynamodbav:",omitempty"`
  109. IntPtrSetZero *int `dynamodbav:",omitempty"`
  110. }
  111. func TestMarshalOmitEmpty(t *testing.T) {
  112. expect := &dynamodb.AttributeValue{
  113. M: map[string]*dynamodb.AttributeValue{
  114. "IntPtrSetZero": {N: aws.String("0")},
  115. },
  116. }
  117. m := testOmitEmptyScalar{IntPtrSetZero: aws.Int(0)}
  118. actual, err := Marshal(m)
  119. assert.NoError(t, err)
  120. assert.Equal(t, expect, actual)
  121. }