From ad74124206d42a180b18a87f03de86f5afe99809 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 29 Dec 2024 13:44:29 -0800 Subject: [PATCH] test(tag): add unit tests --- tests/App.test.svelte | 6 +++ tests/{ => Tag}/Tag.test.svelte | 17 ++++++- tests/Tag/Tag.test.ts | 85 +++++++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 2 deletions(-) rename tests/{ => Tag}/Tag.test.svelte (75%) create mode 100644 tests/Tag/Tag.test.ts diff --git a/tests/App.test.svelte b/tests/App.test.svelte index 4a7e47c7..0e1066e5 100644 --- a/tests/App.test.svelte +++ b/tests/App.test.svelte @@ -8,6 +8,7 @@ import TreeViewHierarchy from "./TreeView/TreeView.hierarchy.test.svelte"; import RecursiveList from "./RecursiveList/RecursiveList.test.svelte"; import RecursiveListHierarchy from "./RecursiveList/RecursiveList.hierarchy.test.svelte"; + import Tag from "./Tag/Tag.test.svelte"; import { onMount } from "svelte"; const routes = [ @@ -51,6 +52,11 @@ name: "TreeViewHierarchy", component: TreeViewHierarchy, }, + { + path: "/tag", + name: "Tag", + component: Tag, + }, ] as const; let currentPath = window.location.pathname; diff --git a/tests/Tag.test.svelte b/tests/Tag/Tag.test.svelte similarity index 75% rename from tests/Tag.test.svelte rename to tests/Tag/Tag.test.svelte index 4812f5f3..2a5710e1 100644 --- a/tests/Tag.test.svelte +++ b/tests/Tag/Tag.test.svelte @@ -29,10 +29,23 @@ outline -Filterable + { + console.log("click"); + }} + on:close={() => { + console.log("close"); + }}>Filterable Custom icon -Text + { + console.log("click"); + }}>Text diff --git a/tests/Tag/Tag.test.ts b/tests/Tag/Tag.test.ts new file mode 100644 index 00000000..6a2dcce1 --- /dev/null +++ b/tests/Tag/Tag.test.ts @@ -0,0 +1,85 @@ +import { render, screen } from "@testing-library/svelte"; +import { user } from "../setup-tests"; +import Tag from "./Tag.test.svelte"; + +describe("Tag", () => { + afterEach(() => { + vi.clearAllMocks(); + }); + + it("renders all tag variants with correct styles", () => { + render(Tag); + + const basicTag = screen.getByText("IBM Cloud"); + expect(basicTag.parentElement).toHaveClass("my-class"); + expect(basicTag.parentElement).toHaveStyle({ margin: "1rem" }); + + [ + "red", + "magenta", + "purple", + "blue", + "cyan", + "teal", + "green", + "gray", + "cool-gray", + "warm-gray", + "high-contrast", + "outline", + ].forEach((color) => { + const tag = screen.getByText(color); + expect(tag.parentElement).toHaveClass(`bx--tag--${color}`); + }); + }); + + it("renders and handles filterable tag correctly", async () => { + const consoleLog = vi.spyOn(console, "log"); + + render(Tag); + + const filterableTag = screen.getByText("Filterable"); + expect(filterableTag).toHaveClass("bx--tag--filter"); + + const closeButton = filterableTag.querySelector("button")!; + expect(closeButton).toHaveClass("bx--tag__close-icon"); + expect(closeButton).toHaveAttribute("title", "Clear filter"); + + await user.click(closeButton); + expect(consoleLog).toHaveBeenCalledWith("close"); + expect(consoleLog).toHaveBeenCalledWith("click"); + }); + + it("renders custom icon tag correctly", () => { + render(Tag); + + const iconTag = screen.getByText("Custom icon"); + const iconContainer = iconTag.parentElement?.querySelector( + ".bx--tag__custom-icon", + ); + expect(iconContainer).toBeInTheDocument(); + }); + + it("renders interactive tag as a button", () => { + render(Tag); + + const interactiveTag = screen.getByRole("button", { name: "Text" }); + expect(interactiveTag).toHaveClass("bx--tag--interactive"); + }); + + it("renders skeleton state", () => { + render(Tag); + + const skeleton = document.querySelector(".bx--skeleton"); + expect(skeleton).toBeInTheDocument(); + }); + + it("handles click events on interactive tag", async () => { + const consoleLog = vi.spyOn(console, "log"); + render(Tag); + + const interactiveTag = screen.getByRole("button", { name: "Text" }); + await user.click(interactiveTag); + expect(consoleLog).toHaveBeenCalledWith("click"); + }); +});