github.com/plutov/paypal/v4@v4.7.1/invoicing_test.go (about) 1 package paypal_test 2 3 import ( 4 "context" 5 "encoding/json" 6 "testing" 7 8 "github.com/plutov/paypal/v4" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 // All test values are defined here 13 var devTestClientID = "AXy9orp-CDaHhBZ9C78QHW2BKZpACgroqo85_NIOa9mIfJ9QnSVKzY-X_rivR_fTUUr6aLjcJsj6sDur" 14 var devTestSecret = "EBoIiUSkCKeSk49hHSgTem1qnjzzJgRQHDEHvGpzlLEf_nIoJd91xu8rPOBDCdR_UYNKVxJE-UgS2iCw" 15 var devAPIBaseSandBox = "https://api.sandbox.paypal.com" 16 17 func TestGenerateInvoiceNumber(t *testing.T) { 18 ctx := context.Background() 19 20 c, _ := paypal.NewClient(devTestClientID, devTestSecret, devAPIBaseSandBox) 21 _, err := c.GetAccessToken(ctx) 22 assert.Equal(t, nil, err) 23 24 _, err = c.GenerateInvoiceNumber(ctx) 25 assert.Equal(t, nil, err) 26 } 27 func assertTwoInvoices(t *testing.T, invoice paypal.Invoice, testInvoice paypal.Invoice) { 28 29 // additional_recipients 30 assert.Equal(t, len(invoice.AdditionalRecipients), len(testInvoice.AdditionalRecipients)) 31 // additional_recipients --> email_address !! EQUALITY OF SPLICE OF STRUCT REMAINING !! 32 33 // amount 34 assert.Equal(t, invoice.AmountSummary.Currency, testInvoice.AmountSummary.Currency) 35 assert.Equal(t, invoice.AmountSummary.Value, testInvoice.AmountSummary.Value) 36 // amount-->breakdown-->custom-->amount 37 assert.Equal(t, invoice.AmountSummary.Breakdown.Custom.Amount.Currency, testInvoice.AmountSummary.Breakdown.Custom.Amount.Currency) 38 assert.Equal(t, invoice.AmountSummary.Breakdown.Custom.Amount.Value, testInvoice.AmountSummary.Breakdown.Custom.Amount.Value) 39 // amount-->breakdown-->custom-->label 40 assert.Equal(t, invoice.AmountSummary.Breakdown.Custom.Label, testInvoice.AmountSummary.Breakdown.Custom.Label) 41 // amount-->breakdown-->discount-->amount 42 assert.Equal(t, invoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.DiscountAmount.Currency, testInvoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.DiscountAmount.Currency) 43 assert.Equal(t, invoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.DiscountAmount.Value, testInvoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.DiscountAmount.Value) 44 // amount-->breakdown-->discount-->percent 45 assert.Equal(t, invoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.Percent, testInvoice.AmountSummary.Breakdown.Discount.InvoiceDiscount.Percent) 46 // amount-->breakdown-->discount-->item_discount 47 assert.Equal(t, invoice.AmountSummary.Breakdown.Discount.ItemDiscount.Currency, testInvoice.AmountSummary.Breakdown.Discount.ItemDiscount.Currency) 48 assert.Equal(t, invoice.AmountSummary.Breakdown.Discount.ItemDiscount.Value, testInvoice.AmountSummary.Breakdown.Discount.ItemDiscount.Value) 49 // amount-->breakdown-->item_total 50 assert.Equal(t, invoice.AmountSummary.Breakdown.ItemTotal.Currency, testInvoice.AmountSummary.Breakdown.ItemTotal.Currency) 51 assert.Equal(t, invoice.AmountSummary.Breakdown.ItemTotal.Value, testInvoice.AmountSummary.Breakdown.ItemTotal.Value) 52 // amount-->breakdown-->shipping-->amount 53 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Amount.Currency, testInvoice.AmountSummary.Breakdown.Shipping.Amount.Currency) 54 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Amount.Value, testInvoice.AmountSummary.Breakdown.Shipping.Amount.Value) 55 // amount-->breakdown-->shipping-->tax 56 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Tax.Amount.Currency, testInvoice.AmountSummary.Breakdown.Shipping.Tax.Amount.Currency) 57 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Tax.Amount.Value, testInvoice.AmountSummary.Breakdown.Shipping.Tax.Amount.Value) 58 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Tax.ID, testInvoice.AmountSummary.Breakdown.Shipping.Tax.ID) 59 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Tax.Name, testInvoice.AmountSummary.Breakdown.Shipping.Tax.Name) 60 assert.Equal(t, invoice.AmountSummary.Breakdown.Shipping.Tax.Percent, testInvoice.AmountSummary.Breakdown.Shipping.Tax.Percent) 61 // amount-->breakdown-->tax_total 62 assert.Equal(t, invoice.AmountSummary.Breakdown.TaxTotal.Currency, testInvoice.AmountSummary.Breakdown.TaxTotal.Currency) 63 assert.Equal(t, invoice.AmountSummary.Breakdown.TaxTotal.Value, testInvoice.AmountSummary.Breakdown.TaxTotal.Value) 64 65 // configuration 66 assert.Equal(t, invoice.Configuration.AllowTip, testInvoice.Configuration.AllowTip) 67 assert.Equal(t, invoice.Configuration.TaxCalculatedAfterDiscount, testInvoice.Configuration.TaxCalculatedAfterDiscount) 68 assert.Equal(t, invoice.Configuration.TaxInclusive, testInvoice.Configuration.TaxInclusive) 69 assert.Equal(t, invoice.Configuration.TemplateId, testInvoice.Configuration.TemplateId) 70 // configuration --> partial_payment 71 assert.Equal(t, invoice.Configuration.PartialPayment.AllowPartialPayment, testInvoice.Configuration.PartialPayment.AllowPartialPayment) 72 assert.Equal(t, invoice.Configuration.PartialPayment.MinimumAmountDue.Currency, testInvoice.Configuration.PartialPayment.MinimumAmountDue.Currency) 73 assert.Equal(t, invoice.Configuration.PartialPayment.MinimumAmountDue.Value, testInvoice.Configuration.PartialPayment.MinimumAmountDue.Value) 74 75 // detail 76 assert.Equal(t, invoice.Detail.CurrencyCode, testInvoice.Detail.CurrencyCode) 77 assert.Equal(t, invoice.Detail.InvoiceDate, testInvoice.Detail.InvoiceDate) 78 assert.Equal(t, invoice.Detail.InvoiceNumber, testInvoice.Detail.InvoiceNumber) 79 assert.Equal(t, invoice.Detail.Memo, testInvoice.Detail.Memo) 80 assert.Equal(t, invoice.Detail.Note, testInvoice.Detail.Note) 81 assert.Equal(t, invoice.Detail.Reference, testInvoice.Detail.Reference) 82 assert.Equal(t, invoice.Detail.TermsAndConditions, testInvoice.Detail.TermsAndConditions) 83 // detail --> attachments !! EQUALITY OF SPLICE OF STRUCT REMAINING !! 84 assert.Equal(t, len(invoice.Detail.Attachments), len(testInvoice.Detail.Attachments)) 85 // detail --> metadata 86 assert.Equal(t, invoice.Detail.Metadata.CancelTime, testInvoice.Detail.Metadata.CancelTime) 87 assert.Equal(t, invoice.Detail.Metadata.CancellledTimeBy, testInvoice.Detail.Metadata.CancellledTimeBy) 88 assert.Equal(t, invoice.Detail.Metadata.CreateTime, testInvoice.Detail.Metadata.CreateTime) 89 assert.Equal(t, invoice.Detail.Metadata.CreatedBy, testInvoice.Detail.Metadata.CreatedBy) 90 assert.Equal(t, invoice.Detail.Metadata.CreatedByFlow, testInvoice.Detail.Metadata.CreatedByFlow) 91 assert.Equal(t, invoice.Detail.Metadata.FirstSentTime, testInvoice.Detail.Metadata.FirstSentTime) 92 assert.Equal(t, invoice.Detail.Metadata.InvoicerViewUrl, testInvoice.Detail.Metadata.InvoicerViewUrl) 93 assert.Equal(t, invoice.Detail.Metadata.LastSentBy, testInvoice.Detail.Metadata.LastSentBy) 94 assert.Equal(t, invoice.Detail.Metadata.LastSentTime, testInvoice.Detail.Metadata.LastSentTime) 95 assert.Equal(t, invoice.Detail.Metadata.LastUpdateTime, testInvoice.Detail.Metadata.LastUpdateTime) 96 assert.Equal(t, invoice.Detail.Metadata.LastUpdatedBy, testInvoice.Detail.Metadata.LastUpdatedBy) 97 assert.Equal(t, invoice.Detail.Metadata.RecipientViewUrl, testInvoice.Detail.Metadata.RecipientViewUrl) 98 // detail --> payment_term 99 assert.Equal(t, invoice.Detail.PaymentTerm.DueDate, testInvoice.Detail.PaymentTerm.DueDate) 100 assert.Equal(t, invoice.Detail.PaymentTerm.TermType, testInvoice.Detail.PaymentTerm.TermType) 101 102 // due_amount 103 assert.Equal(t, invoice.DueAmount.Currency, testInvoice.DueAmount.Currency) 104 assert.Equal(t, invoice.DueAmount.Value, testInvoice.DueAmount.Value) 105 106 // gratuity 107 assert.Equal(t, invoice.Gratuity.Currency, testInvoice.Gratuity.Currency) 108 assert.Equal(t, invoice.Gratuity.Value, testInvoice.Gratuity.Value) 109 110 // id 111 assert.Equal(t, invoice.ID, testInvoice.ID) 112 113 // invoicer 114 assert.Equal(t, invoice.Invoicer.AdditionalNotes, testInvoice.Invoicer.AdditionalNotes) 115 assert.Equal(t, invoice.Invoicer.EmailAddress, testInvoice.Invoicer.EmailAddress) 116 assert.Equal(t, invoice.Invoicer.LogoUrl, testInvoice.Invoicer.LogoUrl) 117 assert.Equal(t, invoice.Invoicer.TaxId, testInvoice.Invoicer.TaxId) 118 assert.Equal(t, invoice.Invoicer.Website, testInvoice.Invoicer.Website) 119 // !!! SPLICE EQUALITY STILL REMAINING !!!!! 120 // invoicer --> phones 121 assert.Equal(t, len(invoice.Invoicer.Phones), len(testInvoice.Invoicer.Phones)) 122 123 // items 124 // !!! SPLICE EQUALITY STILL REMAINING !!!!! 125 assert.Equal(t, len(invoice.Items), len(testInvoice.Items)) 126 127 // links 128 // !!! SPLICE EQUALITY STILL REMAINING !!!!! 129 assert.Equal(t, len(invoice.Links), len(testInvoice.Links)) 130 131 // parent_id 132 assert.Equal(t, invoice.ParentID, testInvoice.ParentID) 133 134 // payments 135 assert.Equal(t, invoice.Payments.PaidAmount.Currency, testInvoice.Payments.PaidAmount.Currency) 136 assert.Equal(t, invoice.Payments.PaidAmount.Value, testInvoice.Payments.PaidAmount.Value) 137 // payments --> transactions 138 assert.Equal(t, len(invoice.Payments.Transactions), len(testInvoice.Payments.Transactions)) 139 140 // primary_recipients 141 // !!! SPLICE EQUALITY STILL REMAINING !!!!! 142 assert.Equal(t, len(invoice.PrimaryRecipients), len(testInvoice.PrimaryRecipients)) 143 144 // refunds 145 assert.Equal(t, invoice.Refunds.RefundAmount.Currency, testInvoice.Refunds.RefundAmount.Currency) 146 assert.Equal(t, invoice.Refunds.RefundAmount.Value, testInvoice.Refunds.RefundAmount.Value) 147 assert.Equal(t, len(invoice.Refunds.RefundDetails), len(testInvoice.Refunds.RefundDetails)) 148 149 // status 150 assert.Equal(t, invoice.Status, testInvoice.Status) 151 152 } 153 154 func TestGetInvoice(t *testing.T) { 155 testInvoiceJSONData := []byte(` 156 { 157 "amount": { 158 "breakdown": { 159 "custom": { 160 "amount": { 161 "currency_code": "USD", 162 "value": "10.00" 163 }, 164 "label": "Packing Charges" 165 }, 166 "discount": { 167 "invoice_discount": { 168 "amount": { 169 "currency_code": "USD", 170 "value": "-2.63" 171 }, 172 "percent": "5" 173 }, 174 "item_discount": { 175 "currency_code": "USD", 176 "value": "-7.50" 177 } 178 }, 179 "item_total": { 180 "currency_code": "USD", 181 "value": "60.00" 182 }, 183 "shipping": { 184 "amount": { 185 "currency_code": "USD", 186 "value": "10.00" 187 }, 188 "tax": { 189 "amount": { 190 "currency_code": "USD", 191 "value": "0.73" 192 }, 193 "id": "TAX-5XV24702TP4910056", 194 "name": "Sales Tax", 195 "percent": "7.25" 196 } 197 }, 198 "tax_total": { 199 "currency_code": "USD", 200 "value": "4.34" 201 } 202 }, 203 "currency_code": "USD", 204 "value": "74.21" 205 }, 206 "configuration": { 207 "allow_tip": true, 208 "partial_payment": { 209 "allow_partial_payment": true, 210 "minimum_amount_due": { 211 "currency_code": "USD", 212 "value": "20.00" 213 } 214 }, 215 "tax_calculated_after_discount": true, 216 "tax_inclusive": false, 217 "template_id": "TEMP-4NW98229SC0703920" 218 }, 219 "detail": { 220 "additional_data": "2-4", 221 "archived": false, 222 "category_code": "SHIPPABLE", 223 "currency_code": "USD", 224 "group_draft": false, 225 "invoice_date": "2018-11-12", 226 "invoice_number": "0001", 227 "memo": "This is a long contract", 228 "metadata": { 229 "caller_type": "API_V2_INVOICE", 230 "create_time": "2022-10-25T16:54:50Z", 231 "created_by_flow": "REGULAR_SINGLE", 232 "invoicer_view_url": "https://www.sandbox.paypal.com/invoice/details/INV2-XFXV-YW42-ZANU-4F33", 233 "last_update_time": "2022-10-25T16:54:50Z", 234 "recipient_view_url": "https://www.sandbox.paypal.com/invoice/p/#XFXVYW42ZANU4F33" 235 }, 236 "note": "Thank you for your business.", 237 "payment_term": { 238 "due_date": "2018-11-22", 239 "term_type": "NET_10" 240 }, 241 "reference": "deal-ref", 242 "viewed_by_recipient": false 243 }, 244 "due_amount": { 245 "currency_code": "USD", 246 "value": "74.21" 247 }, 248 "id": "INV2-XFXV-YW42-ZANU-4F33", 249 "invoicer": { 250 "additional_notes": "2-4", 251 "address": { 252 "address_line_1": "1234 First Street", 253 "address_line_2": "337673 Hillside Court", 254 "admin_area_1": "CA", 255 "admin_area_2": "Anytown", 256 "country_code": "US", 257 "postal_code": "98765" 258 }, 259 "email_address": "merchant@example.com", 260 "logo_url": "https://example.com/logo.PNG", 261 "name": { 262 "full_name": "David Larusso", 263 "given_name": "David", 264 "surname": "Larusso" 265 }, 266 "phones": [ 267 { 268 "country_code": "001", 269 "national_number": "4085551234", 270 "phone_type": "MOBILE" 271 } 272 ], 273 "tax_id": "ABcNkWSfb5ICTt73nD3QON1fnnpgNKBy- Jb5SeuGj185MNNw6g", 274 "website": "www.test.com" 275 }, 276 "items": [ 277 { 278 "description": "Elastic mat to practice yoga.", 279 "discount": { 280 "amount": { 281 "currency_code": "USD", 282 "value": "-2.50" 283 }, 284 "percent": "5" 285 }, 286 "id": "ITEM-5335764681676603X", 287 "name": "Yoga Mat", 288 "quantity": "1", 289 "tax": { 290 "amount": { 291 "currency_code": "USD", 292 "value": "3.27" 293 }, 294 "id": "TAX-5XV24702TP4910056", 295 "name": "Sales Tax", 296 "percent": "7.25" 297 }, 298 "unit_amount": { 299 "currency_code": "USD", 300 "value": "50.00" 301 }, 302 "unit_of_measure": "QUANTITY" 303 }, 304 { 305 "discount": { 306 "amount": { 307 "currency_code": "USD", 308 "value": "-5.00" 309 } 310 }, 311 "id": "ITEM-1B467958Y9218273X", 312 "name": "Yoga t-shirt", 313 "quantity": "1", 314 "tax": { 315 "amount": { 316 "currency_code": "USD", 317 "value": "0.34" 318 }, 319 "id": "TAX-5XV24702TP4910056", 320 "name": "Sales Tax", 321 "percent": "7.25" 322 }, 323 "unit_amount": { 324 "currency_code": "USD", 325 "value": "10.00" 326 }, 327 "unit_of_measure": "QUANTITY" 328 } 329 ], 330 "links": [ 331 { 332 "href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-XFXV-YW42-ZANU-4F33", 333 "method": "GET", 334 "rel": "self" 335 }, 336 { 337 "href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-XFXV-YW42-ZANU-4F33/send", 338 "method": "POST", 339 "rel": "send" 340 }, 341 { 342 "href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-XFXV-YW42-ZANU-4F33", 343 "method": "PUT", 344 "rel": "replace" 345 }, 346 { 347 "href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-XFXV-YW42-ZANU-4F33", 348 "method": "DELETE", 349 "rel": "delete" 350 }, 351 { 352 "href": "https://api.sandbox.paypal.com/v2/invoicing/invoices/INV2-XFXV-YW42-ZANU-4F33/payments", 353 "method": "POST", 354 "rel": "record-payment" 355 } 356 ], 357 "primary_recipients": [ 358 { 359 "billing_info": { 360 "address": { 361 "address_line_1": "1234 Main Street", 362 "admin_area_1": "CA", 363 "admin_area_2": "Anytown", 364 "country_code": "US", 365 "postal_code": "98765" 366 }, 367 "email_address": "bill-me@example.com", 368 "name": { 369 "full_name": "Stephanie Meyers", 370 "given_name": "Stephanie", 371 "surname": "Meyers" 372 } 373 }, 374 "shipping_info": { 375 "address": { 376 "address_line_1": "1234 Main Street", 377 "admin_area_1": "CA", 378 "admin_area_2": "Anytown", 379 "country_code": "US", 380 "postal_code": "98765" 381 }, 382 "name": { 383 "full_name": "Stephanie Meyers", 384 "given_name": "Stephanie", 385 "surname": "Meyers" 386 } 387 } 388 } 389 ], 390 "status": "DRAFT", 391 "unilateral": false 392 } 393 `) 394 var testInvoice paypal.Invoice 395 err := json.Unmarshal(testInvoiceJSONData, &testInvoice) 396 assert.Equal(t, nil, err) // if passed, means unmarshalling was successful 397 398 ctx := context.Background() 399 400 c, _ := paypal.NewClient(devTestClientID, devTestSecret, devAPIBaseSandBox) 401 _, _ = c.GetAccessToken(ctx) 402 403 invoice, err := c.GetInvoiceDetails(ctx, "INV2-XFXV-YW42-ZANU-4F33") 404 assert.Equal(t, nil, err) // if passed, means that request was successful 405 assertTwoInvoices(t, *invoice, testInvoice) 406 }