import { render } from "@testing-library/react"; import { UserLockIcon } from "lucide-react"; import { describe, expect, it } from "vitest"; import VisibilityIcon from "@/components/VisibilityIcon"; import { Visibility } from "@/types/proto/api/v1/memo_service_pb"; import { convertVisibilityFromString, convertVisibilityToString, DEFAULT_VISIBILITY_OPTIONS, getAssignableVisibilityOptions, getVisibilityOption, VISIBILITY_OPTIONS, } from "@/utils/memo"; const values = (options: readonly { value: Visibility }[]) => options.map((option) => option.value); describe("Space visibility presentation", () => { it("round-trips the Space audience name", () => { expect(convertVisibilityFromString("SPACE")).toBe(Visibility.SPACE); expect(convertVisibilityToString(Visibility.SPACE)).toBe("SPACE"); }); it("renders a distinct icon per audience", () => { const rendered = VISIBILITY_OPTIONS.map((option) => { const { container } = render(); return container.querySelector("svg")?.innerHTML; }); expect(rendered.every(Boolean)).toBe(true); expect(new Set(rendered).size).toBe(VISIBILITY_OPTIONS.length); }); it("uses user-lock for the Space audience", () => { expect(getVisibilityOption(Visibility.SPACE)?.icon).toBe(UserLockIcon); }); it("renders nothing for an unspecified audience", () => { const { container } = render(); expect(container.querySelector("svg")).toBeNull(); }); }); describe("assignable visibility options", () => { it("withholds the Space audience when the memo has no Space placement", () => { expect(values(getAssignableVisibilityOptions({ hasSpacePlacement: false }))).toEqual([ Visibility.PRIVATE, Visibility.PROTECTED, Visibility.PUBLIC, ]); }); it("offers the Space audience when the memo is placed in a Space", () => { expect(values(getAssignableVisibilityOptions({ hasSpacePlacement: true }))).toEqual([ Visibility.PRIVATE, Visibility.SPACE, Visibility.PROTECTED, Visibility.PUBLIC, ]); }); it("keeps a legacy Space audience on offer when placement is unavailable, so picking cannot silently downgrade it", () => { expect(values(getAssignableVisibilityOptions({ hasSpacePlacement: false, current: Visibility.SPACE }))).toContain(Visibility.SPACE); }); it("never offers the Space audience as a persistent default", () => { expect(values(DEFAULT_VISIBILITY_OPTIONS)).not.toContain(Visibility.SPACE); }); });