from urllib.parse import urlsplit import pytest from django.urls import reverse from playwright.sync_api import expect from apps.payments import services from apps.payments.access import issue_payment_link from apps.payments.deposit_identifier import generate_id_algorithm from apps.payments.models import CompanyBankAccount from tests.e2e.pages.auth import AuthenticationPage from tests.e2e.pages.receipt_customer_details import ReceiptCustomerDetailsPage from tests.e2e.test_payments_e2e import payment_case, PASSWORD, PNG pytestmark = [pytest.mark.e2e, pytest.mark.django_db(transaction=True)] @pytest.mark.parametrize('mode', ['independent', 'linked', 'staff', 'link']) def test_required_payer_on_every_receipt_entry_point(live_server, browser_page, payment_case, mode): customer, account, reviewers = payment_case customer.first_name = customer.last_name = '' customer.save() notice = services.issue_notice(reviewers[0], {'customer': customer, 'account': account, 'subject': 'ثبت فیش با نام', 'amount': 12345}) link_path = urlsplit(issue_payment_link(notice=notice)[1]).path if mode == 'link' else '' with browser_page() as page: page.set_viewport_size({'width': 320, 'height': 900}) view = ReceiptCustomerDetailsPage(page, live_server.url) if mode == 'link': view.goto(link_path) page.get_by_role('link', name='ارسال فیش این واریز', exact=True).click() elif mode == 'staff': AuthenticationPage(page, live_server.url).login_staff(reviewers[0], PASSWORD) view.goto(reverse('staff_payments:receipt_new', args=[customer.public_id])) 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.expect_payer('') view.fill_receipt(account.pk, PNG) view.submit() view.expect_missing_payer() view.enter_payer('رضا احمدی') view.submit() expect(page.locator('.flash')).to_contain_text('فیش ثبت شد') expect(page.get_by_text('رضا احمدی', exact=True)).to_be_visible() assert page.evaluate('document.documentElement.scrollWidth <= document.documentElement.clientWidth + 1') def test_identifier_warning_follows_destination_and_mode(live_server, browser_page, payment_case): customer, account, reviewers = payment_case account.requires_deposit_id = True account.save() other = CompanyBankAccount.objects.create(name='حساب بدون شناسه', holder='شرکت', bank=account.bank, account_number='1234') identifier = generate_id_algorithm(customer.local_mobile) notice = services.issue_notice(reviewers[0], {'customer': customer, 'account': account, 'subject': 'شناسه اختصاصی', 'amount': 12345, 'deposit_id': identifier}) with browser_page() as page: view = ReceiptCustomerDetailsPage(page, live_server.url) AuthenticationPage(page, live_server.url).login_customer(customer, PASSWORD) view.goto(reverse('payments:receipt_new') + '?notice=' + str(notice.public_id)) view.expect_payer('مشتری آزمایشی') view.select_destination(account.pk, account.bank.name, identifier) page.get_by_label('واریز مستقل', exact=True).check() view.select_destination(other.pk) view.select_destination(account.pk, account.bank.name, identifier) def test_staff_can_cancel_then_confirm_rejection_sms(live_server, browser_page, payment_case): customer, account, reviewers = payment_case with browser_page() as page: view = ReceiptCustomerDetailsPage(page, live_server.url) auth = AuthenticationPage(page, live_server.url) auth.login_customer(customer, PASSWORD) view.goto(reverse('payments:receipt_new')) page.get_by_label('واریز مستقل', exact=True).check() view.fill_receipt(account.pk, PNG) view.submit() expect(page.locator('.flash')).to_contain_text('فیش ثبت شد') receipt_id = page.url.rstrip('/').rsplit('/', 1)[-1] page.get_by_role('button', name='خروج', exact=True).first.click() auth.login_staff(reviewers[0], PASSWORD) view.goto(reverse('staff_payments:receipt_detail', args=[receipt_id])) view.reject('تصویر فیش ناخوانا است.', confirm=False) view.reject('تصویر فیش ناخوانا است.', confirm=True) expect(page.get_by_text('تصویر فیش ناخوانا است.', exact=True)).to_be_visible()