From 08930a2dee86811c94acc186a9901ed2c037e1c3 Mon Sep 17 00:00:00 2001 From: Olivier Bellone Date: Tue, 10 Sep 2019 19:07:37 -0700 Subject: [PATCH] Use ListObject properties as default values in request methods --- stripe/api_resources/list_object.py | 67 +++++++++++++++++-------- tests/api_resources/test_list_object.py | 17 +++++++ 2 files changed, 63 insertions(+), 21 deletions(-) diff --git a/stripe/api_resources/list_object.py b/stripe/api_resources/list_object.py index 4e373557f..7efb1b130 100644 --- a/stripe/api_resources/list_object.py +++ b/stripe/api_resources/list_object.py @@ -12,13 +12,13 @@ class ListObject(StripeObject): def list( self, api_key=None, stripe_version=None, stripe_account=None, **params ): - requestor = api_requestor.APIRequestor( - api_key, api_version=stripe_version, account=stripe_account - ) - url = self.get("url") - response, api_key = requestor.request("get", url, params) - stripe_object = util.convert_to_stripe_object( - response, api_key, stripe_version, stripe_account + stripe_object = self._request( + "get", + self.get("url"), + api_key=api_key, + stripe_version=stripe_version, + stripe_account=stripe_account, + **params ) stripe_object._retrieve_params = params return stripe_object @@ -47,14 +47,14 @@ def create( stripe_account=None, **params ): - requestor = api_requestor.APIRequestor( - api_key, api_version=stripe_version, account=stripe_account - ) - url = self.get("url") - headers = util.populate_headers(idempotency_key) - response, api_key = requestor.request("post", url, params, headers) - return util.convert_to_stripe_object( - response, api_key, stripe_version, stripe_account + return self._request( + "post", + self.get("url"), + api_key=api_key, + idempotency_key=idempotency_key, + stripe_version=stripe_version, + stripe_account=stripe_account, + **params ) def retrieve( @@ -65,13 +65,14 @@ def retrieve( stripe_account=None, **params ): - requestor = api_requestor.APIRequestor( - api_key, api_version=stripe_version, account=stripe_account - ) url = "%s/%s" % (self.get("url"), quote_plus(util.utf8(id))) - response, api_key = requestor.request("get", url, params) - return util.convert_to_stripe_object( - response, api_key, stripe_version, stripe_account + return self._request( + "get", + url, + api_key=api_key, + stripe_version=stripe_version, + stripe_account=stripe_account, + **params ) def __iter__(self): @@ -79,3 +80,27 @@ def __iter__(self): def __len__(self): return getattr(self, "data", []).__len__() + + def _request( + self, + method, + url, + api_key=None, + idempotency_key=None, + stripe_version=None, + stripe_account=None, + **params + ): + api_key = api_key or self.api_key + stripe_version = stripe_version or self.stripe_version + stripe_account = stripe_account or self.stripe_account + + requestor = api_requestor.APIRequestor( + api_key, api_version=stripe_version, account=stripe_account + ) + headers = util.populate_headers(idempotency_key) + response, api_key = requestor.request(method, url, params, headers) + stripe_object = util.convert_to_stripe_object( + response, api_key, stripe_version, stripe_account + ) + return stripe_object diff --git a/tests/api_resources/test_list_object.py b/tests/api_resources/test_list_object.py index 0635ec3cc..c74478696 100644 --- a/tests/api_resources/test_list_object.py +++ b/tests/api_resources/test_list_object.py @@ -54,6 +54,23 @@ def test_create(self, request_mock, list_object): assert res.foo == "bar" assert res.stripe_account == "acct_123" + def test_create_maintains_list_properties(self, request_mock, list_object): + # Testing with real requests because our mock makes it impossible to + # test otherwise + customer = stripe.Customer.retrieve( + "cus_123", api_key="sk_test_custom" + ) + + res = customer.sources.create(source="tok_123") + + request_mock.assert_requested( + "post", + "/v1/customers/cus_123/sources", + {"source": "tok_123"}, + None, + ) + assert res.api_key == "sk_test_custom" + def test_retrieve(self, request_mock, list_object): request_mock.stub_request( "get", "/my/path/myid", {"object": "charge", "foo": "bar"}