issues/230/user_tool.py (161 lines of code) (raw):

import sys, os base_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) sys.path.insert(0, base_path) import pytest from playwright.sync_api import sync_playwright, Page from utils.trace_cleaner import trace_cleaner SITE_URL = "https://dev.new.expensify.com:8082/" EMAIL_SUBMITTER = "expensifyolddot+1733902498@gmail.com" NAME_SUBMITTER = "Sender" EMAIL_APPROVER_1 = "t56826807+13@gmail.com" NAME_APPROVER_1 = "Employee" EMAIL_APPROVER_2 = "expensifyolddot+1733902499@gmail.com" NAME_APPROVER_2 = "Approver 2" @pytest.fixture def setup_playwright(): playwright = sync_playwright().start() browser_user1 = playwright.chromium.launch( channel="chrome", headless=True, args=[ "--ignore-certificate-errors", "--disable-web-security", "--disable-features=IsolateOrigins,site-per-process" ], proxy={"server": "http://localhost:8080"}, slow_mo=500 ) context_args = {} context_args["timezone_id"] = "Asia/Kathmandu" context_user1 = browser_user1.new_context(**context_args) page_user1 = context_user1.new_page() browser_user2 = playwright.chromium.launch( channel="chrome", headless=True, args=[ "--ignore-certificate-errors", "--disable-web-security", "--disable-features=IsolateOrigins,site-per-process" ], proxy={"server": "http://localhost:8080"}, slow_mo=500 ) context_user2 = browser_user2.new_context(**context_args) page_user2 = context_user2.new_page() yield page_user1, page_user2 browser_user1.close() browser_user2.close() playwright.stop() def login_user(page: Page, email: str): page.goto(SITE_URL) page.locator('input[type="email"]').fill(email) page.locator('button[tabindex="0"]').click() try: page.locator("button", has_text="Join").click() except Exception: pass def complete_onboarding(page: Page, first_name: str, last_name: str = ""): page.locator("text='Track and budget expenses'").click() page.locator('input[name="fname"]').fill(first_name) page.locator('input[name="lname"]').fill(last_name) page.get_by_role("button", name="Continue").last.click() def invite_workspace_member(page: Page, member_email: str, member_name: str): page.locator('div[aria-label="Members"]').click() page.locator("button", has_text="Invite member").click() page.locator('input[aria-label="Name, email, or phone number"]').fill(member_email) page.locator("button", has_text=member_name).last.click() page.locator('button[data-listener="Enter"]', has_text="Next").click() page.locator('button[data-listener="Enter"]', has_text="Invite").click() def browse_to_workspace(page: Page, workspace_name: str): page.locator('button[aria-label="Workspaces"]').click() try: page.locator(f'button[aria-label="{workspace_name}"]').click() except Exception: page.locator(f'button[aria-label="{workspace_name}"]').nth(1).click() def browse_to_chat(page: Page, chat_label: str): page.locator('button[aria-label="Navigates to a chat"]', has_text=chat_label).nth( 0 ).click() def submit_manual_expense(page: Page, amount: int, merchant: str): page.locator('button[aria-label="Create"]').last.click() page.locator('div[aria-label="Submit expense"]').click() page.locator('button[aria-label="Manual"]').click() page.locator('input[placeholder="0"]').fill(str(amount)) page.locator('button[data-listener="Enter"]', has_text="Next").first.click() page.locator('div[role="menuitem"]', has_text="Merchant").click() page.locator('input[aria-label="Merchant"]').fill(merchant) page.locator('button[data-listener="Enter"]', has_text="Save").click() page.locator('button[data-listener="Enter"]', has_text="Submit").click() def test(setup_playwright): page_submitter, page_approver_2 = setup_playwright context_user1 = page_submitter.context context_user2 = page_approver_2.context context_user1.tracing.start(title="trace_user1", screenshots=True, snapshots=True, sources=True) context_user2.tracing.start(title="trace_user2", screenshots=True, snapshots=True, sources=True) try: email_submitter, name_submitter = EMAIL_SUBMITTER, NAME_SUBMITTER email_approver_1, name_approver_1 = EMAIL_APPROVER_1, NAME_APPROVER_1 email_approver_2, name_approver_2 = EMAIL_APPROVER_2, NAME_APPROVER_2 login_user(page_submitter, email_submitter) login_user(page_approver_2, email_approver_2) complete_onboarding(page_submitter, name_submitter) complete_onboarding(page_approver_2, name_approver_2) workspace_name = f"{name_submitter}'s Workspace" page_submitter.locator('button[aria-label="Workspaces"]').click() ( page_submitter.get_by_test_id("WorkspaceSwitcherPage") .get_by_role("button", name="New workspace") .click() ) invite_workspace_member(page_submitter, email_approver_1, name_approver_1) invite_workspace_member(page_submitter, email_approver_2, name_approver_2) page_submitter.locator('div[aria-label="More features"]').click() workflows_toggle = page_submitter.locator('button[aria-label="Configure how spend is approved and paid."][role="switch"]') if workflows_toggle.get_attribute('aria-checked') == "false": workflows_toggle.click() page_submitter.locator('div[aria-label="Workflows"]').click() approval_toggle = page_submitter.locator('button[aria-label="Require additional approval before authorizing a payment."][role="switch"]') if approval_toggle.get_attribute('aria-checked') == "false": approval_toggle.click() page_submitter.locator('button[aria-label="Add approvals"]').click() page_submitter.locator( 'div[data-tag="pressable"]', has_text="Additional Approver" ).click() page_submitter.locator("button", has_text="Upgrade").click() page_submitter.locator("button", has_text="Got it, thanks").click() page_submitter.locator( f'div[aria-label="{name_submitter}"]', has_text="Approver" ).first.click() page_submitter.locator(f'button[aria-label="{name_approver_1}"]').last.click() page_submitter.locator( 'button[data-listener="Enter"]', has_text="Save" ).last.click() page_submitter.locator( 'div[data-tag="pressable"]', has_text="Additional Approver" ).first.click() page_submitter.locator(f'button[aria-label="{name_approver_2}"]').last.click() page_submitter.locator( 'button[data-listener="Enter"]', has_text="Save" ).last.click() page_submitter.locator( 'button[data-listener="Enter"]', has_text="Save" ).last.click() page_submitter.locator('button[aria-label="Back"]').nth(0).click() page_submitter.locator('button[aria-label="Back"]').nth(0).click() browse_to_workspace(page_submitter, workspace_name) browse_to_chat(page_submitter, workspace_name) submit_manual_expense(page_submitter, 10, "abc") page_approver_2.wait_for_timeout(2000) page_approver_2.goto("https://dev.new.expensify.com:8082/settings/workspaces") page_approver_2.get_by_label("Inbox").click() browse_to_workspace(page_approver_2, workspace_name) browse_to_chat(page_approver_2, f"{workspace_name} owes") expense_text = page_approver_2.locator( 'button[aria-label="View details"]' ).last.inner_text() assert "Submit" not in expense_text finally: context_user1.tracing.stop(path="/app/expensify/user_tool/output_browser1.zip") trace_cleaner("/app/expensify/user_tool/output_browser1.zip") context_user2.tracing.stop(path="/app/expensify/user_tool/output_browser2.zip") trace_cleaner("/app/expensify/user_tool/output_browser2.zip")