102 lines
5.1 KiB
Python
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
|