Skip to content

Commit

Permalink
Adding functions for requesting billing agreement token (#203)
Browse files Browse the repository at this point in the history
* created billing agreements file

* CreateBillingAgreementToken created with new types

* updated formatting

* error to return nil

* removed new line

* added test
  • Loading branch information
cameronjarnot1 authored Jul 12, 2021
1 parent 021cc68 commit a3977a8
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 0 deletions.
42 changes: 42 additions & 0 deletions billing_agreements.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package paypal

import (
"context"
"fmt"
)

// CreateBillingAgreementToken - Use this call to create a billing agreement
// Endpoint: POST /v1/billing-agreements/agreement-tokens
func (c *Client) CreateBillingAgreementToken(
ctx context.Context,
name string,
description string,
startDate string,
payer *Payer,
plan *BillingPlan,
) (*BillingAgreementToken, error) {
type createBARequest struct {
Name string `json:"name"`
Description string `json:"description"`
StartDate string `json:"start_date"`
Payer *Payer `json:"payer"`
Plan *BillingPlan `json:"plan"`
}

billingAgreementToken := &BillingAgreementToken{}

req, err := c.NewRequest(
ctx,
"POST",
fmt.Sprintf("%s%s", c.APIBase, "/v1/billing-agreements/agreement-tokens"),
createBARequest{Name: name, Description: description, StartDate: startDate, Payer: payer, Plan: plan})
if err != nil {
return nil, err
}

if err = c.SendWithAuth(req, billingAgreementToken); err != nil {
return billingAgreementToken, err
}

return billingAgreementToken, nil
}
30 changes: 30 additions & 0 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,36 @@ type (
OverrideMerchantPreferences *MerchantPreferences `json:"override_merchant_preferences,omitempty"`
}

// BillingAgreementToken response struct
BillingAgreementToken struct {
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
StartDate string `json:"start_date,omitempty"`
AgreementDetails *AgreementDetails `json:"agreement_details,omitempty"`
Payer *Payer `json:"payer,omitempty"`
ShippingAddress *ShippingAddress `json:"shipping_address,omitempty"`
OverrideMerchantPreferences *MerchantPreferences `json:"override_merchant_preferences,omitempty"`
OverrideChargeModels *OverrideChargeModel `json:"override_charge_models,omitempty"`
Plan *Plan `json:"plan,omitempty"`
}

//OverrideChargeModel struct
OverrideChargeModel struct {
ChargeID string `json:"charge_id"`
Amount *Amount `json:"amount"`
}

// Plan struct
Plan struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
CreateTime string `json:"create_time,omitempty"`
UpdateTime string `json:"update_time,omitempty"`
PaymentDefinitions []PaymentDefinition `json:"payment_definitions,omitempty"`
}

// BillingInfo struct
BillingInfo struct {
OutstandingBalance AmountPayout `json:"outstanding_balance,omitempty"`
Expand Down
26 changes: 26 additions & 0 deletions unit_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,11 @@ func (ts *webprofileTestServer) ServeHTTP(w http.ResponseWriter, r *http.Request
ts.deleteinvalid(w, r)
}
}
if r.RequestURI == "/v1/billing-agreements/agreement-tokens" {
if r.Method == "POST" {
ts.create(w, r)
}
}
}

func (ts *webprofileTestServer) create(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -744,3 +749,24 @@ func TestDeleteWebProfile_invalid(t *testing.T) {
}

}

func TestCreateBillingAgreementToken(t *testing.T) {

ts := httptest.NewServer(&webprofileTestServer{t: t})
defer ts.Close()

c, _ := NewClient("foo", "bar", ts.URL)

_, err := c.CreateBillingAgreementToken(
context.Background(),
"name A",
"description A",
"start date A",
&Payer{PaymentMethod: "paypal"},
&BillingPlan{ID: "id B", Name: "name B", Description: "description B", Type: "type B"})

if err != nil {
t.Fatal(err)
}

}

0 comments on commit a3977a8

Please sign in to comment.