Skip to content

Commit

Permalink
Add support for Customer Balance Transaction resource and APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
remi-stripe committed May 7, 2019
1 parent 25b21ce commit 038359c
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 0 deletions.
3 changes: 3 additions & 0 deletions stripe/api_resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
from stripe.api_resources.coupon import Coupon
from stripe.api_resources.credit_note import CreditNote
from stripe.api_resources.customer import Customer
from stripe.api_resources.customer_balance_transaction import (
CustomerBalanceTransaction,
)
from stripe.api_resources.dispute import Dispute
from stripe.api_resources.ephemeral_key import EphemeralKey
from stripe.api_resources.event import Event
Expand Down
3 changes: 3 additions & 0 deletions stripe/api_resources/customer.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
@nested_resource_class_methods(
"tax_id", operations=["create", "retrieve", "delete", "list"]
)
@nested_resource_class_methods(
"customer_balance_transaction", operations=["create", "retrieve", "list"]
)
class Customer(
CreateableAPIResource,
UpdateableAPIResource,
Expand Down
29 changes: 29 additions & 0 deletions stripe/api_resources/customer_balance_transaction.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from __future__ import absolute_import, division, print_function

from stripe import util
from stripe.api_resources.customer import Customer
from stripe.api_resources.abstract import APIResource
from stripe.six.moves.urllib.parse import quote_plus


class CustomerBalanceTransaction(APIResource):
OBJECT_NAME = "tax_id"

def instance_url(self):
token = util.utf8(self.id)
customer = util.utf8(self.customer)
base = Customer.class_url()
cust_extn = quote_plus(customer)
extn = quote_plus(token)
return "%s/%s/customer_balance_transactions/%s" % (
base,
cust_extn,
extn,
)

@classmethod
def retrieve(cls, id, api_key=None, **params):
raise NotImplementedError(
"Can't retrieve a Customer Balance Transaction without a Customer ID. "
"Use Customer.retrieve_customer_balance_transaction('cus_123', 'cbtxn_123')"
)
1 change: 1 addition & 0 deletions stripe/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,7 @@ def load_object_classes():
api_resources.Coupon.OBJECT_NAME: api_resources.Coupon,
api_resources.CreditNote.OBJECT_NAME: api_resources.CreditNote,
api_resources.Customer.OBJECT_NAME: api_resources.Customer,
api_resources.Customer.OBJECT_NAME: api_resources.Customer,
api_resources.Dispute.OBJECT_NAME: api_resources.Dispute,
api_resources.EphemeralKey.OBJECT_NAME: api_resources.EphemeralKey,
api_resources.Event.OBJECT_NAME: api_resources.Event,
Expand Down
34 changes: 34 additions & 0 deletions tests/api_resources/test_customer.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
TEST_SUB_ID = "sub_123"
TEST_SOURCE_ID = "ba_123"
TEST_TAX_ID_ID = "txi_123"
TEST_TRANSACTION_ID = "txi_123"


class TestCustomer(object):
Expand Down Expand Up @@ -141,3 +142,36 @@ def test_is_listable(self, request_mock):
"get", "/v1/customers/%s/tax_ids" % TEST_RESOURCE_ID
)
assert isinstance(resources.data, list)


class TestCustomerTransactions(object):
def test_is_creatable(self, request_mock):
stripe.Customer.create_customer_balance_transaction(
TEST_RESOURCE_ID, amount=1234, currency="usd"
)
request_mock.assert_requested(
"post",
"/v1/customers/%s/customer_balance_transactions"
% TEST_RESOURCE_ID,
)

def test_is_retrievable(self, request_mock):
stripe.Customer.retrieve_customer_balance_transaction(
TEST_RESOURCE_ID, TEST_TRANSACTION_ID
)
request_mock.assert_requested(
"get",
"/v1/customers/%s/customer_balance_transactions/%s"
% (TEST_RESOURCE_ID, TEST_TRANSACTION_ID),
)

def test_is_listable(self, request_mock):
resources = stripe.Customer.list_customer_balance_transactions(
TEST_RESOURCE_ID
)
request_mock.assert_requested(
"get",
"/v1/customers/%s/customer_balance_transactions"
% TEST_RESOURCE_ID,
)
assert isinstance(resources.data, list)
32 changes: 32 additions & 0 deletions tests/api_resources/test_customer_balance_transaction.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from __future__ import absolute_import, division, print_function

import pytest

import stripe


TEST_RESOURCE_ID = "cbtxn_123"


class TestCustomerBalanceTransaction(object):
def construct_resource(self):
tax_id_dict = {
"id": TEST_RESOURCE_ID,
"object": "customer_balance_transaction",
"customer": "cus_123",
}
return stripe.CustomerBalanceTransaction.construct_from(
tax_id_dict, stripe.api_key
)

def test_has_instance_url(self, request_mock):
resource = self.construct_resource()
assert (
resource.instance_url()
== "/v1/customers/cus_123/customer_balance_transactions/%s"
% TEST_RESOURCE_ID
)

def test_is_not_retrievable(self, request_mock):
with pytest.raises(NotImplementedError):
stripe.CustomerBalanceTransaction.retrieve(TEST_RESOURCE_ID)

0 comments on commit 038359c

Please sign in to comment.