Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
1a9a0aa
test: add utility and env test coverage (Tier 1)
gabitoesmiapodo Mar 23, 2026
7edb47f
test: address review feedback on Tier 1 test suite
gabitoesmiapodo Mar 23, 2026
55510e5
test: enhance BigNumberInput and HashInput coverage (Tier 2)
gabitoesmiapodo Mar 23, 2026
33e3ca3
test: address review feedback on Tier 2 test suite
gabitoesmiapodo Mar 23, 2026
40e06d3
test: address review feedback on Tier 1 test suite (round 2)
gabitoesmiapodo Mar 23, 2026
543f5f4
test: import ComponentProps from react instead of using React namespace
gabitoesmiapodo Mar 23, 2026
2b605b6
test: add hook test coverage (Tier 3)
gabitoesmiapodo Mar 23, 2026
d6ced76
test: address review feedback on Tier 3 hook test suite
gabitoesmiapodo Mar 23, 2026
7bda650
test: add component test coverage (Tier 4)
gabitoesmiapodo Mar 23, 2026
7b00d3b
test: address review feedback on Tier 4 component tests
gabitoesmiapodo Mar 23, 2026
09e9de1
test: add demo page smoke tests (Tier 5)
gabitoesmiapodo Mar 23, 2026
4fe5f28
test: fix detectHash mock in HashHandling smoke test
gabitoesmiapodo Mar 23, 2026
b0fe779
test: address review feedback on Tier 5 demo smoke tests
gabitoesmiapodo Mar 23, 2026
a412c4f
test: fix redundant cases in isNativeToken test suite
gabitoesmiapodo Mar 25, 2026
990a656
chore: ignore .worktrees directory
gabitoesmiapodo Mar 25, 2026
ff358c9
Merge pull request #416 from BootNodeDev/test/enhance-existing
gabitoesmiapodo Mar 25, 2026
5861213
refactor(tests): use Address type from viem instead of template literal
gabitoesmiapodo Mar 25, 2026
11fb2a4
Merge pull request #417 from BootNodeDev/test/hooks
gabitoesmiapodo Mar 25, 2026
9d1aff7
Merge pull request #418 from BootNodeDev/test/components
gabitoesmiapodo Mar 25, 2026
cb38783
Merge pull request #419 from BootNodeDev/test/demo-smoke
gabitoesmiapodo Mar 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .env.test
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

❤️

Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Test environment variables for Vitest
PUBLIC_APP_NAME=dAppBooster Test
PUBLIC_NATIVE_TOKEN_ADDRESS=0x0000000000000000000000000000000000000000
PUBLIC_WALLETCONNECT_PROJECT_ID=test-project-id
PUBLIC_SUBGRAPHS_API_KEY=test-api-key
PUBLIC_SUBGRAPHS_CHAINS_RESOURCE_IDS=1:test:test-resource-id
PUBLIC_SUBGRAPHS_ENVIRONMENT=production
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,4 @@ yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
.worktrees
14 changes: 14 additions & 0 deletions setupTests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,20 @@ import { afterEach, expect } from 'vitest'

expect.extend(matchers)

// ResizeObserver is not implemented in jsdom but required by @floating-ui (Chakra menus/popovers).
// Use a real class rather than vi.fn() so vi.restoreAllMocks() in test files cannot clear it.
if (typeof globalThis.ResizeObserver === 'undefined') {
class ResizeObserver {
// biome-ignore lint/suspicious/noExplicitAny: stub for jsdom test environment
observe(_target: any) {}
// biome-ignore lint/suspicious/noExplicitAny: stub for jsdom test environment
unobserve(_target: any) {}
disconnect() {}
}
// @ts-expect-error ResizeObserver is not in the Node/jsdom type definitions
globalThis.ResizeObserver = ResizeObserver
}

afterEach(() => {
cleanup()
})
22 changes: 22 additions & 0 deletions src/components/pageComponents/NotFound404.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import NotFound404 from './NotFound404'

const system = createSystem(defaultConfig)

vi.mock('@tanstack/react-router', () => ({
useNavigate: vi.fn(() => vi.fn()),
}))

describe('NotFound404', () => {
it('renders 404 title and message', () => {
render(
<ChakraProvider value={system}>
<NotFound404 />
</ChakraProvider>,
)
expect(screen.getByText('404 - Not Found')).toBeDefined()
expect(screen.getByRole('button', { name: 'Home' })).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import connectWallet from './index'

const system = createSystem(defaultConfig)

vi.mock('@/src/providers/Web3Provider', () => ({
ConnectWalletButton: () => <button type="button">Connect Wallet</button>,
}))

describe('ConnectWallet demo', () => {
it('renders the connect wallet button', () => {
render(<ChakraProvider value={system}>{connectWallet.demo}</ChakraProvider>)
expect(screen.getByRole('button', { name: 'Connect Wallet' })).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import ensName from './index'

const system = createSystem(defaultConfig)

vi.mock('wagmi', () => ({
useEnsName: vi.fn(() => ({ data: undefined, error: undefined, status: 'pending' })),
}))

describe('EnsName demo', () => {
it('renders the ENS name search interface', () => {
render(<ChakraProvider value={system}>{ensName.demo}</ChakraProvider>)
expect(screen.getByText('Find ENS name')).toBeDefined()
expect(
screen.getByPlaceholderText('Enter an address or select one from the dropdown'),
).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import hashHandling from './index'

const system = createSystem(defaultConfig)

vi.mock('@/src/hooks/useWeb3Status', () => ({
useWeb3Status: vi.fn(() => ({
isWalletConnected: false,
walletChainId: undefined,
})),
}))

vi.mock('@/src/utils/hash', () => {
const mockFn = vi.fn(() => Promise.resolve(null))
return {
default: mockFn,
detectHash: mockFn,
}
})

describe('HashHandling demo', () => {
it('renders the hash input field', () => {
render(<ChakraProvider value={system}>{hashHandling.demo}</ChakraProvider>)
expect(screen.getByPlaceholderText(/address|hash/i)).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import signMessage from './index'

const system = createSystem(defaultConfig)

vi.mock('@/src/hooks/useWeb3Status', () => ({
useWeb3Status: vi.fn(() => ({
isWalletConnected: false,
isWalletSynced: false,
walletChainId: undefined,
appChainId: 11155420,
switchChain: vi.fn(),
})),
}))

vi.mock('@/src/providers/Web3Provider', () => ({
ConnectWalletButton: () => <button type="button">Connect Wallet</button>,
}))

describe('SignMessage demo', () => {
it('renders connect wallet fallback when wallet not connected', () => {
render(<ChakraProvider value={system}>{signMessage.demo}</ChakraProvider>)
expect(screen.getByRole('button', { name: 'Connect Wallet' })).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import switchNetwork from './index'

const system = createSystem(defaultConfig)

vi.mock('@/src/hooks/useWeb3Status', () => ({
useWeb3Status: vi.fn(() => ({
isWalletConnected: false,
})),
}))

vi.mock('@/src/providers/Web3Provider', () => ({
ConnectWalletButton: () => <button type="button">Connect Wallet</button>,
}))

describe('SwitchNetwork demo', () => {
it('renders connect wallet button when wallet not connected', () => {
render(<ChakraProvider value={system}>{switchNetwork.demo}</ChakraProvider>)
expect(screen.getByRole('button', { name: 'Connect Wallet' })).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { ChakraProvider, createSystem, defaultConfig } from '@chakra-ui/react'
import { render, screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import tokenDropdown from './index'

const system = createSystem(defaultConfig)

// Mock the shared component to avoid its deep dependency chain
// (TokenSelect uses withSuspenseAndRetry, useTokenLists, useTokens, etc.)
vi.mock('@/src/components/sharedComponents/TokenDropdown', () => ({
default: () => <div data-testid="token-dropdown-mock">Token Dropdown</div>,
}))

describe('TokenDropdown demo', () => {
it('renders the token dropdown container', () => {
render(<ChakraProvider value={system}>{tokenDropdown.demo}</ChakraProvider>)
expect(screen.getByText('Search and select a token')).toBeDefined()
expect(screen.getByTestId('token-dropdown-mock')).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { createMockWeb3Status, renderWithProviders } from '@/src/test-utils'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import tokenInput from './index'

vi.mock('@/src/hooks/useWeb3Status', () => ({
useWeb3Status: vi.fn(() => createMockWeb3Status()),
}))

vi.mock('@/src/hooks/useTokenLists', () => ({
useTokenLists: vi.fn(() => ({
tokens: [],
tokensByChainId: {},
tokensByAddress: {},
tokensBySymbol: {},
})),
}))

vi.mock('@/src/hooks/useTokenSearch', () => ({
useTokenSearch: vi.fn(() => ({
searchResult: [],
})),
}))

vi.mock('@/src/components/sharedComponents/TokenInput/useTokenInput', () => ({
useTokenInput: vi.fn(() => ({
amount: 0n,
setAmount: vi.fn(),
amountError: null,
setAmountError: vi.fn(),
balance: 0n,
balanceError: null,
isLoadingBalance: false,
selectedToken: undefined,
setTokenSelected: vi.fn(),
})),
}))

describe('TokenInput demo', () => {
it('renders the token input container', () => {
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } })
renderWithProviders(
<QueryClientProvider client={queryClient}>{tokenInput.demo}</QueryClientProvider>,
)
// The mode dropdown should be visible
expect(screen.getByText('Single token')).toBeDefined()
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { createMockWeb3Status, renderWithProviders } from '@/src/test-utils'
import { screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import transactionButton from './index'

vi.mock('@/src/hooks/useWeb3Status', () => ({
useWeb3Status: vi.fn(() => createMockWeb3Status({ appChainId: 11155420 })),
}))

vi.mock('@/src/providers/Web3Provider', () => ({
ConnectWalletButton: () => <button type="button">Connect Wallet</button>,
}))

describe('TransactionButton demo', () => {
it('renders connect wallet fallback when wallet not connected', () => {
renderWithProviders(transactionButton.demo)
expect(screen.getByRole('button', { name: 'Connect Wallet' })).toBeDefined()
})
})
21 changes: 21 additions & 0 deletions src/components/pageComponents/home/index.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { renderWithProviders } from '@/src/test-utils'
import { screen } from '@testing-library/react'
import { describe, expect, it, vi } from 'vitest'
import { Home } from './index'

// Mock sub-components that pull in Web3 dependencies to keep this a pure structural test
vi.mock('@/src/components/pageComponents/home/Examples', () => ({
default: () => <section data-testid="examples">Examples</section>,
}))

vi.mock('@/src/components/pageComponents/home/Welcome', () => ({
default: () => <section data-testid="welcome">Welcome</section>,
}))

describe('Home', () => {
it('renders Welcome and Examples sections', () => {
renderWithProviders(<Home />)
expect(screen.getByTestId('welcome')).toBeDefined()
expect(screen.getByTestId('examples')).toBeDefined()
})
})
Loading
Loading