Как проверить Stripe `SignatureVerificationError` в Python
Для python стандартный пример кода stripe webhook включает:
event = None
try:
event = stripe.Webhook.construct_event(payload, sig_header, endpoint_secret)
except ValueError as e:
logger.error(f"*** Stripe invalid payload: {e = }")
return HttpResponse(status=400)
except stripe.error.SignatureVerificationError as e:
logger.error(f"*** Stripe invalid signature: {e = }")
return HttpResponse(status=400)
Я пытался проверить это с помощью следующего теста, который наследуется от Django testcase:
class TestStripeWebhookView(TestCase):
@mock.patch("logging.Logger.error")
@mock.patch("lettergun.apps.payments.views.create_order")
@mock.patch("lettergun.apps.payments.views.stripe")
def test_signature_verification_error(self, stripe, create_order, error):
stripe.Webhook.construct_event.side_effect = SignatureVerificationError
data = {
"type": "placeholder",
}
response = self.client.get(
reverse("payments:stripe_webhook"),
data,
HTTP_ACCEPT="application/json",
HTTP_STRIPE_SIGNATURE='placeholder_signature"}',
)
error.assert_called_with(f"*** Stripe invalid signature: e = an error message")
assert not create_order.called
assert response.status_code == 400
При этом возникает следующая ошибка, которую я не могу понять:
> except stripe.error.SignatureVerificationError as e:
E TypeError: catching classes that do not inherit from BaseException is not allowed
Как я могу проверить, что ошибка проверки подписи будет иметь ожидаемые последствия?
В качестве справочника вы можете использовать тестовые случаи в библиотеке stripe-python
. Там довольно много тестовых примеров для ошибок проверки подписи.
Проблема была решена путем изменения кода представления с:
except stripe.error.SignatureVerificationError as e:
logger.error(f"*** Stripe invalid signature: {e = }")
return HttpResponse(status=400)
to
except SignatureVerificationError as e:
logger.error(f"*** Stripe invalid signature: {e = }")
return HttpResponse(status=400)
и добавление дополнительного импорта в модуль:
import stripe
from stripe.error import SignatureVerificationError # Add this line
Я не понимаю, почему это имеет значение, если кто-нибудь сможет объяснить, я буду благодарен! Я думаю, что это потому, что я издеваюсь над объектом stripe в тесте, что вызывает слишком много ошибок. Импорт ошибки отдельно предотвращает ее переопределение unittest.mock.patch
, возможно.
С этими изменениями тест выполняется, как и ожидалось.