import { beforeEach, describe, expect, it, vi } from "vitest"; vi.mock("expo-modules-core", () => ({ requireNativeModule: vi.fn() })); vi.mock("expo-notifications", () => ({ setNotificationHandler: vi.fn(), getPresentedNotificationsAsync: vi.fn(async () => []), })); vi.mock("react-native", () => ({ Platform: { OS: "ios" } })); import * as Notifications from "expo-notifications"; import { configureForegroundNotifications, notificationTargetsThread, setOpenNotificationThread, } from "./live-notifications"; beforeEach(() => vi.clearAllMocks()); describe("notification thread targeting", () => { it("matches Expo and native notification keys for the open agent", () => { expect(notificationTargetsThread({ botId: "bot-1" }, { botId: "bot-1" })).toBe(true); expect( notificationTargetsThread( { "rakazo.threadId": "thread-1" }, { botId: "bot-1", threadId: "thread-1" }, ), ).toBe(true); }); it("keeps other agents visible", () => { expect(notificationTargetsThread({ botId: "bot-2" }, { botId: "bot-1" })).toBe(false); expect(notificationTargetsThread({ botId: "bot-1" }, null)).toBe(false); }); it("does not confuse an open DM with a group notification from the same agent", () => { expect( notificationTargetsThread( { botId: "bot-1", threadId: "group-thread" }, { botId: "bot-1", threadId: "dm-thread" }, ), ).toBe(false); }); it("hides only foreground notifications for the open agent", async () => { configureForegroundNotifications(); await setOpenNotificationThread({ botId: "bot-1" }); const handler = vi.mocked(Notifications.setNotificationHandler).mock.calls[0]?.[0]; expect(handler).toBeTruthy(); await expect( handler?.handleNotification({ request: { content: { data: { botId: "bot-1" } } } } as never), ).resolves.toMatchObject({ shouldShowBanner: false, shouldShowList: false }); await expect( handler?.handleNotification({ request: { content: { data: { botId: "bot-2" } } } } as never), ).resolves.toMatchObject({ shouldShowBanner: true, shouldShowList: true }); }); });