Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
147 changes: 146 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -142,9 +142,11 @@
"postcss": "^8.5.3",
"storybook": "^10.3.3",
"tailwindcss": "^4.1.4",
"ts-node": "^10.9.2",
"tw-animate-css": "^1.4.0",
"typescript": "^5",
"typescript": "^5.9.3",
"vite": "^8.0.3",
"vitest": "^4.1.2"
}
},
"type": "module"
}
55 changes: 44 additions & 11 deletions src/components/__tests__/walletConnection.integration.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ jest.mock('wagmi', () => ({
}),
}));

// Mock next/dynamic to render lazy components via React.lazy/Suspense in tests
jest.mock('next/dynamic', () => (loader: any) => {
const React = require('react');
const Lazy = React.lazy(() => loader().then((loaded: any) => {
// loader might resolve to a component or a module
const comp = loaded && loaded.default ? loaded.default : loaded;
return { default: comp };
}));

return (props: any) => React.createElement(React.Suspense, { fallback: null }, React.createElement(Lazy, props));
});

// Mock security hook
jest.mock('@/hooks/useSecurity', () => ({
useSecurity: () => ({
Expand Down Expand Up @@ -75,6 +87,27 @@ const createTestProviders = (children: React.ReactNode) => {
);
};

// Simple test connector that bypasses next/dynamic and renders WalletModal synchronously
const TestConnector: React.FC = () => {
const [isOpen, setIsOpen] = React.useState(false);
const { isConnecting } = useWalletStore();

return (
<div className="flex items-center justify-center gap-3">
<button
onClick={() => setIsOpen(true)}
disabled={isConnecting}
data-tour="wallet-connector"
className="px-6 py-3 bg-blue-600 hover:bg-blue-700 disabled:bg-blue-400 text-white font-medium rounded-lg transition-colors flex items-center gap-2"
>
{isConnecting ? 'Connecting...' : 'Connect Wallet'}
</button>

<WalletModal isOpen={isOpen} onClose={() => setIsOpen(false)} />
</div>
);
};

describe('Wallet Connection Integration Tests', () => {
beforeEach(() => {
// Reset wallet store before each test
Expand Down Expand Up @@ -103,7 +136,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -148,7 +181,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -188,7 +221,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -229,7 +262,7 @@ describe('Wallet Connection Integration Tests', () => {
// Set initial connected state
useWalletStore.getState().setConnected('0x1234567890123456789012345678901234567890', 'metamask', 1);

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Should show connected state
expect(screen.getByText(/0x1234\.\.\.7890/i)).toBeInTheDocument();
Expand Down Expand Up @@ -268,7 +301,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

const { rerender } = render(createTestProviders(<WalletConnector />));
const { rerender } = render(createTestProviders(<TestConnector />));

// Connect wallet
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -312,7 +345,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -340,7 +373,7 @@ describe('Wallet Connection Integration Tests', () => {
blocks: ['Address is blacklisted'],
});

jest.mocked(useSecurity).mockReturnValue({
(useSecurity as unknown as jest.Mock).mockReturnValue({
validateWalletConnection: mockValidateWalletConnection,
} as any);

Expand All @@ -360,7 +393,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -390,7 +423,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down Expand Up @@ -428,7 +461,7 @@ describe('Wallet Connection Integration Tests', () => {
writable: true,
});

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Connect wallet
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand All @@ -450,7 +483,7 @@ describe('Wallet Connection Integration Tests', () => {
it('should close modal when clicking outside', async () => {
const user = userEvent.setup();

render(createTestProviders(<WalletConnector />));
render(createTestProviders(<TestConnector />));

// Click connect wallet button to open modal
const connectButton = screen.getByRole('button', { name: /connect wallet/i });
Expand Down
Loading