Files
cc-switch/tests/components/UnifiedSkillsPanel.test.tsx
T
Jason c4458cf280 fix: update tests for InstalledSkill new fields and missing hook mocks
- Add content_hash and updated_at fields to 4 InstalledSkill literals in skill_sync.rs
- Add useCheckSkillUpdates and useUpdateSkill to UnifiedSkillsPanel test mock
- Suppress unused import warning in auto_launch.rs test module
2026-04-10 11:08:09 +08:00

121 lines
2.9 KiB
TypeScript

import { createRef } from "react";
import { render, screen, waitFor, act } from "@testing-library/react";
import { describe, expect, it, vi, beforeEach } from "vitest";
import UnifiedSkillsPanel, {
type UnifiedSkillsPanelHandle,
} from "@/components/skills/UnifiedSkillsPanel";
const scanUnmanagedMock = vi.fn();
const toggleSkillAppMock = vi.fn();
const uninstallSkillMock = vi.fn();
const importSkillsMock = vi.fn();
const installFromZipMock = vi.fn();
const deleteSkillBackupMock = vi.fn();
const restoreSkillBackupMock = vi.fn();
vi.mock("sonner", () => ({
toast: {
success: vi.fn(),
error: vi.fn(),
info: vi.fn(),
},
}));
vi.mock("@/hooks/useSkills", () => ({
useInstalledSkills: () => ({
data: [],
isLoading: false,
}),
useSkillBackups: () => ({
data: [],
refetch: vi.fn(),
isFetching: false,
}),
useDeleteSkillBackup: () => ({
mutateAsync: deleteSkillBackupMock,
isPending: false,
}),
useToggleSkillApp: () => ({
mutateAsync: toggleSkillAppMock,
}),
useRestoreSkillBackup: () => ({
mutateAsync: restoreSkillBackupMock,
isPending: false,
}),
useUninstallSkill: () => ({
mutateAsync: uninstallSkillMock,
}),
useScanUnmanagedSkills: () => ({
data: [
{
directory: "shared-skill",
name: "Shared Skill",
description: "Imported from Claude",
foundIn: ["claude"],
path: "/tmp/shared-skill",
},
],
refetch: scanUnmanagedMock,
}),
useImportSkillsFromApps: () => ({
mutateAsync: importSkillsMock,
}),
useInstallSkillsFromZip: () => ({
mutateAsync: installFromZipMock,
}),
useCheckSkillUpdates: () => ({
data: [],
refetch: vi.fn(),
isFetching: false,
}),
useUpdateSkill: () => ({
mutateAsync: vi.fn(),
isPending: false,
}),
}));
describe("UnifiedSkillsPanel", () => {
beforeEach(() => {
scanUnmanagedMock.mockResolvedValue({
data: [
{
directory: "shared-skill",
name: "Shared Skill",
description: "Imported from Claude",
foundIn: ["claude"],
path: "/tmp/shared-skill",
},
],
});
toggleSkillAppMock.mockReset();
uninstallSkillMock.mockReset();
importSkillsMock.mockReset();
installFromZipMock.mockReset();
deleteSkillBackupMock.mockReset();
restoreSkillBackupMock.mockReset();
});
it("opens the import dialog without crashing when app toggles render", async () => {
const ref = createRef<UnifiedSkillsPanelHandle>();
render(
<UnifiedSkillsPanel
ref={ref}
onOpenDiscovery={() => {}}
currentApp="claude"
/>,
);
await act(async () => {
await ref.current?.openImport();
});
await waitFor(() => {
expect(screen.getByText("skills.import")).toBeInTheDocument();
expect(screen.getByText("Shared Skill")).toBeInTheDocument();
expect(screen.getByText("/tmp/shared-skill")).toBeInTheDocument();
});
});
});