mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-27 16:26:16 +08:00
9336001746
Create a local backup under ~/.cc-switch/skill-backups/ before removing skill directories. The backup includes all skill files and a meta.json with original skill metadata. Old backups are pruned to keep at most 20. The backup path is returned to the frontend and shown in the success toast. Bump version to 3.12.3.
95 lines
2.3 KiB
TypeScript
95 lines
2.3 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();
|
|
|
|
vi.mock("sonner", () => ({
|
|
toast: {
|
|
success: vi.fn(),
|
|
error: vi.fn(),
|
|
info: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
vi.mock("@/hooks/useSkills", () => ({
|
|
useInstalledSkills: () => ({
|
|
data: [],
|
|
isLoading: false,
|
|
}),
|
|
useToggleSkillApp: () => ({
|
|
mutateAsync: toggleSkillAppMock,
|
|
}),
|
|
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,
|
|
}),
|
|
}));
|
|
|
|
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();
|
|
});
|
|
|
|
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();
|
|
});
|
|
});
|
|
});
|