issues/50065_702/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)
import pytest
import re
from playwright.async_api import async_playwright, expect, Page, TimeoutError
from utils.email_handler import get_unique_derived_email
from utils.trace_cleaner import trace_cleaner
async def connect_netsuite(accounting_page: Page):
await accounting_page.get_by_label("NetSuite").get_by_role(
"button", name="Connect"
).click()
try:
await accounting_page.locator("button", has_text="Upgrade").click(
timeout=3000
)
await accounting_page.get_by_role(
"button", name="Got it, thanks"
).click()
except TimeoutError:
pass
workspace_id = re.search(
r"settings/workspaces/([^/]+)/", accounting_page.url
).group(1)
js_code = """
() => {
const net_suite = {
"accountID": "TSTDRV1668486",
"tokenID": "4WFxamEE2VzbjX/EN/Z9I5dFAOefKCdes1jtb1db87aATFz6T0pWt51jGFUJeYQFRdbrj6vIDbYLT/q+jW0cWXBLUcnV5CUqb2qsw4WVNlI=;kO0hlBNY1KxfPxZZTxJu/Q==;BXajerPTWHDHlPF/2NkKOHQP/cZ9zfuc3ENJN6u6K9/+KDtYxsPocN7JgZW10WDkGu5hL9YlMZSlY3tOBonSpw==",
"options": {
"data": {
"subsidiaryList": [
{
"internalID": "1",
"country": "_unitedStates",
"isElimination": false,
"name": "Honeycomb Mfg."
},
{
"internalID": "3",
"country": "_unitedStates",
"isElimination": false,
"name": "Honeycomb Holdings Inc."
}
],
"items": [
{
"name": "EST99999",
"id": "1006"
},
{
"name": "Expensify Invoice Expense",
"id": "1171"
},
{
"name": "Expensify Invoice Line Item",
"id": "1172"
}
],
"payableList": [
{
"GL Code": "0805",
"name": "0805 Expensify Card Liability Ted Test",
"id": "3050",
"type": "_otherCurrentLiability"
},
{
"GL Code": "1000",
"name": "1000 Checking",
"id": "1",
"type": "_bank"
},
{
"GL Code": "1002",
"name": "1002 Savings",
"id": "2",
"type": "_bank"
}
],
"taxAccountsList": [
{
"country": "_canada",
"name": "PST Expenses BC",
"externalID": "192"
}
]
},
"config": {
"invoiceItemPreference": "create",
"receivableAccount": "7",
"taxPostingAccount": "",
"exportToNextOpenPeriod": false,
"allowForeignCurrency": true,
"reimbursableExpensesExportDestination": "EXPENSE_REPORT",
"subsidiary": "Honeycomb Mfg.",
"syncOptions": {
"mapping": {
"classes": "REPORT_FIELD",
"jobs": "TAG",
"locations": "REPORT_FIELD",
"customers": "TAG",
"departments": "REPORT_FIELD"
},
"crossSubsidiaryCustomers": false,
"syncApprovalWorkflow": true,
"syncCustomLists": false,
"exportReportsTo": "REPORTS_APPROVED_NONE",
"exportVendorBillsTo": "VENDOR_BILLS_APPROVED_NONE",
"setFinalApprover": true,
"syncReimbursedReports": true,
"customSegments": [],
"syncPeople": false,
"enableNewCategories": true,
"hasChosenAutoSyncOption": true,
"finalApprover": "yuwen@expensify.com",
"syncTax": false,
"syncCustomSegments": false,
"customLists": [],
"syncCategories": true,
"hasChosenSyncReimbursedReportsOption": true,
"exportJournalsTo": "JOURNALS_APPROVED_NONE"
},
"autoCreateEntities": true,
"exporter": "yuwen@expensify.com",
"exportDate": "LAST_EXPENSE",
"nonreimbursableExpensesExportDestination": "VENDOR_BILL",
"reimbursablePayableAccount": "3050",
"journalPostingPreference": "JOURNALS_POSTING_TOTAL_LINE",
"invoiceItem": "1006",
"subsidiaryID": "1",
"defaultVendor": "42767",
"provincialTaxPostingAccount": " ",
"reimbursementAccountID": "1",
"approvalAccount": "2000 Accounts Payable",
"payableAcct": "3050",
"customFormIDOptions": {
"reimbursable": {
"expenseReport": null
},
"nonReimbursable": {
"vendorBill": null
},
"enabled": false
},
"collectionAccount": "1"
}
},
"verified": true,
"lastSyncDate": "2024-11-08T05:56:40+0000",
"lastErrorSyncDate": "",
"source": "EXPENSIFYWEB",
"config": {
"autoSync": {
"jobID": "5181292703454260454",
"enabled": true
}
},
"tokenSecret": "ibhjt36G3f5dmzje63CfEtS2DxpgB7ZXzx/7mcP3U33zx00P48RxQMAwN12JpsZChWNcN+t8YqjMdZiFRFae/CIwe0B7L0cbeiv2wSzxezc=;BRBh21nq9ogfckK+dFWYiQ==;TvupLzzkSWlB4lH/rtqDUF5wvVIyp40an3sYMsCpDu4txOiNT4f51oKGfXxgqN4JxgbzvDvGlNBciy3sSTR+9Q=="
}
Onyx.merge(`policy_WORKSPACE_ID`, {"connections":{
"netsuite":net_suite
}
});
}
""".replace(
"WORKSPACE_ID", workspace_id
)
await accounting_page.evaluate(js_code)
await accounting_page.locator("#overLayBottomButton").click()
@pytest.mark.asyncio
async def test_send_invoice_workspace():
async with async_playwright() as p:
base_email = "namesomerandomemail@gmail.com"
password = ""
derived_email = get_unique_derived_email(base_email)
derived_email = 'namesomerandomemail+1733924831@gmail.com'
print(derived_email)
browser = await p.chromium.launch(headless=True, args=[
"--ignore-certificate-errors",
"--disable-web-security",
"--disable-features=IsolateOrigins,site-per-process"
], proxy={"server": "http://localhost:8080"}, slow_mo=500)
context = await browser.new_context(viewport={"width": 1280, "height": 500})
await context.tracing.start(title="trace", screenshots=True, snapshots=True, sources=True)
page = await context.new_page()
try:
await page.goto('https://dev.new.expensify.com:8082/')
phone_or_email_input = page.locator('input[type="email"]')
await expect(phone_or_email_input).to_be_visible()
await phone_or_email_input.fill(derived_email)
continue_button = page.locator('button[tabindex="0"]')
await expect(continue_button).to_be_visible()
await continue_button.click()
try:
continue_button = page.locator('button[tabindex="0"]')
await expect(continue_button).to_be_visible()
await continue_button.click()
except Exception:
pass
track_budget_option = page.locator("text=Track and budget expenses")
await track_budget_option.click()
await page.locator('input[name="fname"]').fill('Test')
await page.locator('input[name="lname"]').fill('Test')
await page.get_by_role("button", name="Continue").last.click()
create_button = page.locator("[aria-label='Start chat (Floating action)']")
await create_button.click()
new_workspace_button = page.locator("[aria-label='New workspace']")
await new_workspace_button.click()
more_features_button = page.locator("text=More features")
await more_features_button.click()
invoice_button = page.locator("[aria-label='Sync your chart of accounts and more.']")
await invoice_button.click()
await page.locator("[aria-label='Accounting']").click()
await connect_netsuite(page)
await page.goto(f"{page.url}/netsuite/import/custom-segment/new")
await page.get_by_label("Custom segment").click()
await page.get_by_role("button", name="Next").click()
await page.get_by_role("textbox", name="Name").press("CapsLock")
await page.get_by_role("textbox", name="Name").fill("Posting")
await page.get_by_role("button", name="Next").click()
has_scroll_bar = await page.evaluate('''() => {
const element = document.querySelector(".css-view-175oi2r.r-WebkitOverflowScrolling-150rngu.r-overflowY-1rnoaur");
return element ? element.scrollHeight > element.clientHeight : false;
}''')
assert has_scroll_bar, "Expected div to have a scrollbar, but it does not."
finally:
await context.tracing.stop(path="/app/expensify/user_tool/output_browser1.zip")
trace_cleaner("/app/expensify/user_tool/output_browser1.zip")
await browser.close()