from unittest import mock from django.test import TestCase from payment import events from payment.models import Order, PaymentEvent from payment.services import cancel_pending_order, create_order class PaymentEventTests(TestCase): def test_create_order_records_event_once_per_order(self): order, _ = create_order(user_id=7, amount=1000, idempotency_key='k-1') create_order(user_id=7, amount=1000, idempotency_key='k-1') # همان سفارش، رویدادِ دوم نه rows = PaymentEvent.objects.filter(order_id=order.id, event='order_created') self.assertEqual(rows.count(), 1) self.assertEqual(rows.get().user_id, 7) def test_cancel_records_event(self): order, _ = create_order(user_id=7, amount=1000) cancel_pending_order(order, staff='tester') self.assertTrue(PaymentEvent.objects.filter(order_id=order.id, event='admin_cancel').exists()) def test_failure_to_record_does_not_raise(self): with mock.patch.object(PaymentEvent.objects, 'create', side_effect=RuntimeError('db')): with self.assertLogs('payment.events', level='ERROR'): events.record('x', user_id=1) self.assertEqual(Order.objects.count(), 0)