issues/183/user_tool.py (127 lines of code) (raw):
import os
import pytest
from playwright.async_api import Browser, Page, TimeoutError, async_playwright
from utils.trace_cleaner import trace_cleaner
EMAIL_USERNAME = "xecuycismfsga"
EMAIL_ALIAS = "r5p4hfur"
USER_EMAIL = f"{EMAIL_USERNAME}+{EMAIL_ALIAS}@gmail.com"
PASSWORD = "uwgb zzoc cofa kaaq"
SLOW_MO: int | None = 500
PROXY_URL = os.getenv("PROXY_URL")
LONG_FIRSTNAME = "XzH9tXRklkFrTjMU"
LONG_LASTNAME = "MwuCGEtROJc5CZz9"
PARTICIPANT_ALIAS = "wzec6tou"
PARTICIPANT_EMAIL = f"{EMAIL_USERNAME}+{PARTICIPANT_ALIAS}@gmail.com"
async def get_magic_code(
_page: Page, _user_email: str = USER_EMAIL, _password: str = PASSWORD
):
return "123456"
async def create_user(page: Page, firstname: str = "User", lastname: str = EMAIL_ALIAS):
await page.get_by_role("button", name="Join").click()
# Update profile
await page.get_by_text("Track and budget expenses").click()
await page.get_by_role("textbox", name="First name").fill(firstname)
await page.get_by_role("textbox", name="Last name").fill(lastname)
await page.get_by_role("button", name="Continue").click()
async def login(page: Page):
# get current timestamp
magic_code = await get_magic_code(page)
if magic_code is None:
raise ValueError("Failed to retrieve magic code")
await page.get_by_role("textbox").fill(magic_code)
async def login_or_create_user(
page: Page,
firstname: str = "User",
lastname: str = EMAIL_ALIAS,
user_email: str = USER_EMAIL,
):
await page.goto("https://dev.new.expensify.com:8082/")
await page.get_by_test_id("username").fill(user_email)
await page.get_by_role("button", name="Continue").click()
try:
await page.get_by_role("button", name="Join").wait_for(
state="visible", timeout=2000
)
await create_user(page, firstname=firstname, lastname=lastname)
except TimeoutError:
await login(page)
await page.get_by_label("Inbox").wait_for(state="visible", timeout=10000)
async def create_participant_account(browser: Browser):
context_1 = await browser.new_context()
await context_1.tracing.start(screenshots=True, snapshots=True, sources=True)
try:
page_1 = await context_1.new_page()
await login_or_create_user(
page_1,
user_email=PARTICIPANT_EMAIL,
firstname=LONG_FIRSTNAME,
lastname=LONG_LASTNAME,
)
await page_1.close()
finally:
await context_1.tracing.stop(path="/app/expensify/user_tool/output_browser1.zip")
trace_cleaner("/app/expensify/user_tool/output_browser1.zip")
await context_1.close()
async def submit_expense(page: Page):
await page.get_by_label("Create").last.click()
await page.get_by_label("Submit expense").click()
await page.get_by_label("Manual").click()
await page.get_by_placeholder("0").fill("1000000")
await (
page.locator("#numPadContainerView").get_by_role("button", name="Next").click()
)
await page.get_by_role("button", name="Submit").click()
@pytest.mark.asyncio
async def test_search_bar_spacing():
async with async_playwright() as p:
browser = await p.chromium.launch(
proxy={"server": PROXY_URL} if PROXY_URL else None,
headless=False,
args=[
"--no-sandbox",
"--disable-dev-shm-usage",
"--ignore-certificate-errors",
"--disable-web-security",
"--disable-features=IsolateOrigins,site-per-process",
],
slow_mo=SLOW_MO,
)
try:
await create_participant_account(browser)
iphone = p.devices["iPhone SE"]
context = await browser.new_context(**iphone)
await context.tracing.start(screenshots=True, snapshots=True, sources=True)
try:
page = await context.new_page()
await login_or_create_user(page)
participant_chat = page.locator(
'button[aria-label="Navigates to a chat"]',
has_text=f"{LONG_FIRSTNAME} {LONG_LASTNAME}",
).first
try:
await participant_chat.click(timeout=3000)
except TimeoutError:
await page.get_by_label("Start chat (Floating action)").click()
await page.get_by_label("Start chat", exact=True).click()
await page.get_by_test_id("selection-list-text-input").fill(
PARTICIPANT_EMAIL
)
await page.get_by_label(PARTICIPANT_EMAIL).click()
expense_preview = (
page.get_by_role("button", name="View details")
.filter(has_text=f"{LONG_FIRSTNAME} owes:")
.last
)
try:
await expense_preview.click(timeout=3000)
except TimeoutError:
await submit_expense(page)
right_margin = await page.locator(
"div[id='searchButton'][aria-label='Search']"
).last.evaluate("el => getComputedStyle(el).marginRight")
assert right_margin != "0px", "Right margin should not be zero pixels"
await page.close()
finally:
await context.tracing.stop(path="/app/expensify/user_tool/output_browser2.zip")
trace_cleaner("/app/expensify/user_tool/output_browser2.zip")
await context.close()
finally:
await browser.close()