-
Notifications
You must be signed in to change notification settings - Fork 14
/
Checkbox.test.js
130 lines (119 loc) · 5.71 KB
/
Checkbox.test.js
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
121
122
123
124
125
126
127
128
129
130
import React from "react";
import { render, fireEvent } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import DxcCheckbox from "./Checkbox.tsx";
describe("Checkbox component tests", () => {
test("Checkbox renders with correct aria-labelledby and aria-required", () => {
const { getByText, getByRole } = render(<DxcCheckbox label="Checkbox" />);
const labelId = getByText("Checkbox").getAttribute("id");
expect(getByRole("checkbox").getAttribute("aria-labelledby")).toBe(labelId);
expect(getByRole("checkbox").getAttribute("aria-required")).toBe("true");
expect(getByRole("checkbox").getAttribute("aria-readonly")).toBe("false");
expect(getByRole("checkbox").getAttribute("aria-disabled")).toBe("false");
});
test("Optional checkbox renders with correct aria-required", () => {
const { getByRole } = render(<DxcCheckbox label="Checkbox" optional />);
expect(getByRole("checkbox").getAttribute("aria-required")).toBe("false");
});
test("Calls correct function onChange", () => {
const onChange = jest.fn();
const { getByText } = render(<DxcCheckbox label="Checkbox" onChange={onChange} />);
fireEvent.click(getByText("Checkbox"));
expect(onChange).toHaveBeenCalled();
});
test("Read-only checkbox does not trigger onChange function", () => {
const onChange = jest.fn();
const { getByRole } = render(<DxcCheckbox label="Checkbox" onChange={onChange} readOnly />);
const checkbox = getByRole("checkbox");
expect(checkbox.getAttribute("aria-readonly")).toBe("true");
fireEvent.click(checkbox);
expect(onChange).not.toHaveBeenCalled();
});
test("Read-only checkbox sends its value on submit", () => {
const handlerOnSubmit = jest.fn((e) => {
e.preventDefault();
const formData = new FormData(e.target);
const formProps = Object.fromEntries(formData);
expect(formProps).toStrictEqual({ data: "checked" });
});
const { getByText } = render(
<form onSubmit={handlerOnSubmit}>
<DxcCheckbox label="Checkbox" name="data" value="checked" readOnly defaultChecked />
<button type="submit">Submit</button>
</form>
);
const submit = getByText("Submit");
userEvent.click(submit);
expect(handlerOnSubmit).toHaveBeenCalled();
});
test("Read-only checkbox doesn't change its value with Space key", () => {
const onChange = jest.fn();
const { getByRole } = render(<DxcCheckbox label="Checkbox" onChange={onChange} readOnly />);
const checkbox = getByRole("checkbox");
userEvent.tab();
expect(document.activeElement === checkbox).toBeTruthy();
fireEvent.keyDown(checkbox, { key: " ", code: "Space", keyCode: 32, charCode: 32 });
expect(onChange).not.toHaveBeenCalled();
});
test("Uncontrolled checkbox", () => {
const onChange = jest.fn();
const component = render(<DxcCheckbox label="Checkbox" onChange={onChange} name="test" />);
const visibleCheckbox = component.getByText("Checkbox");
const input = component.getByRole("checkbox");
const submitInput = component.container.querySelector(`input[name="test"]`);
expect(input.getAttribute("aria-checked")).toBe("false");
expect(submitInput.checked).toBe(false);
fireEvent.click(visibleCheckbox);
expect(onChange).toHaveBeenCalled();
expect(onChange).toHaveBeenCalledWith(true);
expect(input.getAttribute("aria-checked")).toBe("true");
expect(submitInput.checked).toBe(true);
});
test("Controlled checkbox", () => {
const onChange = jest.fn();
const component = render(<DxcCheckbox label="Checkbox" checked={false} onChange={onChange} name="test" />);
const input = component.getByRole("checkbox");
const visibleCheckbox = component.getByText("Checkbox");
const submitInput = component.container.querySelector(`input[name="test"]`);
fireEvent.click(visibleCheckbox);
expect(onChange).toHaveBeenCalled();
expect(onChange).toHaveBeenCalledWith(true);
expect(input.getAttribute("aria-checked")).toBe("false");
expect(submitInput.checked).toBe(false);
});
test("Renders with correct initial value and initial state when it is uncontrolled", () => {
const { getByRole, container } = render(
<DxcCheckbox label="Default label" defaultChecked value="test-defaultChecked" name="test" />
);
const checkbox = getByRole("checkbox");
const submitInput = container.querySelector(`input[name="test"]`);
expect(submitInput.value).toBe("test-defaultChecked");
expect(checkbox.getAttribute("aria-checked")).toBe("true");
expect(submitInput.checked).toBe(true);
});
test("Test disable keyboard and mouse interactions", () => {
const onChange = jest.fn();
const { getByRole, getByText, container } = render(
<DxcCheckbox label="Checkbox" onChange={onChange} disabled name="test" />
);
const input = getByRole("checkbox");
const visibleCheckbox = getByText("Checkbox");
const submitInput = container.querySelector(`input[name="test"]`);
fireEvent.click(visibleCheckbox);
expect(onChange).toHaveBeenCalledTimes(0);
expect(input.getAttribute("aria-checked")).toBe("false");
expect(input.getAttribute("aria-disabled")).toBe("true");
expect(submitInput.checked).toBe(false);
userEvent.tab();
expect(document.activeElement === input).toBeFalsy();
});
test("Test keyboard interactions", () => {
const onChange = jest.fn();
const { getByRole } = render(<DxcCheckbox label="Checkbox" name="test" onChange={onChange} />);
const checkbox = getByRole("checkbox");
userEvent.tab();
expect(document.activeElement === checkbox).toBeTruthy();
fireEvent.keyDown(checkbox, { key: " ", code: "Space", keyCode: 32, charCode: 32 });
expect(onChange).toHaveBeenCalledWith(true);
});
});