feat: complete workspace-first-ui cleanup and tests
- Delete dead repo-workspace code: RepoWorkspacePage, useRepoWorkspace, WorkspaceLayout, FileBrowser, old git components (git-toolbar, file-editor, commit-panel), and repo-workspace.css. - Fix stale backend test imports for moved models/services. - Add GitOperations unit tests. - Add integration tests for workspace files, git, and instances endpoints. - Add frontend tests for WorkspaceDetailPage and ProjectCard. - Update OpenSpec workspace-first-ui tasks and mark change completed. - Regenerate project maps. Quality gates: npm run typecheck, npm run lint, npm test -- --run (87 passed), python3 -m py_compile on changed backend files, pytest backend workspace tests.
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
import "@testing-library/jest-dom/vitest";
|
||||
import { cleanup, fireEvent, render, screen, waitFor } from "@testing-library/react";
|
||||
import { MemoryRouter, Routes, Route } from "react-router-dom";
|
||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
afterEach(() => {
|
||||
cleanup();
|
||||
});
|
||||
|
||||
import { WorkspaceDetailPage } from "./WorkspaceDetailPage";
|
||||
|
||||
const mockWorkspaces = [
|
||||
{
|
||||
id: "ws-1",
|
||||
name: "dev",
|
||||
repo_name: "my-repo",
|
||||
project_name: "My Project",
|
||||
branch: "main",
|
||||
path: "/data/ws/dev",
|
||||
status: "ready",
|
||||
instance_count: 0,
|
||||
},
|
||||
];
|
||||
|
||||
vi.mock("../hooks/use-workspaces", () => ({
|
||||
useWorkspaces: () => ({
|
||||
workspaces: mockWorkspaces,
|
||||
loading: false,
|
||||
error: null,
|
||||
refresh: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("../hooks/use-workspace-files", () => ({
|
||||
useWorkspaceFiles: () => ({
|
||||
entries: [],
|
||||
content: null,
|
||||
currentPath: "",
|
||||
loading: false,
|
||||
error: null,
|
||||
loadFile: vi.fn(),
|
||||
saveFile: vi.fn(),
|
||||
navigateTo: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("../hooks/use-workspace-git", () => ({
|
||||
useWorkspaceGit: () => ({
|
||||
status: {
|
||||
branch: "main",
|
||||
modified: [],
|
||||
added: [],
|
||||
deleted: [],
|
||||
untracked: [],
|
||||
ahead: 0,
|
||||
behind: 0,
|
||||
},
|
||||
history: [],
|
||||
branches: ["main"],
|
||||
currentBranch: "main",
|
||||
loading: false,
|
||||
error: null,
|
||||
commit: vi.fn(),
|
||||
push: vi.fn(),
|
||||
pull: vi.fn(),
|
||||
fetch: vi.fn(),
|
||||
checkout: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("../hooks/use-workspace-instances", () => ({
|
||||
useWorkspaceInstances: () => ({
|
||||
instances: [],
|
||||
loading: false,
|
||||
error: null,
|
||||
refresh: vi.fn(),
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock("../hooks/use-mobile-viewport", () => ({
|
||||
useMobileViewport: () => false,
|
||||
}));
|
||||
|
||||
describe("WorkspaceDetailPage", () => {
|
||||
it("renders workspace header and tabs", async () => {
|
||||
render(
|
||||
<MemoryRouter initialEntries={["/workspaces/ws-1"]}>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/workspaces/:workspaceId"
|
||||
element={<WorkspaceDetailPage />}
|
||||
/>
|
||||
</Routes>
|
||||
</MemoryRouter>,
|
||||
);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByText("dev")).toBeInTheDocument();
|
||||
});
|
||||
expect(screen.getByText(/my-repo/i)).toBeInTheDocument();
|
||||
expect(screen.getByRole("tab", { name: /files/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole("tab", { name: /git/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole("tab", { name: /tools/i })).toBeInTheDocument();
|
||||
expect(screen.getByRole("tab", { name: /settings/i })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it("switches tabs", async () => {
|
||||
render(
|
||||
<MemoryRouter initialEntries={["/workspaces/ws-1"]}>
|
||||
<Routes>
|
||||
<Route
|
||||
path="/workspaces/:workspaceId"
|
||||
element={<WorkspaceDetailPage />}
|
||||
/>
|
||||
</Routes>
|
||||
</MemoryRouter>,
|
||||
);
|
||||
|
||||
await waitFor(() => {
|
||||
expect(screen.getByRole("tab", { name: /settings/i })).toBeInTheDocument();
|
||||
});
|
||||
|
||||
fireEvent.click(screen.getByRole("tab", { name: /settings/i }));
|
||||
expect(screen.getByText(/workspace info/i)).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user