Skip to content

Commit

Permalink
Merge pull request #369 from stripe/ob-fix-post-methods
Browse files Browse the repository at this point in the history
Make custom action methods more consistent
  • Loading branch information
brandur-stripe authored Nov 8, 2017
2 parents da98a61 + 05645d9 commit e4caa70
Show file tree
Hide file tree
Showing 13 changed files with 105 additions and 34 deletions.
10 changes: 2 additions & 8 deletions stripe/api_resources/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,10 @@ def _build_instance_url(cls, sid):
def instance_url(self):
return self._build_instance_url(self.get('id'))

def reject(self, reason=None, idempotency_key=None):
def reject(self, idempotency_key=None, **params):
url = self.instance_url() + '/reject'
headers = util.populate_headers(idempotency_key)
if reason:
params = {"reason": reason}
else:
params = {}
self.refresh_from(
self.request('post', url, params, headers)
)
self.refresh_from(self.request('post', url, params, headers))
return self

def deauthorize(self, **params):
Expand Down
4 changes: 2 additions & 2 deletions stripe/api_resources/charge.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ def update_dispute(self, idempotency_key=None, **params):
self.refresh_from({'dispute': response}, api_key, True)
return self.dispute

def close_dispute(self, idempotency_key=None):
def close_dispute(self, idempotency_key=None, **params):
requestor = api_requestor.APIRequestor(self.api_key,
api_version=self.stripe_version,
account=self.stripe_account)
url = self.instance_url() + '/dispute/close'
headers = util.populate_headers(idempotency_key)
response, api_key = requestor.request('post', url, {}, headers)
response, api_key = requestor.request('post', url, params, headers)
self.refresh_from({'dispute': response}, api_key, True)
return self.dispute

Expand Down
4 changes: 2 additions & 2 deletions stripe/api_resources/dispute.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
class Dispute(ListableAPIResource, UpdateableAPIResource):
OBJECT_NAME = 'dispute'

def close(self, idempotency_key=None):
def close(self, idempotency_key=None, **params):
url = self.instance_url() + '/close'
headers = util.populate_headers(idempotency_key)
self.refresh_from(self.request('post', url, {}, headers))
self.refresh_from(self.request('post', url, params, headers))
return self
5 changes: 3 additions & 2 deletions stripe/api_resources/invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ class Invoice(CreateableAPIResource, ListableAPIResource,
OBJECT_NAME = 'invoice'

def pay(self, idempotency_key=None, **params):
url = self.instance_url() + '/pay'
headers = util.populate_headers(idempotency_key)
return self.request(
'post', self.instance_url() + '/pay', params, headers)
self.refresh_from(self.request('post', url, params, headers))
return self

@classmethod
def upcoming(cls, api_key=None, stripe_version=None, stripe_account=None,
Expand Down
5 changes: 3 additions & 2 deletions stripe/api_resources/order.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,10 @@ def create(cls, **params):
return super(Order, cls).create(**params)

def pay(self, idempotency_key=None, **params):
url = self.instance_url() + '/pay'
headers = util.populate_headers(idempotency_key)
return self.request(
'post', self.instance_url() + '/pay', params, headers)
self.refresh_from(self.request('post', url, params, headers))
return self

def return_order(self, idempotency_key=None, **params):
if "items" in params:
Expand Down
9 changes: 6 additions & 3 deletions stripe/api_resources/payout.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import absolute_import, division, print_function

from stripe import util
from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import UpdateableAPIResource
from stripe.api_resources.abstract import ListableAPIResource
Expand All @@ -9,6 +10,8 @@ class Payout(CreateableAPIResource, UpdateableAPIResource,
ListableAPIResource):
OBJECT_NAME = 'payout'

def cancel(self):
self.refresh_from(self.request('post',
self.instance_url() + '/cancel'))
def cancel(self, idempotency_key=None, **params):
url = self.instance_url() + '/cancel'
headers = util.populate_headers(idempotency_key)
self.refresh_from(self.request('post', url, params, headers))
return self
5 changes: 3 additions & 2 deletions stripe/api_resources/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,16 @@
class Source(CreateableAPIResource, UpdateableAPIResource, VerifyMixin):
OBJECT_NAME = 'source'

def detach(self, **params):
def detach(self, idempotency_key=None, **params):
if hasattr(self, 'customer') and self.customer:
extn = quote_plus(util.utf8(self.id))
customer = util.utf8(self.customer)
base = Customer.class_url()
owner_extn = quote_plus(customer)
url = "%s/%s/sources/%s" % (base, owner_extn, extn)
headers = util.populate_headers(idempotency_key)

self.refresh_from(self.request('delete', url, params))
self.refresh_from(self.request('delete', url, params, headers))
return self

else:
Expand Down
9 changes: 6 additions & 3 deletions stripe/api_resources/transfer.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import absolute_import, division, print_function

from stripe import util
from stripe.api_resources.abstract import CreateableAPIResource
from stripe.api_resources.abstract import UpdateableAPIResource
from stripe.api_resources.abstract import ListableAPIResource
Expand All @@ -12,6 +13,8 @@ class Transfer(CreateableAPIResource, UpdateableAPIResource,
ListableAPIResource):
OBJECT_NAME = 'transfer'

def cancel(self):
self.refresh_from(self.request('post',
self.instance_url() + '/cancel'))
def cancel(self, idempotency_key=None, **params):
url = self.instance_url() + '/cancel'
headers = util.populate_headers(idempotency_key)
self.refresh_from(self.request('post', url, params, headers))
return self
22 changes: 19 additions & 3 deletions tests/api_resources/test_invoice.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,19 +69,35 @@ def test_retrieve_customer_invoices(self):
)

def test_pay_invoice(self):
self.mock_response({
'id': 'ii_pay',
'paid': True,
})

invoice = stripe.Invoice(id="ii_pay")
invoice.pay()

self.assertTrue(invoice is invoice.pay(idempotency_key='idem-foo'))
self.assertEquals(True, invoice.paid)
self.assertEquals('ii_pay', invoice.id)

self.requestor_mock.request.assert_called_with(
'post',
'/v1/invoices/ii_pay/pay',
{},
None
{'Idempotency-Key': 'idem-foo'}
)

def test_pay_invoice_params(self):
self.mock_response({
'id': 'ii_pay',
'paid': True,
})

invoice = stripe.Invoice(id="ii_pay")
invoice.pay(source="src_foo")

self.assertTrue(invoice is invoice.pay(source="src_foo"))
self.assertEquals(True, invoice.paid)
self.assertEquals('ii_pay', invoice.id)

self.requestor_mock.request.assert_called_with(
'post',
Expand Down
31 changes: 30 additions & 1 deletion tests/api_resources/test_order.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,16 @@ def test_list_orders(self):
)

def test_pay_order(self):
self.mock_response({
'id': 'or_pay',
'status': 'paid',
})

order = stripe.Order(id="or_pay")
order.pay()

self.assertTrue(order is order.pay())
self.assertEquals('paid', order.status)
self.assertEquals('or_pay', order.id)

self.requestor_mock.request.assert_called_with(
'post',
Expand All @@ -25,6 +33,27 @@ def test_pay_order(self):
None
)

def test_pay_order_with_params(self):
self.mock_response({
'id': 'or_pay',
'status': 'paid',
})

order = stripe.Order(id="or_pay")

self.assertTrue(order is order.pay(source="src_foo"))
self.assertEquals('paid', order.status)
self.assertEquals('or_pay', order.id)

self.requestor_mock.request.assert_called_with(
'post',
'/v1/orders/or_pay/pay',
{
'source': 'src_foo',
},
None
)

def test_return_order(self):
order = stripe.Order(id="or_return")
order.return_order()
Expand Down
12 changes: 10 additions & 2 deletions tests/api_resources/test_payout.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,20 @@ def test_list_payouts(self):
)

def test_cancel_payout(self):
self.mock_response({
'id': 'po_cancel',
'status': 'canceled',
})

payout = stripe.Payout(id='po_cancel')
payout.cancel()

self.assertTrue(payout is payout.cancel(idempotency_key='idem-foo'))
self.assertEquals('canceled', payout.status)
self.assertEquals('po_cancel', payout.id)

self.requestor_mock.request.assert_called_with(
'post',
'/v1/payouts/po_cancel/cancel',
{},
None
{'Idempotency-Key': 'idem-foo'}
)
11 changes: 9 additions & 2 deletions tests/api_resources/test_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,17 +57,24 @@ def test_detach_source_unattached(self):
self.assertRaises(NotImplementedError, source.detach)

def test_detach_source_attached(self):
self.mock_response({
'id': 'src_foo'
})

source = stripe.Source.construct_from({
'id': 'src_foo',
'customer': 'cus_bar',
}, 'api_key')
source.detach()

self.assertTrue(source is source.detach(idempotency_key='idem-foo'))
self.assertFalse('customer' in source)
self.assertEquals('src_foo', source.id)

self.requestor_mock.request.assert_called_with(
'delete',
'/v1/customers/cus_bar/sources/src_foo',
{},
None
{'Idempotency-Key': 'idem-foo'}
)

def test_delete_source(self):
Expand Down
12 changes: 10 additions & 2 deletions tests/api_resources/test_transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,22 @@ def test_list_transfers(self):
)

def test_cancel_transfer(self):
self.mock_response({
'id': 'tr_cancel',
'status': 'canceled',
})

transfer = stripe.Transfer(id='tr_cancel')
transfer.cancel()

self.assertTrue(transfer is transfer.cancel(idempotency_key='idem-foo'))
self.assertEquals('canceled', transfer.status)
self.assertEquals('tr_cancel', transfer.id)

self.requestor_mock.request.assert_called_with(
'post',
'/v1/transfers/tr_cancel/cancel',
{},
None
{'Idempotency-Key': 'idem-foo'}
)


Expand Down

0 comments on commit e4caa70

Please sign in to comment.