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");
+ });
+});