github.com/stripe/stripe-go/v76@v76.25.0/example/deserialization_test.go (about) 1 package example 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 assert "github.com/stretchr/testify/require" 8 stripe "github.com/stripe/stripe-go/v76" 9 ) 10 11 type APIResource = stripe.APIResource 12 type ListMeta = stripe.ListMeta 13 14 var parseID = stripe.ParseID 15 16 func ParseID(data []byte) (string, bool) { 17 return string(data), false 18 } 19 20 func TestStubWithIdDirect(t *testing.T) { 21 input := []byte("{\"some_ref\":{\"id\":\"xyz\"}}") 22 var resource MyResource 23 err := json.Unmarshal(input, &resource) 24 assert.Equal(t, nil, err) 25 assert.Equal(t, "xyz", resource.SomeRef.ID) 26 } 27 28 func TestStubWithIdExpanded(t *testing.T) { 29 input := []byte("{\"some_expandable\":{\"id\":\"xyz\"}}") 30 var resource MyResource 31 err := json.Unmarshal(input, &resource) 32 assert.Equal(t, nil, err) 33 assert.Equal(t, "xyz", resource.SomeExpandable.ID) 34 } 35 36 func TestStubWithIdArrayExpanded(t *testing.T) { 37 input := []byte("{\"some_expanded_array\":[{\"id\":\"xyz\"}]}") 38 var resource MyResource 39 err := json.Unmarshal(input, &resource) 40 assert.Equal(t, nil, err) 41 assert.Equal(t, "xyz", resource.SomeExpandedArray[0].ID) 42 } 43 44 func TestStubWithIdInArray(t *testing.T) { 45 input := []byte("{\"some_ref_array\":[{\"id\":\"xyz\"}]}") 46 var resource MyResource 47 err := json.Unmarshal(input, &resource) 48 assert.Equal(t, nil, err) 49 assert.Equal(t, "xyz", resource.SomeRefArray[0].ID) 50 } 51 52 func TestStubWithIdInListObject(t *testing.T) { 53 input := []byte("{\"some_list_object\":{\"data\":[{\"id\":\"xyz\"}]}}") 54 var resource MyResource 55 err := json.Unmarshal(input, &resource) 56 assert.Equal(t, nil, err) 57 assert.Equal(t, "xyz", resource.SomeListObject.Data[0].ID) 58 } 59 60 func TestEmptyObjectDirect(t *testing.T) { 61 input := []byte("{\"some_ref\":{}}") 62 var resource MyResource 63 err := json.Unmarshal(input, &resource) 64 assert.Equal(t, nil, err) 65 assert.Equal(t, "", resource.SomeRef.ID) 66 } 67 68 func TestEmptyObjectArray(t *testing.T) { 69 input := []byte("{\"some_ref_array\":[{}]}") 70 var resource MyResource 71 err := json.Unmarshal(input, &resource) 72 assert.Equal(t, nil, err) 73 assert.Equal(t, "", resource.SomeRefArray[0].ID) 74 } 75 76 func TestEmptyObjectExpanded(t *testing.T) { 77 input := []byte("{\"some_expandable\":{}}") 78 var resource MyResource 79 err := json.Unmarshal(input, &resource) 80 assert.Equal(t, nil, err) 81 assert.Equal(t, "", resource.SomeExpandable.ID) 82 } 83 84 func TestEmptyObjectArrayExpanded(t *testing.T) { 85 input := []byte("{\"some_expanded_array\":[{}]}") 86 var resource MyResource 87 err := json.Unmarshal(input, &resource) 88 assert.Equal(t, nil, err) 89 assert.Equal(t, "", resource.SomeExpandedArray[0].ID) 90 } 91 92 type MyResourceSomeLiteral string 93 94 // List of values that MyResourceSomeLiteral can take 95 const ( 96 MyResourceSomeLiteralLiteral MyResourceSomeLiteral = "literal" 97 ) 98 99 type MyResourceSomeEnum string 100 101 // List of values that MyResourceSomeEnum can take 102 const ( 103 MyResourceSomeEnumFoo MyResourceSomeEnum = "foo" 104 MyResourceSomeEnumBar MyResourceSomeEnum = "bar" 105 ) 106 107 type MyResourceSomePolymorphicGroupType string 108 109 // List of values that MyResourceSomePolymorphicGroupType can take 110 const ( 111 MyResourceSomePolymorphicGroupTypeMyResource MyResourceSomePolymorphicGroupType = "MyResource" 112 MyResourceSomePolymorphicGroupTypeMyResourceSomeObject MyResourceSomePolymorphicGroupType = "MyResourceSomeObject" 113 ) 114 115 type MyResourceSomeObject struct { 116 SomeString string `json:"some_string"` 117 } 118 type MyResource struct { 119 ID string `json:"id"` 120 SomeBoolean bool `json:"some_boolean"` 121 SomeDatetime int64 `json:"some_datetime"` 122 SomeDecimalString float64 `json:"some_decimal_string,string"` 123 SomeEnum MyResourceSomeEnum `json:"some_enum"` 124 SomeExpandable *MyResource `json:"some_expandable"` 125 SomeExpandedArray []*MyResource `json:"some_expanded_array"` 126 SomeInteger int64 `json:"some_integer"` 127 SomeListObject *MyResourceList `json:"some_list_object"` 128 SomeLiteral MyResourceSomeLiteral `json:"some_literal"` 129 SomeLonginteger int64 `json:"some_longinteger"` 130 SomeMap map[string]string `json:"some_map"` 131 SomeNullable string `json:"some_nullable"` 132 SomeNumber float64 `json:"some_number"` 133 SomeObject *MyResourceSomeObject `json:"some_object"` 134 SomePolymorphicGroup MyResourceSomePolymorphicGroup `json:"some_polymorphic_group"` 135 SomeRef *MyResource `json:"some_ref"` 136 SomeRefArray []*MyResource `json:"some_ref_array"` 137 SomeString string `json:"some_string"` 138 SomeStringArray []string `json:"some_string_array"` 139 } 140 type MyResourceSomePolymorphicGroup struct { 141 ID string `json:"id"` 142 Type MyResourceSomePolymorphicGroupType `json:"object"` 143 144 MyResource *MyResource `json:"-"` 145 MyResourceSomeObject *MyResourceSomeObject `json:"-"` 146 } 147 148 // UnmarshalJSON handles deserialization of a MyResourceSomePolymorphicGroup. 149 // This custom unmarshaling is needed because the specific type of 150 // MyResourceSomePolymorphicGroup it refers to is specified in the JSON 151 func (m *MyResourceSomePolymorphicGroup) UnmarshalJSON(data []byte) error { 152 if id, ok := ParseID(data); ok { 153 m.ID = id 154 return nil 155 } 156 157 type myResourceSomePolymorphicGroup MyResourceSomePolymorphicGroup 158 var v myResourceSomePolymorphicGroup 159 if err := json.Unmarshal(data, &v); err != nil { 160 return err 161 } 162 163 *m = MyResourceSomePolymorphicGroup(v) 164 var err error 165 166 switch m.Type { 167 case MyResourceSomePolymorphicGroupTypeMyResource: 168 err = json.Unmarshal(data, &m.MyResource) 169 case MyResourceSomePolymorphicGroupTypeMyResourceSomeObject: 170 err = json.Unmarshal(data, &m.MyResourceSomeObject) 171 } 172 return err 173 } 174 175 // MyResourceList is a list of MyResources as retrieved from a list endpoint. 176 type MyResourceList struct { 177 APIResource 178 ListMeta 179 Data []*MyResource `json:"data"` 180 }