import { render, screen } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import { TaskListItem } from "@/components/MemoContent/TaskListItem"; // Regression test for usememos/memos#6143 ("Check all tasks not working"). // // remark-gfm passes `checked: undefined` for unchecked task items (`- [ ]`). // Base UI's Checkbox locks controlled/uncontrolled mode at mount, so a checkbox // that mounts with `checked === undefined` becomes uncontrolled and silently // ignores `checked=true` arriving later — exactly what happens after // "Check all tasks" rewrites the memo content and the markdown re-renders. // TaskListItem must coerce `checked` to a boolean so the checkbox is always // controlled. const mockUpdateMemo = vi.hoisted(() => vi.fn()); vi.mock("@/hooks/useMemoQueries", () => ({ useUpdateMemo: () => ({ mutate: mockUpdateMemo }), })); vi.mock("@/components/MemoView/MemoViewContext", () => ({ useMemoViewContext: () => ({ memo: { name: "memos/1", content: "- [ ] task one", relations: [], attachments: [], reactions: [], }, }), useMemoViewDerived: () => ({ readonly: false, }), })); describe(" check-all regression (#6143)", () => { it("reflects checked=true arriving after mounting unchecked (Check all tasks)", () => { // remark-gfm renders `- [ ]` with `checked` undefined. const { rerender } = render(); const checkbox = screen.getByRole("checkbox"); expect(checkbox).toHaveAttribute("aria-checked", "false"); // "Check all tasks" updates memo content; the markdown re-renders with checked=true. rerender(); expect(checkbox).toHaveAttribute("aria-checked", "true"); }); it("reflects checked reverting to undefined (Uncheck all tasks)", () => { const { rerender } = render(); const checkbox = screen.getByRole("checkbox"); expect(checkbox).toHaveAttribute("aria-checked", "true"); // remark-gfm passes undefined (not false) for `- [ ]` items. rerender(); expect(checkbox).toHaveAttribute("aria-checked", "false"); }); });