github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/apijson/port_test.go (about)

     1  package apijson
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  type Metadata struct {
     9  	CreatedAt string `json:"created_at"`
    10  }
    11  
    12  // Card is the "combined" type of CardVisa and CardMastercard
    13  type Card struct {
    14  	Processor CardProcessor `json:"processor"`
    15  	Data      any           `json:"data"`
    16  	IsFoo     bool          `json:"is_foo"`
    17  	IsBar     bool          `json:"is_bar"`
    18  	Metadata  Metadata      `json:"metadata"`
    19  	Value     any           `json:"value"`
    20  
    21  	JSON cardJSON
    22  }
    23  
    24  type cardJSON struct {
    25  	Processor   Field
    26  	Data        Field
    27  	IsFoo       Field
    28  	IsBar       Field
    29  	Metadata    Field
    30  	Value       Field
    31  	ExtraFields map[string]Field
    32  	raw         string
    33  }
    34  
    35  func (r cardJSON) RawJSON() string { return r.raw }
    36  
    37  type CardProcessor string
    38  
    39  // CardVisa
    40  type CardVisa struct {
    41  	Processor CardVisaProcessor `json:"processor"`
    42  	Data      CardVisaData      `json:"data"`
    43  	IsFoo     bool              `json:"is_foo"`
    44  	Metadata  Metadata          `json:"metadata"`
    45  	Value     string            `json:"value"`
    46  
    47  	JSON cardVisaJSON
    48  }
    49  
    50  type cardVisaJSON struct {
    51  	Processor   Field
    52  	Data        Field
    53  	IsFoo       Field
    54  	Metadata    Field
    55  	Value       Field
    56  	ExtraFields map[string]Field
    57  	raw         string
    58  }
    59  
    60  func (r cardVisaJSON) RawJSON() string { return r.raw }
    61  
    62  type CardVisaProcessor string
    63  
    64  type CardVisaData struct {
    65  	Foo string `json:"foo"`
    66  }
    67  
    68  // CardMastercard
    69  type CardMastercard struct {
    70  	Processor CardMastercardProcessor `json:"processor"`
    71  	Data      CardMastercardData      `json:"data"`
    72  	IsBar     bool                    `json:"is_bar"`
    73  	Metadata  Metadata                `json:"metadata"`
    74  	Value     bool                    `json:"value"`
    75  
    76  	JSON cardMastercardJSON
    77  }
    78  
    79  type cardMastercardJSON struct {
    80  	Processor   Field
    81  	Data        Field
    82  	IsBar       Field
    83  	Metadata    Field
    84  	Value       Field
    85  	ExtraFields map[string]Field
    86  	raw         string
    87  }
    88  
    89  func (r cardMastercardJSON) RawJSON() string { return r.raw }
    90  
    91  type CardMastercardProcessor string
    92  
    93  type CardMastercardData struct {
    94  	Bar int64 `json:"bar"`
    95  }
    96  
    97  type CommonFields struct {
    98  	Metadata Metadata `json:"metadata"`
    99  	Value    string   `json:"value"`
   100  
   101  	JSON commonFieldsJSON
   102  }
   103  
   104  type commonFieldsJSON struct {
   105  	Metadata    Field
   106  	Value       Field
   107  	ExtraFields map[string]Field
   108  	raw         string
   109  }
   110  
   111  type CardEmbedded struct {
   112  	CommonFields
   113  	Processor CardVisaProcessor `json:"processor"`
   114  	Data      CardVisaData      `json:"data"`
   115  	IsFoo     bool              `json:"is_foo"`
   116  
   117  	JSON cardEmbeddedJSON
   118  }
   119  
   120  type cardEmbeddedJSON struct {
   121  	Processor   Field
   122  	Data        Field
   123  	IsFoo       Field
   124  	ExtraFields map[string]Field
   125  	raw         string
   126  }
   127  
   128  func (r cardEmbeddedJSON) RawJSON() string { return r.raw }
   129  
   130  var portTests = map[string]struct {
   131  	from any
   132  	to   any
   133  }{
   134  	"visa to card": {
   135  		CardVisa{
   136  			Processor: "visa",
   137  			IsFoo:     true,
   138  			Data: CardVisaData{
   139  				Foo: "foo",
   140  			},
   141  			Metadata: Metadata{
   142  				CreatedAt: "Mar 29 2024",
   143  			},
   144  			Value: "value",
   145  			JSON: cardVisaJSON{
   146  				raw:         `{"processor":"visa","is_foo":true,"data":{"foo":"foo"}}`,
   147  				Processor:   Field{raw: `"visa"`, status: valid},
   148  				IsFoo:       Field{raw: `true`, status: valid},
   149  				Data:        Field{raw: `{"foo":"foo"}`, status: valid},
   150  				Value:       Field{raw: `"value"`, status: valid},
   151  				ExtraFields: map[string]Field{"extra": {raw: `"yo"`, status: valid}},
   152  			},
   153  		},
   154  		Card{
   155  			Processor: "visa",
   156  			IsFoo:     true,
   157  			IsBar:     false,
   158  			Data: CardVisaData{
   159  				Foo: "foo",
   160  			},
   161  			Metadata: Metadata{
   162  				CreatedAt: "Mar 29 2024",
   163  			},
   164  			Value: "value",
   165  			JSON: cardJSON{
   166  				raw:         `{"processor":"visa","is_foo":true,"data":{"foo":"foo"}}`,
   167  				Processor:   Field{raw: `"visa"`, status: valid},
   168  				IsFoo:       Field{raw: `true`, status: valid},
   169  				Data:        Field{raw: `{"foo":"foo"}`, status: valid},
   170  				Value:       Field{raw: `"value"`, status: valid},
   171  				ExtraFields: map[string]Field{"extra": {raw: `"yo"`, status: valid}},
   172  			},
   173  		},
   174  	},
   175  	"mastercard to card": {
   176  		CardMastercard{
   177  			Processor: "mastercard",
   178  			IsBar:     true,
   179  			Data: CardMastercardData{
   180  				Bar: 13,
   181  			},
   182  			Value: false,
   183  		},
   184  		Card{
   185  			Processor: "mastercard",
   186  			IsFoo:     false,
   187  			IsBar:     true,
   188  			Data: CardMastercardData{
   189  				Bar: 13,
   190  			},
   191  			Value: false,
   192  		},
   193  	},
   194  	"embedded to card": {
   195  		CardEmbedded{
   196  			CommonFields: CommonFields{
   197  				Metadata: Metadata{
   198  					CreatedAt: "Mar 29 2024",
   199  				},
   200  				Value: "embedded_value",
   201  				JSON: commonFieldsJSON{
   202  					Metadata: Field{raw: `{"created_at":"Mar 29 2024"}`, status: valid},
   203  					Value:    Field{raw: `"embedded_value"`, status: valid},
   204  					raw:      `should not matter`,
   205  				},
   206  			},
   207  			Processor: "visa",
   208  			IsFoo:     true,
   209  			Data: CardVisaData{
   210  				Foo: "embedded_foo",
   211  			},
   212  			JSON: cardEmbeddedJSON{
   213  				raw:       `{"processor":"visa","is_foo":true,"data":{"foo":"embedded_foo"},"metadata":{"created_at":"Mar 29 2024"},"value":"embedded_value"}`,
   214  				Processor: Field{raw: `"visa"`, status: valid},
   215  				IsFoo:     Field{raw: `true`, status: valid},
   216  				Data:      Field{raw: `{"foo":"embedded_foo"}`, status: valid},
   217  			},
   218  		},
   219  		Card{
   220  			Processor: "visa",
   221  			IsFoo:     true,
   222  			IsBar:     false,
   223  			Data: CardVisaData{
   224  				Foo: "embedded_foo",
   225  			},
   226  			Metadata: Metadata{
   227  				CreatedAt: "Mar 29 2024",
   228  			},
   229  			Value: "embedded_value",
   230  			JSON: cardJSON{
   231  				raw:       `{"processor":"visa","is_foo":true,"data":{"foo":"embedded_foo"},"metadata":{"created_at":"Mar 29 2024"},"value":"embedded_value"}`,
   232  				Processor: Field{raw: `"visa"`, status: 0x3},
   233  				IsFoo:     Field{raw: "true", status: 0x3},
   234  				Data:      Field{raw: `{"foo":"embedded_foo"}`, status: 0x3},
   235  				Metadata:  Field{raw: `{"created_at":"Mar 29 2024"}`, status: 0x3},
   236  				Value:     Field{raw: `"embedded_value"`, status: 0x3},
   237  			},
   238  		},
   239  	},
   240  }
   241  
   242  func TestPort(t *testing.T) {
   243  	for name, test := range portTests {
   244  		t.Run(name, func(t *testing.T) {
   245  			toVal := reflect.New(reflect.TypeOf(test.to))
   246  
   247  			err := Port(test.from, toVal.Interface())
   248  			if err != nil {
   249  				t.Fatalf("port of %v failed with error %v", test.from, err)
   250  			}
   251  
   252  			if !reflect.DeepEqual(toVal.Elem().Interface(), test.to) {
   253  				t.Fatalf("expected:\n%+#v\n\nto port to:\n%+#v\n\nbut got:\n%+#v", test.from, test.to, toVal.Elem().Interface())
   254  			}
   255  		})
   256  	}
   257  }