forked from Creditra/Creditra-Frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNetworkStatus.test.tsx
More file actions
120 lines (95 loc) · 3.33 KB
/
Copy pathNetworkStatus.test.tsx
File metadata and controls
120 lines (95 loc) · 3.33 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
120
import { render, screen, act } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { NetworkStatus } from './NetworkStatus';
import * as useOnlineHook from '../hooks/useOnline';
vi.mock('../hooks/useOnline');
describe('NetworkStatus', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('renders online indicator with accessible label', () => {
vi.spyOn(useOnlineHook, 'useOnline').mockReturnValue({
isOnline: true,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
});
render(<NetworkStatus />);
expect(
screen.getByLabelText('Network status: online'),
).toBeInTheDocument();
expect(screen.getByText('Online')).toBeInTheDocument();
});
it('renders offline indicator with accessible label', () => {
vi.spyOn(useOnlineHook, 'useOnline').mockReturnValue({
isOnline: false,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
});
render(<NetworkStatus />);
expect(
screen.getByLabelText('Network status: offline'),
).toBeInTheDocument();
expect(screen.getByText('Offline')).toBeInTheDocument();
});
it('does not announce on initial mount', () => {
vi.spyOn(useOnlineHook, 'useOnline').mockReturnValue({
isOnline: true,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
});
render(<NetworkStatus />);
expect(screen.queryByRole('status')).not.toBeInTheDocument();
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
});
it('announces assertively when going offline', () => {
let isOnline = true;
vi.spyOn(useOnlineHook, 'useOnline').mockImplementation(() => ({
isOnline,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
}));
const { rerender } = render(<NetworkStatus />);
expect(screen.queryByRole('alert')).not.toBeInTheDocument();
isOnline = false;
rerender(<NetworkStatus />);
const alert = screen.getByRole('alert');
expect(alert).toHaveAttribute('aria-live', 'assertive');
expect(alert).toHaveTextContent('Network connection lost. You are offline.');
});
it('announces politely when connection is restored', () => {
let isOnline = false;
vi.spyOn(useOnlineHook, 'useOnline').mockImplementation(() => ({
isOnline,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
}));
const { rerender } = render(<NetworkStatus />);
isOnline = true;
act(() => {
rerender(<NetworkStatus />);
});
const status = screen.getByRole('status');
expect(status).toHaveAttribute('aria-live', 'polite');
expect(status).toHaveTextContent('Network connection restored.');
});
it('applies theme-aware online/offline modifier classes', () => {
vi.spyOn(useOnlineHook, 'useOnline').mockReturnValue({
isOnline: true,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
});
const { rerender } = render(<NetworkStatus />);
expect(screen.getByLabelText('Network status: online')).toHaveClass(
'network-status--online',
);
vi.spyOn(useOnlineHook, 'useOnline').mockReturnValue({
isOnline: false,
queueAction: vi.fn(),
checkOnlineStatus: vi.fn(),
});
rerender(<NetworkStatus />);
expect(screen.getByLabelText('Network status: offline')).toHaveClass(
'network-status--offline',
);
});
});