Files
customerTicket/tests/e2e/test_receipt_upload_e2e.py
T
2026-10-07 13:39:29 +03:30

102 lines
5.1 KiB
Python

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