Skip to content

Commit 270eefe

Browse files
Merge pull request #3440 from OneCommunityGlobal/Dhrumil-tests-cases-for-TriStateToggleSwitch
Dhrumil-added-test-cases-TriStateToggleSwitch
2 parents 3be1da6 + ab34f43 commit 270eefe

1 file changed

Lines changed: 117 additions & 0 deletions

File tree

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import React from 'react';
2+
import { render, fireEvent } from '@testing-library/react';
3+
import '@testing-library/jest-dom/extend-expect';
4+
import TriStateToggleSwitch from '../ToggleSwitch/TriStateToggleSwitch';
5+
6+
describe('TriStateToggleSwitch Component', () => {
7+
it('initializes state based on pos prop and applies correct background color', () => {
8+
const { container, rerender } = render(<TriStateToggleSwitch pos="posted" />);
9+
const wrapper = container.querySelector('.toggle-switch');
10+
const knob = container.querySelector('.knob');
11+
12+
expect(wrapper).toHaveClass('toggle-switch', 'bg-blue');
13+
expect(knob).toHaveClass('posted');
14+
15+
rerender(<TriStateToggleSwitch pos="default" />);
16+
expect(wrapper).toHaveClass('toggle-switch', 'bg-darkgray');
17+
expect(container.querySelector('.knob')).toHaveClass('default');
18+
19+
20+
rerender(<TriStateToggleSwitch pos="requested" />);
21+
expect(wrapper).toHaveClass('toggle-switch', 'bg-green');
22+
expect(container.querySelector('.knob')).toHaveClass('requested');
23+
});
24+
25+
it('calls onChange and updates state and bgColor on click for all states', () => {
26+
const handleChange = jest.fn();
27+
const { container } = render(<TriStateToggleSwitch pos="default" onChange={handleChange} />);
28+
const wrapper = container.querySelector('.toggle-switch');
29+
const options = container.querySelectorAll('.knob-area div');
30+
31+
32+
fireEvent.click(options[0]);
33+
expect(handleChange).toHaveBeenCalledWith('posted');
34+
expect(wrapper).toHaveClass('bg-blue');
35+
expect(container.querySelector('.knob')).toHaveClass('posted');
36+
37+
38+
handleChange.mockClear();
39+
fireEvent.click(options[1]);
40+
expect(handleChange).toHaveBeenCalledWith('default');
41+
expect(wrapper).toHaveClass('bg-darkgray');
42+
expect(container.querySelector('.knob')).toHaveClass('default');
43+
44+
45+
handleChange.mockClear();
46+
fireEvent.click(options[2]);
47+
expect(handleChange).toHaveBeenCalledWith('requested');
48+
expect(wrapper).toHaveClass('bg-green');
49+
expect(container.querySelector('.knob')).toHaveClass('requested');
50+
});
51+
52+
it('does not throw if onChange is not provided', () => {
53+
const { container } = render(<TriStateToggleSwitch pos="default" />);
54+
const options = container.querySelectorAll('.knob-area div');
55+
56+
expect(() => fireEvent.click(options[0])).not.toThrow();
57+
const wrapper = container.querySelector('.toggle-switch');
58+
expect(wrapper).toHaveClass('bg-blue');
59+
expect(container.querySelector('.knob')).toHaveClass('posted');
60+
});
61+
62+
it('does not call onChange on mount or prop change', () => {
63+
const handleChange = jest.fn();
64+
const { rerender } = render(<TriStateToggleSwitch pos="posted" onChange={handleChange} />);
65+
66+
expect(handleChange).not.toHaveBeenCalled();
67+
68+
69+
rerender(<TriStateToggleSwitch pos="default" onChange={handleChange} />);
70+
expect(handleChange).not.toHaveBeenCalled();
71+
});
72+
73+
it('renders exactly three clickable areas for each state option', () => {
74+
const { container } = render(<TriStateToggleSwitch pos="requested" />);
75+
const options = container.querySelectorAll('.knob-area div');
76+
expect(options.length).toBe(3);
77+
});
78+
79+
it('wrapper always includes the toggle-switch class', () => {
80+
const { container } = render(<TriStateToggleSwitch pos="default" />);
81+
const wrapper = container.querySelector('.toggle-switch');
82+
expect(wrapper).toBeInTheDocument();
83+
});
84+
85+
it('wrapper has exactly two classes (toggle-switch and bg-color) for each state', () => {
86+
const { container, rerender } = render(<TriStateToggleSwitch pos="default" />);
87+
const wrapper = container.querySelector('.toggle-switch');
88+
89+
expect(wrapper.classList.length).toBe(2);
90+
expect(wrapper.classList.contains('toggle-switch')).toBe(true);
91+
expect(wrapper.classList.contains('bg-darkgray')).toBe(true);
92+
93+
94+
rerender(<TriStateToggleSwitch pos="posted" />);
95+
expect(wrapper.classList.length).toBe(2);
96+
expect(wrapper.classList.contains('bg-blue')).toBe(true);
97+
98+
99+
rerender(<TriStateToggleSwitch pos="requested" />);
100+
expect(wrapper.classList.length).toBe(2);
101+
expect(wrapper.classList.contains('bg-green')).toBe(true);
102+
});
103+
104+
it('allows sequential clicking through all states', () => {
105+
const handleChange = jest.fn();
106+
const { container } = render(<TriStateToggleSwitch pos="default" onChange={handleChange} />);
107+
const options = container.querySelectorAll('.knob-area div');
108+
109+
options.forEach((option, idx) => {
110+
fireEvent.click(option);
111+
const expected = ['posted', 'default', 'requested'][idx];
112+
expect(handleChange).toHaveBeenLastCalledWith(expected);
113+
expect(container.querySelector('.knob')).toHaveClass(expected);
114+
});
115+
});
116+
117+
});

0 commit comments

Comments
 (0)