// @vitest-environment happy-dom import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; import { setActiveAccount, setupJazzTestSync } from "jazz-tools/testing"; import { co } from "jazz-tools"; import { cleanup, fireEvent, render, screen, waitFor, } from "@testing-library/react"; import { CoPlainTextView } from "../../viewer/co-plain-text-view"; import { setup } from "goober"; import React from "react"; import { CoID, JsonObject, RawCoPlainText, RawCoValue } from "cojson"; import { createJazzTestAccount } from "jazz-tools/testing"; import { loadCoValueOrFail } from "../../../tools/tests/utils"; describe("CoPlainTextView", async () => { const account = await setupJazzTestSync(); setActiveAccount(account); beforeAll(() => { setup(React.createElement); }); afterEach(() => { cleanup(); }); describe("Edit", () => { it("should show edit button when user has write permissions", async () => { const value = co.plainText().create("Hello", account); const data = value.$jazz.raw.toJSON() as unknown as JsonObject; render( , ); // The edit button contains an Icon (SVG), so we look for buttons containing SVG expect(screen.getByTitle("Edit")).toBeDefined(); }); it("should not show edit button when user does not have write permissions", async () => { // Create a new account without write permissions const readOnlyAccount = await createJazzTestAccount(); const group = co.group().create({ owner: account }); group.addMember(readOnlyAccount, "reader"); const value = co.plainText().create("Hello", group); const valueOnReader = await loadCoValueOrFail( readOnlyAccount.$jazz.localNode, value.$jazz.id as CoID, ); const data = valueOnReader.toJSON() as unknown as JsonObject; render( , ); // Should not have edit button (no buttons with SVG icons) expect(screen.queryByTitle("Edit")).toBeNull(); }); it("should open edit mode when edit button is clicked", async () => { const value = co.plainText().create("Hello, world!", account); const data = value.$jazz.raw.toJSON() as unknown as JsonObject; render( , ); const editButton = screen.getByTitle("Edit"); expect(editButton).toBeDefined(); fireEvent.click(editButton); await waitFor(() => { const textarea = screen.getByRole("textbox"); expect(textarea).toBeDefined(); expect((textarea as HTMLTextAreaElement).value).toBe("Hello, world!"); }); expect(screen.getByText("Cancel")).toBeDefined(); expect(screen.getByText("Save")).toBeDefined(); }); it("should save changes when save button is clicked", async () => { const value = co.plainText().create("Original", account); const data = value.$jazz.raw.toJSON() as unknown as JsonObject; render( , ); const editButton = screen.getByTitle("Edit"); fireEvent.click(editButton); await waitFor(() => { const textarea = screen.getByRole("textbox"); fireEvent.change(textarea, { target: { value: "Updated text" } }); }); const saveButton = screen.getByText("Save"); fireEvent.click(saveButton); }); }); });