Ответ
Сценарий: Тестирование интеграции с внешней платежной системой, поддерживающей динамическую конвертацию валют (DCC). Пользователь в интерфейсе выбирает товар за 100 USD, но его банковская карта привязана к EUR.
Архитектура:
- Наш сервис запрашивает у платежного шлюза актуальный курс USD/EUR.
- Шлюз возвращает курс (например, 0.92) и предлагает пользователю оплатить 92 EUR.
- Пользователь подтверждает, платеж проводится в EUR.
- Наш сервер получает вебхук об успешном платеже в EUR.
- Мы должны корректно записать в БД сумму в исходной валюте (100 USD) для отчетности.
Ключевые сложности и тесты:
1. Расхождение в округлении: Банк-эквайер и наш сервис могли использовать разные правила округления (например, банк округляет до 2 знаков после запятой для EUR, а мы хранили 4 знака для внутренних расчетов).
def test_rounding_discrepancy():
amount_usd = 100.00
exchange_rate = 0.92195 # Курс от шлюза
expected_eur = 92.20 # Банк округлит до 92.20
our_calculated_eur = round(amount_usd * exchange_rate, 2) # 92.195 -> 92.20
# Симуляция ответа банка
bank_charged_eur = 92.20
# Допустимая дельта из-за возможного округления на стороне шлюза/банка
assert abs(our_calculated_eur - bank_charged_eur) <= 0.01
2. Устаревший курс (Race Condition): Курс обновляется раз в час. Пользователь мог инициировать платеж в 10:59, а подтвердить в 11:01, получив новый курс.
- Тест: Проверка, что в вебхуке от платежной системы приходит идентификатор курса, который мы сверили с пользователем.
3. Возврат средств (Refund): При возврате мы должны вернуть сумму в валюте карты (EUR), а не в валюте товара (USD). При этом сумма возврата может отличаться из-за изменения курса.
def test_refund_in_card_currency():
# Исходный платеж: 100 USD по курсу 0.92 = 92 EUR
charged_eur = 92.00
# Через неделю курс изменился до 0.94
# Возврат должен быть в EUR по сумме списания, а не по новому курсу
refund_amount_eur = 92.00 # А не 100 * 0.94 = 94 EUR
assert refund_amount_eur == charged_eur
4. Ведение логов для аудита: Необходимо было логировать:
- Предложенный пользователю курс и время.
- Фактический курс, по которому прошел платеж (из вебхука).
- Все суммы в обеих валютах.
Вывод: Потребовалось тщательное согласование форматов данных и сценариев с поставщиком платежного шлюза, написание интеграционных тестов, эмулирующих задержки и сбои, и реализация механизма сверки транзакций.