Skip to content

Commit d6b5d91

Browse files
committed
feat: Add lighthouse timespan
1 parent 61d0302 commit d6b5d91

File tree

6 files changed

+808
-355
lines changed

6 files changed

+808
-355
lines changed

packages/arb-token-bridge-ui/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
"start": "next start",
6363
"test": "vitest --config vitest.config.ts --watch",
6464
"test:ci": "vitest --config vitest.config.ts --run",
65+
"test:perf": "ts-node --project ./tests/perf/tsconfig.json ./tests/perf/switchNetwork.ts",
6566
"lint": "tsc && eslint 'src/**/*.{js,ts,tsx}'",
6667
"lint:fix": "tsc && eslint 'src/**/*.{js,ts,tsx}' --quiet --fix",
6768
"prettier:format": "prettier --config-precedence file-override --write \"src/**/*.{tsx,ts,scss,md,json}\"",
@@ -112,11 +113,13 @@
112113
"eslint-plugin-react-hooks": "^4.6.0",
113114
"eslint-plugin-zustand-rules": "https://github.com/OffchainLabs/eslint-plugin-zustand-rules",
114115
"happy-dom": "^17.4.4",
116+
"lighthouse": "^12.6.0",
115117
"patch-package": "^8.0.0",
116118
"postcss": "^8.5.3",
117119
"postinstall-postinstall": "^2.1.0",
118120
"prettier": "^2.7.1",
119121
"prettier-plugin-tailwindcss": "^0.1.11",
122+
"puppeteer": "^24.8.2",
120123
"satori": "^0.12.2",
121124
"start-server-and-test": "^2.0.11",
122125
"tailwindcss": "^3.4.16",

packages/arb-token-bridge-ui/src/components/TransferPanel/TokenRow.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ export function TokenRow({
341341
onClick={() => onTokenSelected(token)}
342342
style={{ ...style, minHeight: '84px' }}
343343
disabled={!tokenIsBridgeable}
344+
aria-label={`Select ${token?.symbol}`}
344345
className={twMerge(
345346
'flex w-full flex-row items-center justify-between px-4 py-3 transition duration-200 hover:bg-white/10',
346347
tokenIsBridgeable

packages/arb-token-bridge-ui/src/components/TransferPanel/TokenSearch.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,6 @@ function TokensPanel({
542542
errorMessage={errorMessage}
543543
onSubmit={addNewToken}
544544
SearchInputButton={AddButton}
545-
dataCy="tokenSearchList"
546545
isDialog={false}
547546
>
548547
<AutoSizer>

packages/arb-token-bridge-ui/src/components/common/NetworkSelectionContainer.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ export function NetworkButton({
146146
)}
147147
disabled={disabled}
148148
onClick={onClick}
149+
aria-label={
150+
(isSource ? 'From ' : 'To ') + getNetworkName(selectedChainId)
151+
}
149152
>
150153
<span className="max-w-[220px] truncate text-sm leading-[1.1] md:max-w-[250px] md:text-xl">
151154
{isSource ? 'From:' : 'To: '} {getNetworkName(selectedChainId)}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import puppeteer from 'puppeteer'
2+
import { writeFileSync } from 'fs'
3+
import { startFlow, desktopConfig } from 'lighthouse'
4+
5+
// Setup the browser and Lighthouse.
6+
const browser = await puppeteer.launch({ headless: false })
7+
const page = await browser.newPage()
8+
9+
const flow = await startFlow(page, {
10+
config: desktopConfig
11+
})
12+
13+
await flow.navigate(
14+
'http://localhost:3000/?destinationChain=arbitrum-one&sourceChain=ethereum'
15+
)
16+
17+
await flow.startTimespan()
18+
19+
// Accept ToS
20+
await page.click('[aria-label="Agree to Terms and Continue"]')
21+
22+
// Type amount
23+
const input = await page.waitForSelector('[aria-label="Amount input"]')
24+
await input?.type('2')
25+
await page.waitForSelector('[aria-label="Route arbitrum"]')
26+
27+
// Switch network
28+
await page.click('[aria-label="Switch Networks"]')
29+
await page.waitForSelector("[aria-label='From Arbitrum One']")
30+
31+
// Open token selection
32+
await page.click("[aria-label='Select Token']")
33+
const tokenInput = await page.waitForSelector(
34+
"[placeholder='Search by token name, symbol, or address']"
35+
)
36+
await tokenInput?.type('USDC')
37+
await page.click('[aria-label="Select USDC.e"]')
38+
await page.waitForSelector("xpath///button[contains(., 'USDC.e')]")
39+
40+
// Open chain selection
41+
await page.click("[aria-label='From Arbitrum One']")
42+
const chainInput = await page.waitForSelector(
43+
'[placeholder="Search a network name"]'
44+
)
45+
await chainInput?.type('Xai')
46+
47+
const xaiRow = await page.waitForSelector('[aria-label="Switch to Xai"]')
48+
await xaiRow?.click()
49+
await page.waitForSelector("[aria-label='From Xai']")
50+
51+
await flow.endTimespan()
52+
await flow.snapshot()
53+
54+
// Get the comprehensive flow report.
55+
writeFileSync('report.html', await flow.generateReport())
56+
// Save results as JSON.
57+
writeFileSync(
58+
'flow-result.json',
59+
JSON.stringify(await flow.createFlowResult(), null, 2)
60+
)
61+
62+
// Cleanup.
63+
await browser.close()

0 commit comments

Comments
 (0)