From 94b4e30e26b5b4b9c93b9fe6463fd069694fb135 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sat, 16 Aug 2025 11:25:57 -0700 Subject: [PATCH] test(toggle): add more tests (#2185) --- tests/Toggle/Toggle.test.svelte | 12 ++++ tests/Toggle/Toggle.test.ts | 120 +++++++++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 1 deletion(-) diff --git a/tests/Toggle/Toggle.test.svelte b/tests/Toggle/Toggle.test.svelte index 5e3b4b1b..ad178d84 100644 --- a/tests/Toggle/Toggle.test.svelte +++ b/tests/Toggle/Toggle.test.svelte @@ -2,6 +2,7 @@ import { Toggle } from "carbon-components-svelte"; let toggled = false; + let initialToggled = true; + + { + console.log("initial toggled:", e.detail.toggled); + }} +/> + + diff --git a/tests/Toggle/Toggle.test.ts b/tests/Toggle/Toggle.test.ts index ec739ccc..bb5405e1 100644 --- a/tests/Toggle/Toggle.test.ts +++ b/tests/Toggle/Toggle.test.ts @@ -63,7 +63,7 @@ describe("Toggle", () => { } }); - it("handles keyboard interactions", async () => { + it("handles keyboard interactions (Space)", async () => { const consoleLog = vi.spyOn(console, "log"); render(Toggle); @@ -78,4 +78,122 @@ describe("Toggle", () => { expect(toggle).not.toBeChecked(); expect(consoleLog).toHaveBeenCalledWith("toggled:", false); }); + + it("handles keyboard interactions (Enter)", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Default toggle"); + toggle.focus(); + + await user.keyboard("{Enter}"); + expect(toggle).toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", true); + + await user.keyboard("{Enter}"); + expect(toggle).not.toBeChecked(); + expect(consoleLog).toHaveBeenCalledWith("toggled:", false); + }); + + it("ignores other key presses", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Default toggle"); + toggle.focus(); + + await user.keyboard("a"); + expect(toggle).not.toBeChecked(); + expect(consoleLog).not.toHaveBeenCalled(); + + await user.keyboard("Tab"); + expect(toggle).not.toBeChecked(); + expect(consoleLog).not.toHaveBeenCalled(); + }); + + it("supports custom name attribute", () => { + render(Toggle); + + const toggle = getToggle("Custom name toggle"); + expect(toggle).toHaveAttribute("name", "custom-name-toggle"); + }); + + it("prevents default on space and enter keys", async () => { + render(Toggle); + + const toggle = getToggle("Default toggle"); + toggle.focus(); + + const spaceEvent = new KeyboardEvent("keyup", { key: " " }); + const enterEvent = new KeyboardEvent("keyup", { key: "Enter" }); + + const spacePreventDefault = vi.spyOn(spaceEvent, "preventDefault"); + const enterPreventDefault = vi.spyOn(enterEvent, "preventDefault"); + + toggle.dispatchEvent(spaceEvent); + toggle.dispatchEvent(enterEvent); + + expect(spacePreventDefault).toHaveBeenCalled(); + expect(enterPreventDefault).toHaveBeenCalled(); + }); + + it("handles disabled state interactions", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Disabled toggle"); + expect(toggle).toBeDisabled(); + + await user.click(toggle); + expect(toggle).not.toBeChecked(); + expect(consoleLog).not.toHaveBeenCalled(); + + toggle.focus(); + await user.keyboard(" "); + expect(toggle).not.toBeChecked(); + expect(consoleLog).not.toHaveBeenCalled(); + }); + + it("supports initial toggled state", () => { + render(Toggle); + + const defaultToggle = getToggle("Default toggle"); + expect(defaultToggle).not.toBeChecked(); + + const initialToggle = getToggle("Initial toggled state"); + expect(initialToggle).toBeChecked(); + }); + + it("handles rapid clicking", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Toggle); + + const toggle = getToggle("Default toggle"); + + await user.click(toggle); + await user.click(toggle); + await user.click(toggle); + + expect(toggle).toBeChecked(); + expect(consoleLog).toHaveBeenCalledTimes(3); + }); + + it("visually hides label when hideLabel is true", () => { + render(Toggle); + + const label = screen.getByText("Hidden label toggle"); + expect(label).toHaveClass("bx--visually-hidden"); + }); + + it("handles aria-label fallback correctly", () => { + render(Toggle); + + // Test toggle without labelText but with aria-label. + const toggle = getToggle("Hidden label toggle"); + expect(toggle).toHaveAccessibleName("Hidden label toggle"); + + // Test toggle without labelText and without aria-label (should fallback to "Toggle"). + const defaultToggle = getToggle("Default toggle"); + expect(defaultToggle).toHaveAccessibleName("Default toggle"); + }); });