import { render, screen } from "@testing-library/react"; import { beforeEach, describe, expect, it, vi } from "vitest"; import Archived from "@/pages/Archived"; import Explore from "@/pages/Explore"; import { Visibility } from "@/types/proto/api/v1/memo_service_pb"; const state = vi.hoisted(() => ({ selectedSpaceName: undefined as string | undefined, memoFilter: undefined as string | undefined, listProps: [] as Array>, memoViewProps: [] as Array>, filterOptions: [] as Array>, })); vi.mock("@/components/MemoView", () => ({ default: (props: Record) => { state.memoViewProps.push(props); return
; }, })); vi.mock("@/components/PagedMemoList", () => ({ default: (props: Record) => { state.listProps.push(props); const renderLeading = props.renderLeading as ((options: { useGrid: boolean }) => React.ReactNode) | undefined; const renderer = props.renderer as | ((memo: { name: string; space: string }, options: { compact: boolean }) => React.ReactNode) | undefined; return (
{renderLeading?.({ useGrid: false })} {renderer?.({ name: "memos/test", space: "spaces/product" }, { compact: false })}
); }, getMemoKey: (memo: { name: string }) => memo.name, })); vi.mock("@/contexts/SpaceContext", () => ({ useSpaceContext: () => ({ selectedSpaceName: state.selectedSpaceName, memoFilter: state.memoFilter }), })); vi.mock("@/hooks", () => ({ useMemoFilters: (options: Record) => { state.filterOptions.push(options); return "filter"; }, useMemoSorting: () => ({ listSort: undefined, orderBy: "create_time desc" }), })); vi.mock("@/hooks/useCurrentUser", () => ({ default: () => ({ name: "users/test" }), })); describe("Memo feed collection scope", () => { beforeEach(() => { state.selectedSpaceName = undefined; state.memoFilter = undefined; state.listProps = []; state.memoViewProps = []; state.filterOptions = []; }); it("uses the All collection without a Space filter for Explore and the user archive", () => { render( <> , ); expect(state.listProps).toHaveLength(2); expect(state.listProps[0]).toMatchObject({ contextFilter: undefined }); expect(state.listProps[1]).not.toHaveProperty("contextFilter"); expect(state.filterOptions[0]).toMatchObject({ visibilities: [Visibility.PUBLIC, Visibility.PROTECTED, Visibility.SPACE], }); expect(state.memoViewProps).toEqual([expect.objectContaining({ showSpace: true }), expect.objectContaining({ showSpace: true })]); expect(screen.getByRole("heading", { level: 1 })).toHaveTextContent("Archived"); }); it("uses the selected Space filter and includes its member audience in Explore", () => { state.selectedSpaceName = "spaces/product"; state.memoFilter = 'space == "spaces/product"'; render(); expect(state.listProps[0]).toMatchObject({ contextFilter: 'space == "spaces/product"' }); expect(state.filterOptions[0]).toMatchObject({ visibilities: [Visibility.PUBLIC, Visibility.PROTECTED, Visibility.SPACE], }); expect(state.memoViewProps[0]).toMatchObject({ showSpace: false }); }); it("keeps Archived independent of a remembered Space", () => { state.selectedSpaceName = "spaces/product"; state.memoFilter = 'space == "spaces/product"'; render(); expect(state.listProps[0]).not.toHaveProperty("contextFilter"); expect(state.memoViewProps[0]).toMatchObject({ showSpace: true }); }); });