Skip to content

Commit 0a5b606

Browse files
committed
Add component test
Signed-off-by: Viet Nguyen Duc <[email protected]>
1 parent b1c5f69 commit 0a5b606

File tree

1 file changed

+259
-0
lines changed

1 file changed

+259
-0
lines changed
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
//
2+
//
3+
4+
import * as React from 'react'
5+
import ColumnSelector from '../../components/RunningSessions/ColumnSelector'
6+
import { act, screen, within } from '@testing-library/react'
7+
import { render } from '../utils/render-utils'
8+
import userEvent from '@testing-library/user-event'
9+
import '@testing-library/jest-dom'
10+
11+
const localStorageMock = (() => {
12+
let store: Record<string, string> = {}
13+
return {
14+
getItem: jest.fn((key: string) => store[key] || null),
15+
setItem: jest.fn((key: string, value: string) => {
16+
store[key] = value
17+
}),
18+
clear: jest.fn(() => {
19+
store = {}
20+
})
21+
}
22+
})()
23+
24+
Object.defineProperty(window, 'localStorage', {
25+
value: localStorageMock
26+
})
27+
28+
const mockSessions = [
29+
{
30+
id: 'session1',
31+
capabilities: JSON.stringify({
32+
browserName: 'chrome',
33+
browserVersion: '88.0',
34+
platformName: 'windows',
35+
acceptInsecureCerts: true
36+
})
37+
},
38+
{
39+
id: 'session2',
40+
capabilities: JSON.stringify({
41+
browserName: 'firefox',
42+
browserVersion: '78.0',
43+
platformName: 'linux',
44+
acceptSslCerts: false
45+
})
46+
}
47+
]
48+
49+
beforeEach(() => {
50+
localStorageMock.clear()
51+
jest.clearAllMocks()
52+
})
53+
54+
it('renders column selector button', () => {
55+
const onColumnSelectionChange = jest.fn()
56+
render(
57+
<ColumnSelector
58+
sessions={mockSessions}
59+
selectedColumns={[]}
60+
onColumnSelectionChange={onColumnSelectionChange}
61+
/>
62+
)
63+
64+
const button = screen.getByRole('button', { name: /select columns/i })
65+
expect(button).toBeInTheDocument()
66+
67+
expect(screen.getByTestId('ViewColumnIcon')).toBeInTheDocument()
68+
})
69+
70+
it('opens dialog when button is clicked', async () => {
71+
const onColumnSelectionChange = jest.fn()
72+
render(
73+
<ColumnSelector
74+
sessions={mockSessions}
75+
selectedColumns={[]}
76+
onColumnSelectionChange={onColumnSelectionChange}
77+
/>
78+
)
79+
80+
const user = userEvent.setup()
81+
await user.click(screen.getByRole('button', { name: /select columns/i }))
82+
83+
expect(screen.getByText('Select Columns to Display')).toBeInTheDocument()
84+
expect(screen.getByText('Select capability fields to display as additional columns:')).toBeInTheDocument()
85+
})
86+
87+
it('displays available columns from session capabilities', async () => {
88+
const onColumnSelectionChange = jest.fn()
89+
render(
90+
<ColumnSelector
91+
sessions={mockSessions}
92+
selectedColumns={[]}
93+
onColumnSelectionChange={onColumnSelectionChange}
94+
/>
95+
)
96+
97+
const user = userEvent.setup()
98+
await user.click(screen.getByRole('button', { name: /select columns/i }))
99+
100+
expect(screen.getByLabelText('browserName')).toBeInTheDocument()
101+
expect(screen.getByLabelText('browserVersion')).toBeInTheDocument()
102+
expect(screen.getByLabelText('platformName')).toBeInTheDocument()
103+
expect(screen.getByLabelText('acceptInsecureCerts')).toBeInTheDocument()
104+
expect(screen.getByLabelText('acceptSslCerts')).toBeInTheDocument()
105+
})
106+
107+
it('shows selected columns as checked', async () => {
108+
const onColumnSelectionChange = jest.fn()
109+
const selectedColumns = ['browserName', 'platformName']
110+
111+
render(
112+
<ColumnSelector
113+
sessions={mockSessions}
114+
selectedColumns={selectedColumns}
115+
onColumnSelectionChange={onColumnSelectionChange}
116+
/>
117+
)
118+
119+
const user = userEvent.setup()
120+
await user.click(screen.getByRole('button', { name: /select columns/i }))
121+
122+
expect(screen.getByLabelText('browserName')).toBeChecked()
123+
expect(screen.getByLabelText('platformName')).toBeChecked()
124+
125+
expect(screen.getByLabelText('browserVersion')).not.toBeChecked()
126+
expect(screen.getByLabelText('acceptInsecureCerts')).not.toBeChecked()
127+
})
128+
129+
it('toggles column selection when checkbox is clicked', async () => {
130+
const onColumnSelectionChange = jest.fn()
131+
const selectedColumns = ['browserName']
132+
133+
render(
134+
<ColumnSelector
135+
sessions={mockSessions}
136+
selectedColumns={selectedColumns}
137+
onColumnSelectionChange={onColumnSelectionChange}
138+
/>
139+
)
140+
141+
const user = userEvent.setup()
142+
await user.click(screen.getByRole('button', { name: /select columns/i }))
143+
144+
await user.click(screen.getByLabelText('platformName'))
145+
await user.click(screen.getByLabelText('browserName'))
146+
147+
await user.click(screen.getByRole('button', { name: /apply/i }))
148+
149+
expect(onColumnSelectionChange).toHaveBeenCalledWith(['platformName'])
150+
})
151+
152+
it('selects all columns when "Select All" is clicked', async () => {
153+
const onColumnSelectionChange = jest.fn()
154+
155+
render(
156+
<ColumnSelector
157+
sessions={mockSessions}
158+
selectedColumns={[]}
159+
onColumnSelectionChange={onColumnSelectionChange}
160+
/>
161+
)
162+
163+
const user = userEvent.setup()
164+
await user.click(screen.getByRole('button', { name: /select columns/i }))
165+
166+
await user.click(screen.getByLabelText(/select all/i))
167+
168+
await user.click(screen.getByRole('button', { name: /apply/i }))
169+
170+
expect(onColumnSelectionChange).toHaveBeenCalled()
171+
const allColumns = ['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'acceptSslCerts']
172+
expect(onColumnSelectionChange.mock.calls[0][0].sort()).toEqual(allColumns.sort())
173+
})
174+
175+
it('unselects all columns when "Select All" is unchecked', async () => {
176+
const onColumnSelectionChange = jest.fn()
177+
const allColumns = ['browserName', 'browserVersion', 'platformName', 'acceptInsecureCerts', 'acceptSslCerts']
178+
179+
render(
180+
<ColumnSelector
181+
sessions={mockSessions}
182+
selectedColumns={allColumns}
183+
onColumnSelectionChange={onColumnSelectionChange}
184+
/>
185+
)
186+
187+
const user = userEvent.setup()
188+
await user.click(screen.getByRole('button', { name: /select columns/i }))
189+
190+
await user.click(screen.getByLabelText(/select all/i))
191+
192+
await user.click(screen.getByRole('button', { name: /apply/i }))
193+
194+
expect(onColumnSelectionChange).toHaveBeenCalledWith([])
195+
})
196+
197+
it('closes dialog without changes when Cancel is clicked', async () => {
198+
const onColumnSelectionChange = jest.fn()
199+
const selectedColumns = ['browserName']
200+
201+
render(
202+
<ColumnSelector
203+
sessions={mockSessions}
204+
selectedColumns={selectedColumns}
205+
onColumnSelectionChange={onColumnSelectionChange}
206+
/>
207+
)
208+
209+
const user = userEvent.setup()
210+
await user.click(screen.getByRole('button', { name: /select columns/i }))
211+
212+
await user.click(screen.getByLabelText('platformName'))
213+
214+
await user.click(screen.getByRole('button', { name: /cancel/i }))
215+
216+
expect(onColumnSelectionChange).not.toHaveBeenCalled()
217+
})
218+
219+
it('saves capability keys to localStorage', async () => {
220+
render(
221+
<ColumnSelector
222+
sessions={mockSessions}
223+
selectedColumns={[]}
224+
onColumnSelectionChange={jest.fn()}
225+
/>
226+
)
227+
228+
expect(localStorageMock.setItem).toHaveBeenCalledWith(
229+
'selenium-grid-all-capability-keys',
230+
expect.any(String)
231+
)
232+
233+
const savedKeys = JSON.parse(localStorageMock.setItem.mock.calls[0][1])
234+
expect(savedKeys).toContain('browserName')
235+
expect(savedKeys).toContain('browserVersion')
236+
expect(savedKeys).toContain('platformName')
237+
expect(savedKeys).toContain('acceptInsecureCerts')
238+
expect(savedKeys).toContain('acceptSslCerts')
239+
})
240+
241+
it('loads capability keys from localStorage', async () => {
242+
const savedKeys = ['browserName', 'customCapability', 'platformName']
243+
localStorageMock.getItem.mockReturnValueOnce(JSON.stringify(savedKeys))
244+
245+
render(
246+
<ColumnSelector
247+
sessions={[]}
248+
selectedColumns={[]}
249+
onColumnSelectionChange={jest.fn()}
250+
/>
251+
)
252+
253+
const user = userEvent.setup()
254+
await user.click(screen.getByRole('button', { name: /select columns/i }))
255+
256+
expect(screen.getByLabelText('browserName')).toBeInTheDocument()
257+
expect(screen.getByLabelText('customCapability')).toBeInTheDocument()
258+
expect(screen.getByLabelText('platformName')).toBeInTheDocument()
259+
})

0 commit comments

Comments
 (0)