from urllib.parse import urlsplit import uuid import jdatetime import pytest from django.contrib.auth.models import Permission from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse from django.utils import timezone from playwright.sync_api import expect from apps.payments import services from apps.payments.access import issue_payment_link from apps.payments.models import PaymentReceipt from tests.e2e.pages.auth import AuthenticationPage from tests.e2e.pages.receipt_upload import ReceiptUploadPage from tests.e2e.test_payments_e2e import payment_case, PNG, PASSWORD pytestmark = [pytest.mark.e2e, pytest.mark.django_db(transaction=True)] @pytest.mark.parametrize('mode,width', [('independent', 320), ('linked', 1440), ('staff', 320), ('link', 320)]) def test_receipt_upload_progress_processing_and_single_submission(live_server, browser_page, payment_case, mode, width): customer, account, reviewers = payment_case creator = reviewers[0] creator.user_permissions.add(Permission.objects.get(content_type__app_label='payments', codename='add_paymentnotice')) notice = services.issue_notice(creator, {'customer': customer, 'account': account, 'subject': 'تست پیشرفت ارسال', 'amount': 12345}) _, link_url = issue_payment_link(notice=notice) with browser_page() as page: page.set_viewport_size({'width': width, 'height': 900}) view = ReceiptUploadPage(page, live_server.url) view.control_transport() if mode == 'staff': AuthenticationPage(page, live_server.url).login_staff(creator, PASSWORD) view.goto(reverse('staff_payments:receipt_new', args=[customer.public_id])) elif mode == 'link': view.goto(urlsplit(link_url).path) page.get_by_role('link', name='ارسال فیش این واریز', exact=True).click() else: AuthenticationPage(page, live_server.url).login_customer(customer, PASSWORD) view.goto(reverse('payments:receipt_new') + ('?notice=' + str(notice.public_id) if mode == 'linked' else '')) if mode in ('independent', 'staff'): page.get_by_label('واریز مستقل', exact=True).check() view.fill_receipt(account.pk, PNG) view.submit() view.assert_uploading() view.repeat_submission() assert page.evaluate('document.documentElement.scrollWidth <= document.documentElement.clientWidth + 1') view.processing() view.finish() assert PaymentReceipt.objects.filter(customer=customer).count() == 1 @pytest.mark.parametrize('failure', ['network', 'validation']) def test_failed_upload_retains_image_and_can_retry(live_server, browser_page, payment_case, failure): customer, account, _ = payment_case with browser_page() as page: view = ReceiptUploadPage(page, live_server.url) view.control_transport() AuthenticationPage(page, live_server.url).login_customer(customer, PASSWORD) view.goto(reverse('payments:receipt_new')) page.get_by_label('واریز مستقل', exact=True).check() view.fill_receipt(account.pk, PNG) key = page.locator('[name=submission_key]').input_value() view.submit() view.assert_uploading() view.fail_network() if failure == 'network' else view.reject_fields() expect(page.locator('#id_paid_amount')).to_have_value('۱۲٬۳۴۵') assert page.locator('[name=submission_key]').input_value() == key view.submit() expect(page.locator('#receipt-upload-title')).to_have_text('در حال ارسال فیش…') view.finish() assert PaymentReceipt.objects.filter(customer=customer).count() == 1 def test_revised_receipt_uses_upload_progress(live_server, browser_page, payment_case, client): customer, account, reviewers = payment_case today = jdatetime.date.fromgregorian(date=timezone.localdate()) client.force_login(customer) response = client.post(reverse('payments:receipt_new'), { 'receipt_mode': 'independent', 'paid_amount': '12345', 'destination_account': account.pk, 'paid_day': str(today.day), 'paid_month': str(today.month), 'paid_year': str(today.year), 'submission_key': str(uuid.uuid4()), 'receipt_image': SimpleUploadedFile('receipt.png', PNG, content_type='image/png'), }) assert response.status_code == 302 receipt = PaymentReceipt.objects.get(customer=customer) services.decide_receipt(reviewers[0], receipt.public_id, 1, 'REJECT', 'تصویر واضح‌تر لازم است') with browser_page() as page: view = ReceiptUploadPage(page, live_server.url) view.control_transport() AuthenticationPage(page, live_server.url).login_customer(customer, PASSWORD) view.goto(reverse('payments:receipt_revise', args=[receipt.public_id])) view.fill_receipt(account.pk, PNG) view.submit() view.assert_uploading() view.repeat_submission() view.processing() view.finish(revision=True) receipt.refresh_from_db() assert receipt.current_version == 2 and receipt.revisions.count() == 2