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  }