Как проверить 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, возможно.

С этими изменениями тест выполняется, как и ожидалось.

Вернуться на верх