diff --git a/e2e/guide.spec.ts b/e2e/guide.spec.ts index a4de376f4..6db7c9639 100644 --- a/e2e/guide.spec.ts +++ b/e2e/guide.spec.ts @@ -63,7 +63,7 @@ test.describe('Guide 页面', () => { await page.click('[data-testid="get-started-button"]', { force: true }) // 应该导航到创建钱包页 - await expect(page).toHaveURL(/\/#\/wallet\/create\/?/) + await expect(page).toHaveURL(/(\/#\/wallet\/create)|(\/#\/onboarding\/create)\/?/) }) test('我有钱包按钮导航到导入钱包页', async ({ page }) => { @@ -79,6 +79,6 @@ test.describe('Guide 页面', () => { await page.click('[data-testid="have-wallet-button"]', { force: true }) // 应该导航到导入钱包页 - await expect(page).toHaveURL(/\/#\/wallet\/import\/?/) + await expect(page).toHaveURL(/(\/#\/wallet\/import)|(\/#\/onboarding\/recover)\/?/) }) }) diff --git a/playwright.config.ts b/playwright.config.ts index df569f833..ccca30610 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -85,6 +85,12 @@ export default defineConfig({ viewport: { width: 1280, height: 720 }, }, }, + { + name: 'Mobile Safari', + use: { + ...devices['iPhone 12'], + }, + }, ], // 使用标准 dev 服务器(端口 11173,避免与 vite 默认 517x 冲突) diff --git a/src/components/asset/asset-item.test.tsx b/src/components/asset/asset-item.test.tsx index 10473cf09..6dbe19e12 100644 --- a/src/components/asset/asset-item.test.tsx +++ b/src/components/asset/asset-item.test.tsx @@ -21,7 +21,8 @@ describe('AssetItem', () => { it('renders formatted balance', () => { render() - expect(screen.getByText('1.5')).toBeInTheDocument() + // AmountDisplay uses aria-label due to NumberFlow dual-span structure + expect(screen.getByLabelText('1.5')).toBeInTheDocument() }) it('uses assetType as name when name is not provided', () => { diff --git a/src/components/asset/asset-list.test.tsx b/src/components/asset/asset-list.test.tsx index 6b7ef40c4..f6edf917e 100644 --- a/src/components/asset/asset-list.test.tsx +++ b/src/components/asset/asset-list.test.tsx @@ -62,9 +62,10 @@ describe('AssetList', () => { it('renders asset balances', () => { renderWithI18n() - expect(screen.getByText('1.5')).toBeInTheDocument() // ETH - expect(screen.getByText('100')).toBeInTheDocument() // USDT - expect(screen.getByText('0.5')).toBeInTheDocument() // BTC + // AmountDisplay uses aria-label due to NumberFlow dual-span structure + expect(screen.getByLabelText('1.5')).toBeInTheDocument() + expect(screen.getByLabelText('100')).toBeInTheDocument() + expect(screen.getByLabelText('0.5')).toBeInTheDocument() }) it('applies custom className', () => { diff --git a/src/components/asset/asset-selector.test.tsx b/src/components/asset/asset-selector.test.tsx index 878dc34e5..3575ac0e6 100644 --- a/src/components/asset/asset-selector.test.tsx +++ b/src/components/asset/asset-selector.test.tsx @@ -1,5 +1,6 @@ import { describe, it, expect, vi } from 'vitest' import { render, screen, fireEvent } from '@testing-library/react' +import userEvent from '@testing-library/user-event' import { AssetSelector } from './asset-selector' import type { TokenInfo } from '@/components/token/token-item' @@ -78,7 +79,8 @@ describe('AssetSelector', () => { expect(screen.getByText('Tether USD')).toBeInTheDocument() }) - it('calls onSelect when asset is clicked', () => { + it('calls onSelect when asset is clicked', async () => { + const user = userEvent.setup() const onSelect = vi.fn() render( { ) // Open dropdown - fireEvent.click(screen.getByTestId('asset-selector')) + await user.click(screen.getByTestId('asset-selector')) - // Click on USDT - fireEvent.click(screen.getByText('Tether USD')) + // Click on USDT option (Base UI Select uses role="option") + const options = screen.getAllByRole('option') + const usdtOption = options.find(opt => opt.textContent?.includes('Tether USD')) + expect(usdtOption).toBeDefined() + await user.click(usdtOption!) expect(onSelect).toHaveBeenCalledWith(mockAssets[1]) }) diff --git a/src/components/common/amount-display.test.tsx b/src/components/common/amount-display.test.tsx index d9b74b255..6a56af173 100644 --- a/src/components/common/amount-display.test.tsx +++ b/src/components/common/amount-display.test.tsx @@ -50,79 +50,85 @@ describe('formatAmount', () => { }) describe('AmountDisplay', () => { + // Helper to get amount element (uses aria-label due to NumberFlow dual-span structure) + const getAmount = (value: string) => screen.getByLabelText(value) + const queryAmount = (value: string) => screen.queryByLabelText(value) + it('renders value', () => { render() - expect(screen.getByText('100')).toBeInTheDocument() + expect(getAmount('100')).toBeInTheDocument() }) it('renders with symbol', () => { render() - expect(screen.getByText('100')).toBeInTheDocument() - expect(screen.getByText('USDT')).toBeInTheDocument() + expect(getAmount('100 USDT')).toBeInTheDocument() }) it('shows hidden state', () => { render(