Skip to content

Commit

Permalink
CR Fix and update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Bart committed Jan 8, 2018
1 parent 0e9cf3e commit f59c7a2
Show file tree
Hide file tree
Showing 2 changed files with 179 additions and 38 deletions.
15 changes: 8 additions & 7 deletions aa_stripe/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ class Meta:

@python_2_unicode_compatible
class StripeCard(SafeDeleteModel, StripeBasicModel):
STRIPE_UPDATABLE_FIELDS = set(["exp_month", "exp_year"])
customer = models.ForeignKey("StripeCustomer", on_delete=models.CASCADE)
stripe_card_id = models.CharField(max_length=255, db_index=True, help_text=_("Unique card id in Stripe"))
stripe_js_response = JSONField()
Expand Down Expand Up @@ -179,7 +178,7 @@ def update_at_stripe(self, stripe_token, set_default):

return self

def sync_with_stripe(self):
def refresh_from_stripe(self):
card = self._retrieve_from_stripe(True)
if card:
self.last4 = card["last4"]
Expand Down Expand Up @@ -648,6 +647,9 @@ def _parse_coupon_notification(self, action):
StripeCoupon.objects.filter(coupon_id=coupon_id, created=created).delete()

def _parse_customer_source_notification(self, action):
if self.raw_data["data"]["object"]["object"] != "card":
return

stripe_card_id = self.raw_data["data"]["object"]["id"]
stripe_customer_id = self.raw_data["data"]["object"]["customer"]
try:
Expand All @@ -660,18 +662,17 @@ def _parse_customer_source_notification(self, action):
StripeCard.objects.all_with_deleted().get(stripe_card_id=stripe_card_id, customer=customer)
except StripeCard.DoesNotExist:
card = StripeCard(stripe_card_id=stripe_card_id, customer=customer)
if card.sync_with_stripe():
if card.refresh_from_stripe():
card.save()
else:
raise StripeWebhookParseError(_("Card with this id does not exists at Stripe API"))
else:
raise StripeWebhookParseError(_("Card with this id and customer already exists"))
pass # we already have the card

elif action == "updated":
try:
card = StripeCard.objects.get(stripe_card_id=stripe_card_id, customer=customer)
for updated_field in StripeCard.STRIPE_UPDATABLE_FIELDS & set(
self.raw_data["data"]["previous_attributes"]):
setattr(card, updated_field, self.raw_data["data"]["object"][updated_field])
card.refresh_from_stripe()
card.save()
except StripeCard.DoesNotExist:
pass # do not update if does not exist
Expand Down
202 changes: 171 additions & 31 deletions tests/test_webhooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,62 @@ def test_customer_source_update(self):
},
"type": "customer.source.updated"
}''')
stripe_customer_response = json.loads('''{
"id": "cus_BvfxAxtzApkqRa",
"object": "customer",
"account_balance": 0,
"created": 1515145927,
"currency": "usd",
"default_source": null,
"delinquent": false,
"description": null,
"discount": null,
"email": null,
"livemode": false,
"metadata": {
},
"shipping": null,
"sources": {
"object": "list",
"data": [
{
"address_city": null,
"address_country": null,
"address_line1": null,
"address_line1_check": null,
"address_line2": null,
"address_state": null,
"address_zip": null,
"address_zip_check": null,
"brand": "Visa",
"country": "US",
"customer": "cus_BvfxAxtzApkqRa",
"cvc_check": "pass",
"dynamic_last4": null,
"exp_month": 4,
"exp_year": 2020,
"fingerprint": "DsGmBIQwiNOvChPk",
"funding": "credit",
"id": "card_1BXobrLoWm2f6pRwXOAv0OOW",
"last4": "4242",
"metadata": {},
"name": null,
"object": "card",
"tokenization_method": null
}
],
"has_more": false,
"total_count": 0,
"url": "/v1/customers/cus_BvfxAxtzApkqRa/sources"
},
"subscriptions": {
"object": "list",
"data": [],
"has_more": false,
"total_count": 0,
"url": "/v1/customers/cus_BvfxAxtzApkqRa/subscriptions"
}
}''')
url = reverse("stripe-webhooks")

self.client.credentials(**self._get_signature_headers(payload))
Expand All @@ -616,38 +672,96 @@ def test_customer_source_update(self):
self.assertEqual(card.exp_year, 2024)
self.assertEqual(card.exp_month, 4)

payload["id"] = "evt_2"
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 1)
card = StripeCard.objects.filter(stripe_card_id="card_1BXobrLoWm2f6pRwXOAv0OOW").first()
self.assertEqual(card.exp_year, 2020)
self.assertEqual(card.exp_month, 4)
with requests_mock.Mocker() as m:
payload["id"] = "evt_2"
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa",
text=json.dumps(stripe_customer_response))
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa/sources/card_1BXobrLoWm2f6pRwXOAv0OOW",
text=json.dumps(stripe_customer_response["sources"]["data"][0]))
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 1)
card = StripeCard.objects.filter(stripe_card_id="card_1BXobrLoWm2f6pRwXOAv0OOW").first()
self.assertEqual(card.exp_year, 2020)
self.assertEqual(card.exp_month, 4)

payload["id"] = "evt_3"
payload["data"]["object"]["exp_month"] = 6
payload["data"]["object"]["exp_year"] = 2023
payload["data"]["previous_attributes"]["exp_month"] = 4
payload["data"]["previous_attributes"]["exp_year"] = 2020
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 1)
card = StripeCard.objects.filter(stripe_card_id="card_1BXobrLoWm2f6pRwXOAv0OOW").first()
self.assertEqual(card.exp_year, 2023)
self.assertEqual(card.exp_month, 6)

payload["id"] = "evt_4"
payload["data"]["object"]["exp_month"] = 8
payload["data"]["previous_attributes"]["exp_month"] = 6
del payload["data"]["previous_attributes"]["exp_year"]
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
with requests_mock.Mocker() as m:
payload["id"] = "evt_3"
payload["data"]["object"]["exp_month"] = 6
payload["data"]["object"]["exp_year"] = 2023
payload["data"]["previous_attributes"]["exp_month"] = 4
payload["data"]["previous_attributes"]["exp_year"] = 2020
stripe_customer_response["sources"]["data"][0] = payload["data"]["object"]
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa",
text=json.dumps(stripe_customer_response))
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa/sources/card_1BXobrLoWm2f6pRwXOAv0OOW",
text=json.dumps(stripe_customer_response["sources"]["data"][0]))
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 1)
card = StripeCard.objects.filter(stripe_card_id="card_1BXobrLoWm2f6pRwXOAv0OOW").first()
self.assertEqual(card.exp_year, 2023)
self.assertEqual(card.exp_month, 6)

with requests_mock.Mocker() as m:
payload["id"] = "evt_4"
payload["data"]["object"]["exp_month"] = 8
payload["data"]["previous_attributes"]["exp_month"] = 6
del payload["data"]["previous_attributes"]["exp_year"]
stripe_customer_response["sources"]["data"][0] = payload["data"]["object"]
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa",
text=json.dumps(stripe_customer_response))
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa/sources/card_1BXobrLoWm2f6pRwXOAv0OOW",
text=json.dumps(stripe_customer_response["sources"]["data"][0]))
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 1)
card = StripeCard.objects.filter(stripe_card_id="card_1BXobrLoWm2f6pRwXOAv0OOW").first()
self.assertEqual(card.exp_year, 2023)
self.assertEqual(card.exp_month, 8)
self.assertEqual(card.last4, "4242")

payload["id"] = "evt_5"
payload["data"]["object"] = json.loads('''{
"id": "ba_1Bi2QfLoWm2f6pRw7fZtTBNU",
"object": "bank_account",
"account": "acct_1AIXutLoWm2f6pRw",
"account_holder_name": "Jane Austen",
"account_holder_type": "individual",
"bank_name": "STRIPE TEST BANK",
"country": "US",
"currency": "usd",
"default_for_currency": false,
"fingerprint": "xRMn872ai9iIaRtl",
"last4": "6789",
"metadata": {
},
"routing_number": "110000000",
"status": "new"
}''')
del payload["data"]["previous_attributes"]["exp_month"]
payload["data"]["previous_attributes"]["bank_name"] = "Bogus Bank"
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
Expand All @@ -657,6 +771,32 @@ def test_customer_source_update(self):
self.assertEqual(card.exp_month, 8)
self.assertEqual(card.last4, "4242")

with requests_mock.Mocker() as m:
payload["id"] = "evt_6"
payload["data"]["object"] = stripe_customer_response["sources"]["data"][0]
stripe_customer_response["sources"]["data"] = []
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa",
text=json.dumps(stripe_customer_response))
m.register_uri(
"GET",
"https://api.stripe.com/v1/customers/cus_BvfxAxtzApkqRa/sources/card_1BXobrLoWm2f6pRwXOAv0OOW",
text=json.dumps({
"error": {
"type": "invalid_request_error",
"message": "No such source: card_1BXobrLoWm2f6pRwXOAv0OOW",
"param": "id"
}
}),
status_code=404)
self.customer.stripe_customer_id = "cus_BvfxAxtzApkqRa"
self.customer.save()
self.client.credentials(**self._get_signature_headers(payload))
response = self.client.post(url, data=payload, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(StripeCard.objects.count(), 0)

def test_ping(self):
# test receiving ping event (the only event without "." inside the event name)
StripeWebhook.objects.all().delete()
Expand Down

0 comments on commit f59c7a2

Please sign in to comment.