mirror of
https://github.com/l0ng-ai/openidea.git
synced 2026-11-08 08:52:12 +00:00
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]>
97 lines
4.2 KiB
TypeScript
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");
|
|
});
|
|
});
|