Files
openidea/src/workbench/lightEdit.test.tsx
Shohruh Ismoilovandshohruh-genius 9f2e6b570f feat(vcs): correct Git log graph projection and expand history views (#1076)
Git Log could lose commits when filtering by several paths, draw wrong
ancestry after filtering or collapsing rows, and open the wrong
repository in multi-root views. The graph is now projected over the full
commit DAG and laid out in Bek order, so filtered and collapsed views keep
the real ancestry; each log view keeps its own filters and requests.

Commit metadata, messages and path changes are kept in a persistent index
(by object id, in the IDE's cache directory) with seekable paging, and the
log gains parent-aware merge comparisons, a lazy revision browser,
read-only logs of repositories outside the project (opened with command
execution disabled), commit bookmarks, configurable built-in columns and
batched commit details. The adapted IntelliJ algorithms are attributed in
THIRD_PARTY_LICENSES.md.

Closes #872

Co-authored-by: shohruh-genius <[email protected]>
2026-11-05 02:31:32 +08:00

97 lines
4.2 KiB
TypeScript

import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { render, screen } from "@testing-library/react";
import { useEditorRegistry } from "@/editor/api";
import { evaluateWhen } from "@/platform/context";
import { useProject } from "@/platform/project";
import { activateWorkbench } from "./activate";
import { registerStatusItem, registerTitleItem, registerToolWindow, useStandaloneEditor } from "./contributions";
import { EmptyEditor } from "./EditorArea";
import { chooseProjectWindow } from "./projectWindow";
import { Workbench } from "./Workbench";
/** A LightEdit window (loose files, no project) with project features registered as in a full window. */
describe("LightEdit window", () => {
const disposers: Array<() => void> = [];
beforeEach(() => {
useProject.setState({ project: null, lightEdit: true, settings: null });
useEditorRegistry.setState({ active: { ctx: { path: "/x/notes/todo.md" } } } as never);
disposers.push(
registerToolWindow({
id: "project",
title: "Project",
icon: "folder",
anchor: "left",
order: 0,
component: () => <div>project tree</div>,
}),
registerTitleItem({ id: "vcs.branch", align: "left", priority: 0, component: () => <span>branch widget</span> }),
registerStatusItem({ id: "vcs.status", align: "right", priority: 1, component: () => <span>git status</span> }),
registerStatusItem({
id: "editor.caret",
align: "right",
priority: 2,
component: () => <span>1:1</span>,
lightEdit: true,
}),
);
});
afterEach(() => {
useStandaloneEditor.setState({ title: null });
disposers.splice(0).forEach((d) => d());
useProject.setState({ project: null, lightEdit: false });
useEditorRegistry.setState({ active: null });
});
it("shows the editor with the file name as title, without project features", () => {
render(<Workbench />);
expect(document.querySelector("[data-light-edit]")).not.toBeNull();
expect(screen.getByText("todo.md")).toBeInTheDocument();
expect(document.querySelector("[data-stripe-side]")).toBeNull();
expect(screen.queryByText("branch widget")).toBeNull();
const items = [...document.querySelectorAll("[data-status-item]")].map((el) => el.getAttribute("data-status-item"));
expect(items).toEqual(["editor.caret"]);
expect(screen.queryByText("Welcome to OpenIDEA")).toBeNull();
});
it("keeps a standalone log visible without a project or LightEdit session", () => {
useProject.setState({ lightEdit: false });
useStandaloneEditor.setState({ title: "External Git Log" });
render(<Workbench />);
expect(screen.getByText("External Git Log")).toBeInTheDocument();
expect(document.querySelector("[data-editor-area]")).not.toBeNull();
expect(screen.queryByText("Welcome to OpenIDEA")).toBeNull();
expect(document.querySelector("[data-stripe-side]")).toBeNull();
});
it("hints only at opening files in an empty editor", () => {
render(<EmptyEditor />);
expect(screen.getByText("Open File")).toBeInTheDocument();
expect(screen.getByText("Drop files here to open them")).toBeInTheDocument();
for (const project of ["Search Everywhere", "Go to File", "Recent Files", "Navigation Bar"])
expect(screen.queryByText(project)).toBeNull();
});
it("keeps the navigation hints in a project window", () => {
useProject.setState({ lightEdit: false });
render(<EmptyEditor />);
expect(screen.getByText("Go to File")).toBeInTheDocument();
expect(screen.queryByText("Open File")).toBeNull();
});
it("sets the context keys that keep project actions off", () => {
const dispose = activateWorkbench();
expect(evaluateWhen("lightEdit")).toBe(true);
expect(evaluateWhen("projectOpen")).toBe(false);
useProject.setState({ lightEdit: false });
expect(evaluateWhen("lightEdit")).toBe(false);
dispose();
});
it("applies 'Open project in' when opening a project from it", async () => {
useProject.setState({ settings: { general: { openProjectIn: "new" } } } as never);
expect(await chooseProjectWindow("notes")).toBe("new");
useProject.setState({ lightEdit: false });
expect(await chooseProjectWindow("notes")).toBe("same");
});
});