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  }