Skip to content

Commit 7483e83

Browse files
authored
Merge pull request #476 from bcgov/feature/component-unit-tests
Unit tests for Header, Footer, Form, InlineAlert, Switch
2 parents f95e5ce + c43e32c commit 7483e83

File tree

9 files changed

+125
-8
lines changed

9 files changed

+125
-8
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import "@testing-library/jest-dom";
2+
import { render, screen } from "@testing-library/react";
3+
4+
import Footer from "./Footer";
5+
6+
describe("Footer", () => {
7+
render(<Footer />);
8+
9+
// https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/contentinfo_role
10+
const contentInfoElements = screen.getAllByRole("contentinfo");
11+
12+
it("renders an HTML footer component", () => {
13+
expect(contentInfoElements).toHaveLength(1);
14+
expect(contentInfoElements[0].tagName).toBe("FOOTER");
15+
});
16+
});

packages/react-components/src/components/Footer/Footer.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import React from "react";
2-
31
import SvgBcLogo from "../Icons/SvgBcLogo";
42

53
import "./Footer.css";
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import "@testing-library/jest-dom";
2+
import { render, screen } from "@testing-library/react";
3+
4+
import Form from "./Form";
5+
6+
describe("Form", () => {
7+
render(<Form data-testid="form-element" />);
8+
9+
const form = screen.getByTestId("form-element");
10+
11+
it("renders an HTML form component", () => {
12+
expect(form.tagName).toBe("FORM");
13+
});
14+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import "@testing-library/jest-dom";
2+
import { render, screen } from "@testing-library/react";
3+
4+
import Header from "./Header";
5+
6+
describe("Header", () => {
7+
render(<Header />);
8+
9+
// https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/banner_role
10+
const bannerElements = screen.getAllByRole("banner");
11+
12+
it("renders an HTML header component", () => {
13+
expect(bannerElements).toHaveLength(1);
14+
expect(bannerElements[0].tagName).toBe("HEADER");
15+
});
16+
});

packages/react-components/src/components/Header/Header.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from "react";
1+
import { cloneElement, PropsWithChildren } from "react";
22

33
import SvgBcLogo from "../Icons/SvgBcLogo";
44

@@ -38,7 +38,7 @@ export default function Header({
3838
skipLinks,
3939
title = "",
4040
titleElement = "span",
41-
}: React.PropsWithChildren<HeaderProps>) {
41+
}: PropsWithChildren<HeaderProps>) {
4242
function getLogo() {
4343
if (!logoLinkElement)
4444
return (
@@ -47,7 +47,7 @@ export default function Header({
4747
</a>
4848
);
4949

50-
return React.cloneElement(logoLinkElement, { children: logoImage });
50+
return cloneElement(logoLinkElement, { children: logoImage });
5151
}
5252

5353
function getTitle() {
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import "@testing-library/jest-dom";
2+
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
3+
4+
import InlineAlert from "./InlineAlert";
5+
6+
afterEach(() => {
7+
cleanup();
8+
});
9+
10+
describe("InlineAlert", () => {
11+
it("renders a div with role='note'", () => {
12+
render(<InlineAlert variant="info" data-testid="info" />);
13+
render(<InlineAlert variant="danger" data-testid="danger" />);
14+
render(<InlineAlert variant="success" data-testid="success" />);
15+
render(<InlineAlert variant="warning" data-testid="warning" />);
16+
17+
const alertElements = screen.getAllByRole("note");
18+
19+
expect(alertElements).toHaveLength(4);
20+
expect(alertElements[0].tagName).toBe("DIV");
21+
});
22+
23+
it("isCloseable prop causes a close button to be rendered", () => {
24+
const handleClose = jest.fn();
25+
render(
26+
<InlineAlert isCloseable onClose={handleClose} data-test-id="closeable" />
27+
);
28+
29+
const closeButtons = screen.getAllByRole("button");
30+
31+
expect(closeButtons[0]).toHaveAccessibleName(/close this alert/i);
32+
33+
fireEvent.click(closeButtons[0]);
34+
35+
expect(handleClose).toHaveBeenCalledTimes(1);
36+
});
37+
});

packages/react-components/src/components/InlineAlert/InlineAlert.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import React from "react";
2-
31
import Button from "../Button";
42
import ButtonGroup from "../ButtonGroup";
53
import SvgCheckCircleIcon from "../Icons/SvgCheckCircleIcon";

packages/react-components/src/components/Select/Select.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import React from "react";
21
import {
32
Button,
43
Collection,
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import "@testing-library/jest-dom";
2+
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
3+
4+
import Switch from "./Switch";
5+
6+
afterEach(() => {
7+
cleanup();
8+
});
9+
10+
describe("Switch", () => {
11+
it("renders an HTML input component", () => {
12+
render(<Switch>Flip me</Switch>);
13+
14+
const switchElements = screen.getAllByLabelText(/flip me/i);
15+
16+
expect(switchElements).toHaveLength(1);
17+
expect(switchElements[0].tagName).toBe("INPUT");
18+
expect(switchElements[0]).toHaveAccessibleName(/flip me/i);
19+
});
20+
21+
it("onChange handler fires on click", () => {
22+
const handleChange = jest.fn();
23+
render(<Switch onChange={handleChange}>Power</Switch>);
24+
25+
const switchElement = screen.getByLabelText(/power/i);
26+
27+
fireEvent.click(switchElement);
28+
29+
expect(handleChange).toHaveBeenCalled();
30+
});
31+
32+
it("defaultSelected adds checked attribute", () => {
33+
render(<Switch defaultSelected>Standby</Switch>);
34+
35+
const switchElement = screen.getByLabelText(/standby/i);
36+
37+
expect(switchElement).toHaveAttribute("checked");
38+
});
39+
});

0 commit comments

Comments
 (0)