// frontend/tests/Icon.test.tsx import { render } from "@testing-library/react"; import { describe, it, expect, vi } from "vitest"; import { Icon } from "@/components/Icon"; import { PATHS } from "@/components/icons/paths"; describe("Icon", () => { it("모든 글리프가 split된 path 개수만큼 를 그린다", () => { for (const [name, d] of Object.entries(PATHS)) { const { container, unmount } = render(); const expected = d.split("|").length; expect(container.querySelectorAll("path").length).toBe(expected); unmount(); } }); it("stroke-width 기본값 1.9, viewBox 0 0 24 24", () => { const { container } = render(); const svg = container.querySelector("svg")!; expect(svg.getAttribute("stroke-width")).toBe("1.9"); expect(svg.getAttribute("viewBox")).toBe("0 0 24 24"); }); it("알 수 없는 이름은 경고 + 빈 svg 폴백(렌더 깨짐 방지)", () => { const warn = vi.spyOn(console, "warn").mockImplementation(() => {}); // @ts-expect-error 의도적으로 잘못된 이름 전달 const { container } = render(); expect(container.querySelectorAll("path").length).toBe(0); expect(container.querySelector("svg")).toBeTruthy(); expect(warn).toHaveBeenCalled(); warn.mockRestore(); }); it("핵심 글리프 13개(MAIN icon)가 PATHS에 존재한다", () => { [ "grid", "inbox", "spark", "zap", "route", "cal", "check", "mail", "bell", "brain", "send", "heart", "moon", ].forEach((n) => expect(PATHS).toHaveProperty(n)); }); });