import { describe, it, expect, vi } from "vitest"; import { render, screen, fireEvent } from "@testing-library/react"; import { FileEditor } from "./FileEditor"; describe("FileEditor", () => { it("renders textarea with correct class names", () => { render(); const textarea = screen.getByRole("textbox"); expect(textarea.classList.contains("file-editor-container")).toBe(true); expect(textarea.classList.contains("file-editor-textarea")).toBe(true); }); it("renders with content prop value", () => { const content = "const x = 42;"; render(); const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; expect(textarea.value).toBe(content); }); it("calls onChange when text is modified", () => { const onChange = vi.fn(); render(); const textarea = screen.getByRole("textbox"); fireEvent.change(textarea, { target: { value: "new content" } }); expect(onChange).toHaveBeenCalledWith("new content"); }); it("respects readOnly prop", () => { render(); const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; expect(textarea.readOnly).toBe(true); }); it("has correct aria-label based on filePath prop", () => { const filePath = "src/components/App.tsx"; render(); const textarea = screen.getByRole("textbox"); expect(textarea.getAttribute("aria-label")).toBe(`Editor for ${filePath}`); }); it("has default aria-label when filePath is not provided", () => { render(); const textarea = screen.getByRole("textbox"); expect(textarea.getAttribute("aria-label")).toBe("File editor"); }); it("has spellCheck disabled", () => { render(); const textarea = screen.getByRole("textbox"); expect(textarea.getAttribute("spellcheck")).toBe("false"); }); it("is not readOnly by default", () => { render(); const textarea = screen.getByRole("textbox") as HTMLTextAreaElement; expect(textarea.readOnly).toBe(false); }); });