// @vitest-environment node
import { describe, expect, it, vi } from "vitest";
import { renderToStaticMarkup } from "react-dom/server";
import { SkillCard } from "./SkillCard";
import type { SkillListItem } from "../api/skillRegistry";
// Stub @/lib/router Link as an tag for SSR
vi.mock("@/lib/router", () => ({
Link: ({ to, children, ...props }: { to: string; children: React.ReactNode; [key: string]: unknown }) =>
{children},
}));
const mockSkill: SkillListItem = {
id: "test-source/test-skill",
name: "Test Skill",
description: "A test skill for unit testing",
sourceId: "test-source",
category: "testing",
activeVersionId: null,
removedAt: null,
averageRating: 4.2,
ratingCount: 10,
taskCount: null,
avgCostUsd: null,
lastUsedAt: null,
};
describe("SkillCard", () => {
it("renders skill name as a link", () => {
const html = renderToStaticMarkup();
expect(html).toContain("Test Skill");
expect(html).toContain("skills/detail/");
});
it("renders source badge", () => {
const html = renderToStaticMarkup();
expect(html).toContain("test-source");
});
it("renders star rating when averageRating is non-null", () => {
const html = renderToStaticMarkup();
expect(html).toContain("4.2");
});
it("shows Install skill button when not installed", () => {
const html = renderToStaticMarkup(
{}} />,
);
expect(html).toContain("Install skill");
});
it("shows Update skill button when installed with update", () => {
const html = renderToStaticMarkup(
{}} />,
);
expect(html).toContain("Update skill");
});
it("shows update badge when hasUpdate is true", () => {
const html = renderToStaticMarkup(
{}} />,
);
expect(html).toContain("Update");
expect(html).toContain("amber");
});
it("shows check icon when installed without update", () => {
const html = renderToStaticMarkup(
,
);
expect(html).toContain("Installed");
});
it("shows loading state on install button", () => {
const html = renderToStaticMarkup(
{}} isLoading />,
);
expect(html).toContain("Installing");
});
});