Files
customerTicket/tests/e2e/test_magic_link_confirmation_e2e.py
2026-10-06 10:03:22 +03:30

76 lines
4.1 KiB
Python

from pathlib import Path
import pytest
from django.urls import reverse
from playwright.sync_api import expect
from apps.accounts.models import TicketMagicLink, User
from apps.customers.models import CustomerProfile
from apps.tickets.models import TicketCategory
from apps.tickets.services import create_ticket
from tests.e2e.pages.auth import AuthenticationPage
from tests.e2e.pages.magic_link import MagicLinkConfirmationPage
from tests.e2e.pages.tickets import TicketConversationPage
pytestmark = [pytest.mark.e2e, pytest.mark.django_db(transaction=True)]
PASSWORD = "Magic-link-test-password-2026"
MESSAGE = "شما با حساب دیگری وارد سامانه شده‌اید. برای مشاهده تیکت مرتبط با این لینک، از حساب فعلی خارج شوید. پس از خروج، تیکت به‌صورت خودکار باز می‌شود و نیازی به ورود مجدد ندارید."
@pytest.fixture
def browser_magic_case():
category = TicketCategory.objects.create(title="پشتیبانی لینک", slug="browser-magic")
owner = User.objects.create_user(username="browser-link-owner", mobile="09123000101", account_type="CUSTOMER")
other = User.objects.create_user(username="browser-link-other", mobile="09123000102", account_type="CUSTOMER", password=PASSWORD)
CustomerProfile.objects.create(user=owner)
CustomerProfile.objects.create(user=other)
ticket = create_ticket(customer=owner, category=category, subject="درخواست مرتبط با لینک", body="محتوای تیکت مرتبط")
token = TicketMagicLink.issue(ticket)
return other, ticket, token
@pytest.mark.parametrize("width", [320, 390, 1280])
def test_confirmed_logout_opens_ticket_with_readable_responsive_page(browser_page, live_server, browser_magic_case, width):
other, ticket, token = browser_magic_case
with browser_page() as page:
page.set_viewport_size({"width": width, "height": 844 if width < 640 else 900})
AuthenticationPage(page, live_server.url).login_customer(other, PASSWORD)
confirmation = MagicLinkConfirmationPage(page, live_server.url)
confirmation.open(token)
expect(page.locator("#confirmation-description")).to_have_text(MESSAGE)
expect(page.get_by_text("محتوای تیکت مرتبط", exact=True)).to_have_count(0)
confirmation.expect_readable_layout()
confirmation.continue_button.focus()
expect(confirmation.continue_button).to_be_focused()
assert confirmation.continue_button.evaluate("node => getComputedStyle(node).outlineStyle") == "solid"
artifact = Path("test-results/e2e") / f"magic-confirmation-{width}.png"
artifact.parent.mkdir(parents=True, exist_ok=True)
page.screenshot(path=str(artifact), full_page=True)
confirmation.continue_to_ticket(ticket)
TicketConversationPage(page, live_server.url).send_reply("پاسخ مرورگر پس از خروج")
confirmation.goto(reverse("accounts:profile"))
expect(page).to_have_url(confirmation.url(reverse("accounts:login")) + "?next=" + reverse("accounts:profile"))
def test_cancel_returns_to_logged_in_account(browser_page, live_server, browser_magic_case):
other, ticket, token = browser_magic_case
with browser_page() as page:
AuthenticationPage(page, live_server.url).login_customer(other, PASSWORD)
confirmation = MagicLinkConfirmationPage(page, live_server.url)
confirmation.open(token)
confirmation.cancel()
confirmation.goto(reverse("accounts:profile"))
expect(page.get_by_role("heading", name="پروفایل من")).to_be_visible()
expect(page.locator("main")).to_contain_text(other.mobile)
def test_confirmation_form_works_without_its_javascript(browser_page, live_server, browser_magic_case):
other, ticket, token = browser_magic_case
with browser_page() as page:
AuthenticationPage(page, live_server.url).login_customer(other, PASSWORD)
page.route("**/magic-link-confirmation.js*", lambda route: route.abort())
confirmation = MagicLinkConfirmationPage(page, live_server.url)
confirmation.open(token)
confirmation.continue_to_ticket(ticket)