issues/249/user_tool.py (90 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)
from utils.trace_cleaner import trace_cleaner
import pytest
from playwright.async_api import expect, async_playwright, Browser, Page
from utils.login import sign_in, NEW_DOT_URL, check_if_logged_in
from utils.browser import close_browser
USER_EMAILA = "doorsqueaky+3182311@gmail.com"
USERNAME_A = 'John Doe'
PASSWORD_A = ""
USER_EMAILB = "windowsqueaky+3919211@gmail.com"
PASSWORD_B = ""
USERNAME_B = 'Jane Doe'
async def start_browser_with_proxy():
playwright = await async_playwright().start()
browser = await playwright.chromium.launch(
slow_mo=500,
headless=True,
proxy={
'server': 'http://127.0.0.1:8080'
},
args=[
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process'
]
)
context = await browser.new_context(ignore_https_errors=True)
# Start tracing for this context
await context.tracing.start(screenshots=True, snapshots=True, sources=True)
page = await context.new_page()
return context, page, playwright
async def send_message(page: Page, recepient_email: str, message: str):
await page.locator('button[aria-label="Start chat (Floating action)"]').click()
await page.locator('div[aria-label="Start chat"][role="menuitem"]').click()
await page.locator('input[aria-label="Name, email, or phone number"]').fill(recepient_email)
await page.get_by_test_id('selection-list').locator(f'button:has-text("{recepient_email}")').click()
await page.wait_for_timeout(1000)
message_editor = page.locator('div[contenteditable="true"][placeholder="Write something..."]').last
await message_editor.fill(message)
await message_editor.press("Enter")
async def create_draft_reply_in_thread(page: Page, username: str, sender_email: str, message: str, reply: str):
if await page.locator('button[aria-label="Navigates to a chat"]', has_text=sender_email).is_visible():
await page.locator('button[aria-label="Navigates to a chat"]', has_text=sender_email).click()
else:
await page.locator('button[aria-label="Navigates to a chat"]', has_text=username).click()
await page.locator('div[aria-label="Chat message"]', has_text=message).click(button="right")
await page.locator('div[aria-label="Reply in thread"][role="menuitem"]').click()
await page.wait_for_timeout(1000)
message_editor = page.locator('div[aria-label="Chat message"]', has_text=message)
# Assuming the draft editor is the same as the message editor for reply
message_editor = page.locator('div[contenteditable="true"][placeholder="Write something..."]').last
await message_editor.fill(reply)
async def navigate_away_check_draft(page: Page, username: str, sender_email: str):
if await page.locator('button[aria-label="Navigates to a chat"]', has_text=sender_email).is_visible():
await page.locator('button[aria-label="Navigates to a chat"]', has_text=sender_email).click()
else:
await page.locator('button[aria-label="Navigates to a chat"]', has_text=username).click()
await page.wait_for_timeout(2000)
draft_reply_LHN_btn = page.locator('button[aria-label="Navigates to a chat"]', has_text="No activity yet")
await expect(draft_reply_LHN_btn).to_be_visible()
async def enter_dummy_otp_if_not_logged_in(page: Page, email: str):
if not await check_if_logged_in(page=page, url=NEW_DOT_URL):
await page.get_by_test_id("username").fill(email)
await page.get_by_role("button", name="Continue").click()
await page.get_by_test_id("validateCode").fill("123456")
@pytest.mark.asyncio
async def test_workspace_switch_on_reload():
# Initialize browser contexts to None for cleanup
contextA = contextB = None
pageA = pageB = None
playwrightA = playwrightB = None
try:
contextA, pageA, playwrightA = await start_browser_with_proxy()
await enter_dummy_otp_if_not_logged_in(pageA, USER_EMAILA)
await expect(pageA.get_by_label("Inbox")).to_be_visible()
message = "Hello How are you"
await send_message(pageA, USER_EMAILB, message)
contextB, pageB, playwrightB = await start_browser_with_proxy()
await enter_dummy_otp_if_not_logged_in(pageB, USER_EMAILB)
await expect(pageA.get_by_label("Inbox")).to_be_visible()
reply = "Hey I am good. What about you?"
await create_draft_reply_in_thread(pageB, USERNAME_A, USER_EMAILA, message, reply)
await navigate_away_check_draft(pageB, USERNAME_A, USER_EMAILA)
finally:
# Stop tracing and export the trace before closing each browser
if contextA is not None:
await contextA.tracing.stop(path="/app/expensify/user_tool/output_browser1.zip")
trace_cleaner("/app/expensify/user_tool/output_browser1.zip")
await close_browser(contextA, pageA, playwrightA)
if contextB is not None:
await contextB.tracing.stop(path="/app/expensify/user_tool/output_browser2.zip")
trace_cleaner("/app/expensify/user_tool/output_browser2.zip")
await close_browser(contextB, pageB, playwrightB)