Как протестировать Stripe Webhooks с фиктивными данными
Я пытаюсь написать модульный тест, который публикует макет события в моем stripe webhook.
Я пошел и вытащил событие из своих журналов и попытался отправить его с включенным тестовым режимом, но я (несколько предсказуемо) получил ошибку:
аналогичный объект существует в режиме реального времени, но для выполнения этого запроса использовался ключ тестового режима.
1 ответов
решение заключается в создании собственных макетных данных. В приведенном ниже коде мы создаем тестовый платеж, создавая маркер stripe, а затем отправляем его через передний конец (в /donate/ endpoint).
Как только передняя часть работает должным образом, вы можете получить событие из stripe, а затем отправить его в конечную точку webhook вашей машины разработки.
Это больше работы, чем я ожидал, и мне не нравится, что мои тесты попадают в сеть, но это кажется достойным решением. Я чувствую себя намного увереннее в своих платежах, чем раньше.
def test_making_a_donation_and_getting_the_callback(self):
"""These two tests must live together because they need to be done sequentially.
First, we place a donation using the client. Then we send a mock callback to our
webhook, to make sure it accepts it properly.
"""
stripe.api_key = settings.STRIPE_SECRET_KEY
# Create a stripe token (this would normally be done via javascript in the front
# end when the submit button was pressed)
token = stripe.Token.create(
card={
'number': '4242424242424242',
'exp_month': '6',
'exp_year': str(datetime.today().year + 1),
'cvc': '123',
}
)
# Place a donation as an anonymous (not logged in) person using the
# token we just got
r = self.client.post('/donate/', data={
'amount': '25',
'payment_provider': 'cc',
'first_name': 'Barack',
'last_name': 'Obama',
'address1': '1600 Pennsylvania Ave.',
'address2': 'The Whitehouse',
'city': 'DC',
'state': 'DC',
'zip_code': '20500',
'email': 'barack@freelawproject.org',
'referrer': 'footer',
'stripeToken': token.id,
})
self.assertEqual(r.status_code, 302) # 302 because we redirect after a post.
# Get the stripe event so we can post it to the webhook
# We don't know the event ID, so we have to get the latest ones, then filter...
events = stripe.Event.all()
event = None
for obj in events.data:
if obj.data.object.card.fingerprint == token.card.fingerprint:
event = obj
break
self.assertIsNotNone(event, msg="Unable to find correct event for token: %s" % token.card.fingerprint)
# Finally, we can test the webhook!
r = self.client.post('/donate/callbacks/stripe/',
data=simplejson.dumps(event),
content_type='application/json')
# Does it return properly?
self.assertEqual(r.status_code, 200)