Skip to content

Commit 377a6e0

Browse files
committed
test theme switcher
1 parent b94c16f commit 377a6e0

File tree

1 file changed

+68
-5
lines changed

1 file changed

+68
-5
lines changed
Lines changed: 68 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,75 @@
1-
import { cleanup, render, screen } from "@testing-library/react";
2-
import { afterEach, describe, test } from "vitest";
1+
import { act, cleanup, fireEvent, render, renderHook } from "@testing-library/react";
2+
import { afterEach, beforeEach, describe, test } from "vitest";
3+
import { useTheme } from "../../hooks/use-theme";
4+
import { DEFAULT_ID } from "../../constants";
35
import { ThemeSwitcher } from "./theme-switcher";
46

5-
describe.concurrent("theme-switcher", () => {
7+
describe("theme-switcher", () => {
68
afterEach(cleanup);
79

8-
test("check if h1 heading exists", ({ expect }) => {
10+
beforeEach(() => {
911
render(<ThemeSwitcher />);
10-
expect(screen.getByTestId("theme-switcher-h1").textContent).toBe("theme-switcher");
12+
});
13+
14+
test("Test changing color scheme preference", ({ expect }) => {
15+
const { result } = renderHook(() => useTheme());
16+
act(() => {
17+
result.current.setColorSchemePreference("light");
18+
});
19+
expect(result.current.colorSchemePreference).toBe("light");
20+
});
21+
22+
test("Test changing theme", ({ expect }) => {
23+
const { result } = renderHook(() => useTheme());
24+
const MY_THEME = "my-theme";
25+
act(() => {
26+
result.current.setTheme(MY_THEME);
27+
});
28+
expect(result.current.theme).toBe(MY_THEME);
29+
});
30+
31+
test("test storing state to localStorage", async ({ expect }) => {
32+
const { result } = renderHook(() => useTheme());
33+
const MY_THEME = "my-theme-to-store";
34+
await new Promise(resolve => {
35+
setTimeout(resolve, 310);
36+
});
37+
act(() => {
38+
result.current.setTheme(MY_THEME);
39+
});
40+
expect(localStorage.getItem(DEFAULT_ID)).toContain(MY_THEME);
41+
});
42+
43+
test("Storage event", async ({ expect }) => {
44+
const hook = renderHook(() => useTheme());
45+
const MY_THEME = "my-theme-update";
46+
await act(() =>
47+
fireEvent(window, new StorageEvent("storage", { key: DEFAULT_ID, newValue: `${MY_THEME},system` })),
48+
);
49+
expect(hook.result.current.theme).toBe(MY_THEME);
50+
});
51+
52+
test.todo("test media change event -- not supported by fireEvent");
53+
});
54+
55+
describe("test theme-switcher with props", () => {
56+
afterEach(cleanup);
57+
58+
test("test dontSync", async ({ expect }) => {
59+
localStorage.setItem(DEFAULT_ID, "");
60+
render(<ThemeSwitcher dontSync />);
61+
const { result } = renderHook(() => useTheme());
62+
const MY_THEME = "my-theme-to-store";
63+
await new Promise(resolve => {
64+
setTimeout(resolve, 310);
65+
});
66+
act(() => {
67+
result.current.setTheme(MY_THEME);
68+
});
69+
expect(localStorage.getItem(DEFAULT_ID)).not.toContain(MY_THEME);
70+
});
71+
72+
test.todo("test invalid targetId", ({ expect }) => {
73+
expect(render(<ThemeSwitcher targetId="" />)).toThrow("id can not be an empty string");
1174
});
1275
});

0 commit comments

Comments
 (0)