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: () =>
project tree
, }), registerTitleItem({ id: "vcs.branch", align: "left", priority: 0, component: () => branch widget }), registerStatusItem({ id: "vcs.status", align: "right", priority: 1, component: () => git status }), registerStatusItem({ id: "editor.caret", align: "right", priority: 2, component: () => 1:1, 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(); 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(); 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(); 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(); 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"); }); });