forked from Creditra/Creditra-Frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkMismatchBanner.test.tsx
More file actions
119 lines (94 loc) · 3.91 KB
/
Copy pathNetworkMismatchBanner.test.tsx
File metadata and controls
119 lines (94 loc) · 3.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent, act } from '@testing-library/react';
import { NetworkMismatchBanner } from './NetworkMismatchBanner';
import { useWallet } from '../../context/WalletContext';
import { isSwitchSupported, switchNetwork } from '../../utils/wallet';
vi.mock('../../context/WalletContext', () => ({
useWallet: vi.fn(),
}));
vi.mock('../../utils/wallet', () => ({
EXPECTED_NETWORK: 'TESTNET',
isSwitchSupported: vi.fn(),
switchNetwork: vi.fn(),
}));
describe('NetworkMismatchBanner', () => {
beforeEach(() => {
vi.clearAllMocks();
sessionStorage.clear();
});
it('renders nothing if no wallet is connected', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: null,
status: 'disconnected',
} as any);
const { container } = render(<NetworkMismatchBanner />);
expect(container).toBeEmptyDOMElement();
});
it('renders nothing if wallet network matches EXPECTED_NETWORK', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'freighter', network: 'TESTNET', publicKey: 'GXXX' },
status: 'connected',
} as any);
const { container } = render(<NetworkMismatchBanner />);
expect(container).toBeEmptyDOMElement();
});
it('renders banner if wallet network does not match', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'freighter', network: 'PUBLIC', publicKey: 'GXXX' },
status: 'connected',
} as any);
vi.mocked(isSwitchSupported).mockReturnValue(true);
render(<NetworkMismatchBanner />);
expect(screen.getByRole('alert')).toBeInTheDocument();
expect(screen.getByText(/Network mismatch: App expects TESTNET but your wallet is on PUBLIC/)).toBeInTheDocument();
});
it('shows switch network button when supported', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'freighter', network: 'PUBLIC', publicKey: 'GXXX' },
status: 'connected',
} as any);
vi.mocked(isSwitchSupported).mockReturnValue(true);
render(<NetworkMismatchBanner />);
const btn = screen.getByRole('button', { name: /switch network/i });
expect(btn).toBeInTheDocument();
expect(btn).not.toBeDisabled();
});
it('shows fallback copy when switch is unsupported', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'albedo', network: 'PUBLIC', publicKey: 'GXXX' },
status: 'connected',
} as any);
vi.mocked(isSwitchSupported).mockReturnValue(false);
render(<NetworkMismatchBanner />);
const btn = screen.getByRole('button', { name: /please switch to testnet in wallet/i });
expect(btn).toBeInTheDocument();
expect(btn).toBeDisabled();
});
it('can be dismissed for the session', () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'freighter', network: 'PUBLIC', publicKey: 'GXXX' },
status: 'connected',
} as any);
vi.mocked(isSwitchSupported).mockReturnValue(true);
render(<NetworkMismatchBanner />);
expect(screen.getByRole('alert')).toBeInTheDocument();
const dismissBtn = screen.getByLabelText(/dismiss alert/i);
fireEvent.click(dismissBtn);
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
expect(sessionStorage.getItem('networkMismatchDismissed')).toBe('true');
});
it('calls switchNetwork when switch button is clicked', async () => {
vi.mocked(useWallet).mockReturnValue({
wallet: { type: 'freighter', network: 'PUBLIC', publicKey: 'GXXX' },
status: 'connected',
} as any);
vi.mocked(isSwitchSupported).mockReturnValue(true);
vi.mocked(switchNetwork).mockResolvedValue(undefined);
render(<NetworkMismatchBanner />);
const btn = screen.getByRole('button', { name: /switch network/i });
await act(async () => {
fireEvent.click(btn);
});
expect(switchNetwork).toHaveBeenCalledWith('freighter', 'TESTNET');
});
});