Skip to content

Commit 08d848d

Browse files
authored
Merge pull request #15 from timhanlon/handle-subscription-created-webhook
Handle subscription created webhook
2 parents d065e0f + 0adcf6a commit 08d848d

2 files changed

Lines changed: 19 additions & 6 deletions

File tree

djpaddle/models.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,19 +155,19 @@ class Meta:
155155
def _sanitize_webhook_payload(cls, payload):
156156
data = {}
157157

158-
data["id"] = data.pop("subscription_id", None)
158+
data["id"] = payload.pop("subscription_id", None)
159159

160160
# transform `user_id` to subscriber ref
161161
data["subscriber"] = None
162-
subscriber_id = data.pop("user_id", None)
162+
subscriber_id = payload.pop("user_id", None)
163163
if subscriber_id not in ["", None]:
164-
data["subscriber"] = settings.get_subscriber_model().objects.get(
165-
pk=subscriber_id
164+
data["subscriber"], created = settings.get_subscriber_model().objects.get_or_create(
165+
email=payload["email"]
166166
)
167167

168168
# transform `subscription_plan_id` to plan ref
169169
data["plan"] = None
170-
plan_id = data.pop("subscription_plan_id", None)
170+
plan_id = payload.pop("subscription_plan_id", None)
171171
if plan_id not in ["", None]:
172172
data["plan"] = Plan.objects.get(pk=plan_id)
173173

@@ -186,7 +186,7 @@ def _sanitize_webhook_payload(cls, payload):
186186
@classmethod
187187
def from_subscription_created(cls, payload):
188188
data = cls._sanitize_webhook_payload(payload)
189-
return cls(**data)
189+
return cls.objects.get_or_create(**data)
190190

191191
@classmethod
192192
def update_by_payload(cls, payload):

tests/test_webhooks.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from copy import deepcopy
22
from unittest import mock
33

4+
from django.conf import settings
45
from django.urls import reverse
56
from django.test import TestCase, Client
67

78
from . import FAKE_ALERT_TEST_SUBSCRIPTION_CREATED
9+
from djpaddle.models import Plan, Subscription
810

911

1012
class TestWebhook(TestCase):
@@ -15,6 +17,7 @@ def _send_alert(self, data):
1517
def test_webhook_is_valid_alert(self, is_valid_webhook):
1618
valid_alert = deepcopy(FAKE_ALERT_TEST_SUBSCRIPTION_CREATED)
1719
valid_alert["p_signature"] = "valid-signature"
20+
plan = Plan.objects.create(pk=1, name="monthly-subscription", billing_type="month", billing_period=1, trial_days=0)
1821

1922
resp = self._send_alert(valid_alert)
2023
self.assertTrue(is_valid_webhook.called)
@@ -26,3 +29,13 @@ def test_webhook_is_invalid_signature(self):
2629

2730
resp = self._send_alert(invalid_alert)
2831
self.assertEqual(resp.status_code, 400)
32+
33+
@mock.patch("djpaddle.views.is_valid_webhook", return_value=True)
34+
def test_subscription_created_webhook(self, is_valid_webhook):
35+
payload = deepcopy(FAKE_ALERT_TEST_SUBSCRIPTION_CREATED)
36+
payload["p_signature"] = "valid-signature"
37+
plan = Plan.objects.create(pk=1, name="monthly-subscription", billing_type="month", billing_period=1, trial_days=0)
38+
39+
resp = self._send_alert(payload)
40+
subscription = Subscription.objects.get(email=payload["email"])
41+
self.assertEqual(subscription.email, "gardner.wuckert@example.org")

0 commit comments

Comments
 (0)