from pathlib import Path from django.urls import reverse from playwright.sync_api import expect from tests.e2e.pages.base import BasePage class DispatchWorkspacePage(BasePage): @property def review_dialog(self): return self.page.get_by_role("dialog", name="بررسی نهایی ارسال گروهی") def _activate(self, control, destination, *, hidden=False): control.click() if hidden: expect(destination).to_be_hidden() else: expect(destination).to_be_visible() def open_composer(self): self.goto(reverse("staff_tickets:dispatch_create")) self.page.get_by_role("tab", name="ارسال جدید").wait_for(state="visible") def open_history(self): self.page.get_by_role("tab", name="سوابق ارسال").click() def return_to_composer(self): self.page.get_by_role("tab", name="ارسال جدید").click() def compose(self, unit, group, category, subject, body): self.page.get_by_label("واحد ارسال‌کننده").select_option(str(unit.pk)) self.page.get_by_label("گروه مخاطبان", exact=False).select_option(str(group.pk)) self.page.get_by_label("دسته‌بندی", exact=False).select_option(str(category.pk)) self.page.get_by_label("موضوع استعلام یا پیام", exact=False).fill(subject) self.page.get_by_label("متن پیام", exact=False).fill(body) def review(self): self._activate(self.page.get_by_role("button", name="بررسی و ادامه"), self.review_dialog) def cancel_review(self): self._activate(self.review_dialog.get_by_role("button", name="بازگشت و ویرایش"), self.review_dialog, hidden=True) def send(self): self._activate( self.review_dialog.get_by_role("button", name="تأیید و ارسال گروهی"), self.page.get_by_role("heading", name="وضعیت پیامک، مشاهده و پاسخ"), ) def open_report(self, dispatch): self.goto(reverse("staff_tickets:dispatch_detail", args=[dispatch.public_id])) def filter_recipients(self, label): self.page.get_by_label("نمایش مخاطبان").select_option(label=label) def search_recipient(self, text): self.page.get_by_role("searchbox", name="جستجوی مخاطب").fill(text) def reset_recipients(self): self.page.get_by_role("button", name="پاک کردن فیلتر", exact=True).click() def visible_recipients(self): return self.page.locator("[data-recipient-row]:visible") def open_conversation(self): self.page.locator(".dispatch-reply-link").first.click() def review_opening(self): self._activate(self.page.get_by_role("link", name="بازگشایی همه پاسخ‌ها", exact=True), self.page.get_by_role("heading", name="تأیید بازگشایی همه پاسخ‌ها")) def confirm_opening(self): self._activate(self.page.get_by_role("button", name="تأیید و بازگشایی همه پاسخ‌ها"), self.page.get_by_role("heading", name="پاسخ‌ها بازگشایی شده‌اند")) def choose_response_mode(self, label): self.page.get_by_role("radio", name=label, exact=True).check() @property def opening_sms(self): return self.page.get_by_role("checkbox", name="اطلاع‌رسانی بازگشایی با پیامک", exact=True) def expect_fits_viewport(self): assert self.page.evaluate("document.documentElement.scrollWidth <= document.documentElement.clientWidth + 1") def save_screenshot(self, name): directory = Path("test-results/dispatch-design") directory.mkdir(parents=True, exist_ok=True) self.page.screenshot(path=str(directory / name), full_page=True)