/// /** * Fixture for `spaceAccess()` in a multi-user run. The shared space's access * list names the first participant's user OWNER, and every other user at the * level one of its participants declares, `WRITE` when none declares one, or * not at all for `"none"`. `readerAgain` is a second session of `reader`'s * user, and holds that user's level. Each participant reads its own level, in * a computed and in a handler. */ import { assert, computed, handler, multiUserTest, pattern, spaceAccess, TESTS, Writable, } from "commonfabric"; export interface AccessSetup { room: Writable<{ title: string }>; } export const setup = pattern, AccessSetup>(() => ({ room: Writable.of({ title: "room" }), })); const record = handler< unknown, { room: Writable<{ title: string }>; seen: Writable } >((_event, { room, seen }) => { seen.set(String(spaceAccess(room))); }); export const owner = pattern<{ setup: AccessSetup }>(({ setup }) => { const seen = Writable.of(""); const level = computed(() => String(spaceAccess(setup.room))); return { [TESTS]: [ { assertion: assert(() => level === "OWNER") }, { action: record({ room: setup.room, seen }), event: {} }, { assertion: assert(() => seen.get() === "OWNER") }, ], }; }); export const writer = pattern<{ setup: AccessSetup }>(({ setup }) => { const seen = Writable.of(""); const level = computed(() => String(spaceAccess(setup.room))); return { [TESTS]: [ { assertion: assert(() => level === "WRITE") }, { action: record({ room: setup.room, seen }), event: {} }, { assertion: assert(() => seen.get() === "WRITE") }, ], }; }); export const reader = pattern<{ setup: AccessSetup }>(({ setup }) => { const seen = Writable.of(""); const level = computed(() => String(spaceAccess(setup.room))); return { [TESTS]: [ { assertion: assert(() => level === "READ") }, { action: record({ room: setup.room, seen }), event: {} }, { assertion: assert(() => seen.get() === "READ") }, ], }; }); export const outsider = pattern<{ setup: AccessSetup }>(({ setup }) => { const seen = Writable.of(""); const level = computed(() => String(spaceAccess(setup.room))); return { [TESTS]: [ { assertion: assert(() => level === "none") }, { action: record({ room: setup.room, seen }), event: {} }, { assertion: assert(() => seen.get() === "none") }, ], }; }); export const defaulted = pattern<{ setup: AccessSetup }>(({ setup }) => { const seen = Writable.of(""); const level = computed(() => String(spaceAccess(setup.room))); return { [TESTS]: [ { assertion: assert(() => level === "WRITE") }, { action: record({ room: setup.room, seen }), event: {} }, { assertion: assert(() => seen.get() === "WRITE") }, ], }; }); export default multiUserTest({ setup, participants: { owner, writer: { pattern: writer, access: "WRITE" }, reader: { pattern: reader, access: "READ" }, readerAgain: { pattern: reader, user: "reader" }, outsider: { pattern: outsider, access: "none" }, defaulted, }, });