estelam ticket, varizha , others

This commit is contained in:
javad committed 2026-10-13 15:48:24 +03:30
1 parent 35a1ec1794
commit 6b546aad76
71 files changed
+2865 -191

No files matched your search

+57 -11
View File
@@ -42,14 +42,12 @@ def run(job):
return job
def test_initially_disabled_and_staff_uploads_do_not_notify(case, enabled, monkeypatch):
def test_disabled_channels_do_not_notify_customer_or_staff_uploads(case, enabled, monkeypatch):
network = Mock(side_effect=AssertionError('Network must not run in registration'))
monkeypatch.setattr(requests, 'post', network)
enabled.bale_enabled = enabled.sms_enabled = False
enabled.save()
submit(case)
enabled.bale_enabled = enabled.sms_enabled = True
enabled.save()
form = ReceiptForm(data(case, linked=False), {'receipt_image': upload()}, customer=case['customer'])
assert form.is_valid(), form.errors
services.submit_receipt(case['creator'], case['customer'], form.cleaned_data)
@@ -57,6 +55,38 @@ def test_initially_disabled_and_staff_uploads_do_not_notify(case, enabled, monke
network.assert_not_called()
@pytest.mark.parametrize('picker,linked', [(False, True), (False, False), (True, True), (True, False)])
def test_staff_entry_points_enqueue_once_with_customer_identity(case, enabled, client, monkeypatch, picker, linked):
network = Mock(side_effect=AssertionError('Network must not run in registration'))
monkeypatch.setattr(requests, 'post', network)
client.force_login(case['creator'])
endpoint = reverse('staff_payments:receipt_new', args=[case['customer'].public_id])
if picker:
response = client.post(reverse('staff_payments:receipt_customer'), {'customer': case['customer'].pk})
assert response.status_code == 302 and response.url == endpoint
assert client.get(endpoint).status_code == 200
values = data(case, linked=linked)
invalid = client.post(endpoint, {**values, 'paid_amount': '0', 'receipt_image': upload()},
HTTP_ACCEPT='application/json')
assert invalid.status_code == 422
assert not PaymentReceiptAlert.objects.exists()
for _ in range(2):
response = client.post(endpoint, {**values, 'receipt_image': upload()}, HTTP_ACCEPT='application/json')
assert response.status_code == 200, response.content
receipt = PaymentReceipt.objects.get(customer=case['customer'])
assert receipt.submitted_by_id == case['creator'].pk
assert receipt.notice_id == (case['notice'].pk if linked else None)
alerts = list(receipt.revisions.get().alerts.select_related('job'))
assert len(alerts) == 3
assert {a.job.channel for a in alerts} == {'SMS', 'BALE'}
assert {a.recipient_mobile for a in alerts} == {'', '+989121110001', '+989121110002'}
assert all(a.job.customer_id == case['customer'].pk for a in alerts)
assert all(a.context['customer_mobile'] == case['customer'].local_mobile for a in alerts)
assert all('واریزکننده آزمایشی' in a.context['customer_name'] for a in alerts)
assert all(a.context['receipt_link'].endswith(reverse('staff_payments:receipt_detail', args=[receipt.public_id])) for a in alerts)
network.assert_not_called()
@pytest.mark.parametrize('anonymous,linked', [(False, True), (False, False), (True, True), (True, False)])
def test_all_customer_entry_points_enqueue_once_without_network(case, enabled, client, monkeypatch, anonymous, linked):
network = Mock(side_effect=AssertionError('Network must not run in registration'))
@@ -85,27 +115,37 @@ def test_all_customer_entry_points_enqueue_once_without_network(case, enabled, c
network.assert_not_called()
def test_customer_corrections_have_separate_idempotent_alerts_and_can_be_disabled(case, enabled):
@pytest.mark.parametrize('staff', [False, True])
def test_customer_corrections_have_separate_idempotent_alerts_and_can_be_disabled(case, enabled, staff):
receipt = submit(case)
actor = case['creator'] if staff else case['customer']
if staff:
grant(actor, 'submit_customer_receipt')
services.decide_receipt(case['first'], receipt.public_id, 1, 'REJECT', 'تصویر خوانا نیست')
form = ReceiptForm(data(case), {'receipt_image': upload()}, customer=case['customer'])
assert form.is_valid(), form.errors
services.revise_receipt(case['customer'], receipt.public_id, 1, form.cleaned_data)
services.revise_receipt(actor, receipt.public_id, 1, form.cleaned_data)
assert PaymentReceiptAlert.objects.count() == 6
receipt_alerts.safe_queue_receipt_alerts(receipt.revisions.get(version=2), case['customer'])
receipt_alerts.safe_queue_receipt_alerts(receipt.revisions.get(version=2), actor)
assert PaymentReceiptAlert.objects.count() == 6
enabled.notify_revisions = False
enabled.save()
services.decide_receipt(case['first'], receipt.public_id, 2, 'REJECT', 'اصلاح لازم است')
form = ReceiptForm(data(case), {'receipt_image': upload()}, customer=case['customer'])
assert form.is_valid()
services.revise_receipt(case['customer'], receipt.public_id, 2, form.cleaned_data)
services.revise_receipt(actor, receipt.public_id, 2, form.cleaned_data)
assert PaymentReceiptAlert.objects.count() == 6
def test_outer_rollback_removes_receipt_and_alerts(case, enabled):
@pytest.mark.parametrize('staff', [False, True])
def test_outer_rollback_removes_receipt_and_alerts(case, enabled, staff):
with pytest.raises(RuntimeError), transaction.atomic():
submit(case)
if staff:
form = ReceiptForm(data(case), {'receipt_image': upload()}, customer=case['customer'])
assert form.is_valid(), form.errors
services.submit_receipt(case['creator'], case['customer'], form.cleaned_data)
else:
submit(case)
raise RuntimeError('rollback')
assert not PaymentReceipt.objects.exists() and not PaymentReceiptAlert.objects.exists()
assert not NotificationJob.objects.filter(event_type=receipt_alerts.RECEIPT_ALERT_EVENT).exists()
@@ -131,9 +171,15 @@ def test_configuration_failure_isolated_from_registration(case, enabled, monkeyp
assert receipt.revisions.count() == 1
def test_worker_sends_private_photo_with_database_token_and_sms_to_managers(case, enabled, monkeypatch, settings):
@pytest.mark.parametrize('staff', [False, True])
def test_worker_sends_private_photo_with_database_token_and_sms_to_managers(case, enabled, monkeypatch, settings, staff):
settings.BALE_BOT_TOKEN = 'existing-ticket-token'
receipt = submit(case)
if staff:
form = ReceiptForm(data(case), {'receipt_image': upload()}, customer=case['customer'])
assert form.is_valid(), form.errors
receipt = services.submit_receipt(case['creator'], case['customer'], form.cleaned_data)
else:
receipt = submit(case)
posted, sent = [], []
def post(url, **kwargs):
posted.append((url, kwargs['data'], kwargs['files']['photo'][1].read(), kwargs['timeout']))