Skip to content

Commit 94d10e9

Browse files
committed
improvements
1 parent 746b22c commit 94d10e9

File tree

5 files changed

+309
-234
lines changed

5 files changed

+309
-234
lines changed

biome.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$schema": "https://biomejs.dev/schemas/2.1.1/schema.json",
2+
"$schema": "https://biomejs.dev/schemas/2.1.4/schema.json",
33
"vcs": {
44
"enabled": true,
55
"clientKind": "git",

components/sections/migrate/__tests__/deep-scan-modal.test.tsx

Lines changed: 80 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { fireEvent, render, screen, waitFor } from '@testing-library/react'
1+
import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'
22
import React from 'react'
33
import { beforeEach, describe, expect, it, vi } from 'vitest'
4-
import type { AppId } from '@/config/apps'
5-
import { DeepScanModal, type DeepScanOptions } from '../deep-scan-modal'
4+
import { DeepScanModal } from '../deep-scan-modal'
65

76
// Mock UI components
87
vi.mock('@/components/ui/dialog', () => ({
@@ -27,15 +26,15 @@ vi.mock('@/components/ui/input', () => ({
2726
}))
2827

2928
vi.mock('@/components/ui/tabs', () => ({
30-
Tabs: ({ children, value, onValueChange }: any) => {
29+
Tabs: ({ children, value, onValueChange, 'data-testid': dataTestId }: any) => {
3130
const childrenWithProps = React.Children.map(children, child => {
3231
if (React.isValidElement(child)) {
3332
return React.cloneElement(child as any, { currentValue: value, onValueChange })
3433
}
3534
return child
3635
})
3736
return (
38-
<div data-testid="tabs" data-value={value}>
37+
<div data-testid={dataTestId || 'tabs'} data-value={value}>
3938
{childrenWithProps}
4039
</div>
4140
)
@@ -56,22 +55,26 @@ vi.mock('@/components/ui/tabs', () => ({
5655
})
5756
return <div data-testid="tabs-list">{childrenWithProps}</div>
5857
},
59-
TabsTrigger: ({ children, value, onValueChange }: any) => (
60-
<button data-testid={`tab-trigger-${value}`} onClick={() => onValueChange?.(value)}>
58+
TabsTrigger: ({ children, value, onValueChange, 'data-testid': dataTestId }: any) => (
59+
<button type="button" data-testid={dataTestId || `tab-trigger-${value}`} onClick={() => onValueChange?.(value)}>
6160
{children}
6261
</button>
6362
),
6463
}))
6564

6665
vi.mock('@/components/ui/select', () => ({
67-
Select: ({ children, value, onValueChange }: any) => (
66+
Select: ({ children, value }: any) => (
6867
<div data-testid="select" data-value={value}>
6968
{children}
7069
</div>
7170
),
7271
SelectContent: ({ children }: any) => <div data-testid="select-content">{children}</div>,
7372
SelectItem: ({ children, value }: any) => <div data-testid={`select-item-${value}`}>{children}</div>,
74-
SelectTrigger: ({ children }: any) => <button data-testid="select-trigger">{children}</button>,
73+
SelectTrigger: ({ children }: any) => (
74+
<button type="button" data-testid="select-trigger">
75+
{children}
76+
</button>
77+
),
7578
SelectValue: ({ placeholder }: any) => <span>{placeholder}</span>,
7679
}))
7780

@@ -162,57 +165,53 @@ describe('DeepScanModal', () => {
162165
})
163166

164167
it('should generate correct path for account range + address range', async () => {
165-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
168+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
166169

167170
// Switch to account range tab
168-
const accountRangeTab = container.querySelector('[data-testid="tab-trigger-range"]')
169-
if (accountRangeTab) {
170-
fireEvent.click(accountRangeTab)
171-
}
171+
const accountTabs = screen.getByTestId('account-tabs')
172+
const accountRangeTab = within(accountTabs).getByTestId('account-range-tab')
173+
fireEvent.click(accountRangeTab)
172174

173-
// Switch to address range tab (need to find the second tabs component)
174-
const allRangeTabs = container.querySelectorAll('[data-testid="tab-trigger-range"]')
175-
if (allRangeTabs[1]) {
176-
fireEvent.click(allRangeTabs[1])
177-
}
175+
// Switch to address range tab
176+
const addressTabs = screen.getByTestId('address-tabs')
177+
const addressRangeTab = within(addressTabs).getByTestId('address-range-tab')
178+
fireEvent.click(addressRangeTab)
178179

179180
// Wait for re-render
180181
await waitFor(() => {
181182
// Check for range notation in path
182-
const pathText = container.textContent || ''
183-
expect(pathText).toMatch(/m\/44'\/354'\/\{1\.\.\.5\}'\/0'\/\{0\.\.\.5\}'/i)
183+
expect(screen.getByText(/m\/44'\/354'\/\{1\.\.\.5\}'\/0'\/\{0\.\.\.5\}'/i)).toBeInTheDocument()
184184
})
185185
})
186186

187187
it('should handle same start and end indices in range', async () => {
188-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
188+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
189189

190190
// Switch to account range tab
191-
const accountRangeTab = container.querySelector('[data-testid="tab-trigger-range"]')
192-
if (accountRangeTab) {
193-
fireEvent.click(accountRangeTab)
194-
}
191+
const accountTabs = screen.getByTestId('account-tabs')
192+
const accountRangeTab = within(accountTabs).getByTestId('account-range-tab')
193+
fireEvent.click(accountRangeTab)
195194

196-
// Set same start and end for account range
197-
const inputs = container.querySelectorAll('input[type="number"]')
198-
const startInput = inputs[0] as HTMLInputElement
199-
const endInput = inputs[1] as HTMLInputElement
195+
// Set same start and end for account range using label text
196+
const startInputs = screen.getAllByLabelText('Start Index')
197+
const endInputs = screen.getAllByLabelText('End Index')
198+
const accountStartInput = startInputs[0] // Account section comes first
199+
const accountEndInput = endInputs[0]
200200

201-
fireEvent.change(startInput, { target: { value: '3' } })
202-
fireEvent.change(endInput, { target: { value: '3' } })
201+
fireEvent.change(accountStartInput, { target: { value: '3' } })
202+
fireEvent.change(accountEndInput, { target: { value: '3' } })
203203

204204
await waitFor(() => {
205-
const pathText = container.textContent || ''
206205
// When start equals end, should show single value, not range
207-
expect(pathText).toMatch(/m\/44'\/354'\/3'\/0'/i)
206+
expect(screen.getByText(/m\/44'\/354'\/3'\/0'/i)).toBeInTheDocument()
208207
})
209208
})
210209

211210
it('should update path when chain selection changes', () => {
212-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
211+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
213212

214213
// Initial path should use Polkadot coin type (354)
215-
expect(container.textContent).toMatch(/m\/44'\/354'/i)
214+
expect(screen.getByText(/m\/44'\/354'/i)).toBeInTheDocument()
216215

217216
// Note: Full chain selection testing would require more complex mocking
218217
// of the Select component to properly simulate selection changes
@@ -241,21 +240,21 @@ describe('DeepScanModal', () => {
241240
})
242241

243242
it('should disable scan button when range end is less than start', async () => {
244-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
243+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
245244

246245
// Switch to account range tab
247-
const accountRangeTab = container.querySelector('[data-testid="tab-trigger-range"]')
248-
if (accountRangeTab) {
249-
fireEvent.click(accountRangeTab)
250-
}
246+
const accountTabs = screen.getByTestId('account-tabs')
247+
const accountRangeTab = within(accountTabs).getByTestId('account-range-tab')
248+
fireEvent.click(accountRangeTab)
251249

252250
await waitFor(() => {
253-
const inputs = container.querySelectorAll('input[type="number"]')
254-
const startInput = inputs[0] as HTMLInputElement
255-
const endInput = inputs[1] as HTMLInputElement
251+
const startInputs = screen.getAllByLabelText('Start Index')
252+
const endInputs = screen.getAllByLabelText('End Index')
253+
const accountStartInput = startInputs[0] // Account section comes first
254+
const accountEndInput = endInputs[0]
256255

257-
fireEvent.change(startInput, { target: { value: '5' } })
258-
fireEvent.change(endInput, { target: { value: '3' } })
256+
fireEvent.change(accountStartInput, { target: { value: '5' } })
257+
fireEvent.change(accountEndInput, { target: { value: '3' } })
259258

260259
const scanButton = screen.getByText('Start Deep Scan')
261260
expect(scanButton).toBeDisabled()
@@ -299,23 +298,28 @@ describe('DeepScanModal', () => {
299298
})
300299

301300
it('should generate correct options for account range + address range', async () => {
302-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
301+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
303302

304303
// Switch both to range mode
305-
const rangeTabs = container.querySelectorAll('[data-testid="tab-trigger-range"]')
306-
if (rangeTabs[0]) fireEvent.click(rangeTabs[0]) // Account range
307-
if (rangeTabs[1]) fireEvent.click(rangeTabs[1]) // Address range
304+
const accountTabs = screen.getByTestId('account-tabs')
305+
const accountRangeTab = within(accountTabs).getByTestId('account-range-tab')
306+
fireEvent.click(accountRangeTab)
307+
308+
const addressTabs = screen.getByTestId('address-tabs')
309+
const addressRangeTab = within(addressTabs).getByTestId('address-range-tab')
310+
fireEvent.click(addressRangeTab)
308311

309312
await waitFor(() => {
310-
const inputs = container.querySelectorAll('input[type="number"]')
313+
const startInputs = screen.getAllByLabelText('Start Index')
314+
const endInputs = screen.getAllByLabelText('End Index')
311315

312-
// Set account range 2-5
313-
fireEvent.change(inputs[0], { target: { value: '2' } })
314-
fireEvent.change(inputs[1], { target: { value: '5' } })
316+
// Set account range 2-5 (account inputs come first)
317+
fireEvent.change(startInputs[0], { target: { value: '2' } })
318+
fireEvent.change(endInputs[0], { target: { value: '5' } })
315319

316-
// Set address range 1-10
317-
fireEvent.change(inputs[2], { target: { value: '1' } })
318-
fireEvent.change(inputs[3], { target: { value: '10' } })
320+
// Set address range 1-10 (address inputs come second)
321+
fireEvent.change(startInputs[1], { target: { value: '1' } })
322+
fireEvent.change(endInputs[1], { target: { value: '10' } })
319323

320324
const scanButton = screen.getByText('Start Deep Scan')
321325
fireEvent.click(scanButton)
@@ -333,20 +337,22 @@ describe('DeepScanModal', () => {
333337
})
334338

335339
it('should generate correct options for mixed modes', async () => {
336-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
340+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
337341

338342
// Keep account as single, switch address to range
339-
const rangeTabs = container.querySelectorAll('[data-testid="tab-trigger-range"]')
340-
if (rangeTabs[1]) fireEvent.click(rangeTabs[1]) // Address range only
343+
const addressTabs = screen.getByTestId('address-tabs')
344+
const addressRangeTab = within(addressTabs).getByTestId('address-range-tab')
345+
fireEvent.click(addressRangeTab)
341346

342347
await waitFor(() => {
343348
const accountInput = screen.getByPlaceholderText('1') as HTMLInputElement
344349
fireEvent.change(accountInput, { target: { value: '3' } })
345350

346-
const inputs = container.querySelectorAll('input[type="number"]')
347-
// Set address range
348-
const addressStartInput = inputs[1] as HTMLInputElement
349-
const addressEndInput = inputs[2] as HTMLInputElement
351+
const startInputs = screen.getAllByLabelText('Start Index')
352+
const endInputs = screen.getAllByLabelText('End Index')
353+
// Set address range (since account is single, address inputs will be the only ones)
354+
const addressStartInput = startInputs[0] // Only address range inputs exist
355+
const addressEndInput = endInputs[0]
350356
fireEvent.change(addressStartInput, { target: { value: '0' } })
351357
fireEvent.change(addressEndInput, { target: { value: '5' } })
352358

@@ -386,22 +392,22 @@ describe('DeepScanModal', () => {
386392
})
387393

388394
it('should show alert for large account ranges', async () => {
389-
const { container } = render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
395+
render(<DeepScanModal isOpen={true} onClose={mockOnClose} onScan={mockOnScan} />)
390396

391397
// Switch to account range
392-
const accountRangeTab = container.querySelector('[data-testid="tab-trigger-range"]')
393-
if (accountRangeTab) {
394-
fireEvent.click(accountRangeTab)
395-
}
398+
const accountTabs = screen.getByTestId('account-tabs')
399+
const accountRangeTab = within(accountTabs).getByTestId('account-range-tab')
400+
fireEvent.click(accountRangeTab)
396401

397402
await waitFor(() => {
398-
const inputs = container.querySelectorAll('input[type="number"]')
399-
const startInput = inputs[0] as HTMLInputElement
400-
const endInput = inputs[1] as HTMLInputElement
403+
const startInputs = screen.getAllByLabelText('Start Index')
404+
const endInputs = screen.getAllByLabelText('End Index')
405+
const accountStartInput = startInputs[0] // Account section comes first
406+
const accountEndInput = endInputs[0]
401407

402408
// Set large range (more than 50)
403-
fireEvent.change(startInput, { target: { value: '0' } })
404-
fireEvent.change(endInput, { target: { value: '60' } })
409+
fireEvent.change(accountStartInput, { target: { value: '0' } })
410+
fireEvent.change(accountEndInput, { target: { value: '60' } })
405411

406412
const alert = screen.getByTestId('alert')
407413
expect(alert).toBeInTheDocument()

0 commit comments

Comments
 (0)