/* * Copyright 2026 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial * Please see LICENSE files in the repository root for full details. */ import { NotificationBadgeViewModel } from "../../../../src/viewmodels/room/notification-badge/NotificationBadgeViewModel"; import { NotificationLevel } from "../../../../src/stores/notifications/NotificationLevel"; describe("NotificationBadgeViewModel", () => { it("computes an activity dot snapshot", () => { const vm = new NotificationBadgeViewModel({ symbol: null, count: 0, level: NotificationLevel.Activity, }); expect(vm.getSnapshot()).toMatchObject({ shouldRender: true, isVisible: true, symbol: null, isNotification: false, isHighlight: false, isKnocked: false, badgeType: "dot", isClickable: false, }); }); it("hides activity dots when hideIfDot changes and skips unchanged setters", () => { const vm = new NotificationBadgeViewModel({ symbol: null, count: 0, level: NotificationLevel.Activity, }); const listener = jest.fn(); vm.subscribe(listener); vm.setHideIfDot(false); expect(listener).not.toHaveBeenCalled(); vm.setHideIfDot(true); expect(listener).toHaveBeenCalledTimes(1); expect(vm.getSnapshot().shouldRender).toBe(false); vm.setHideIfDot(true); expect(listener).toHaveBeenCalledTimes(1); }); it("formats counts and maps highlight levels", () => { const vm = new NotificationBadgeViewModel({ symbol: null, count: 3, level: NotificationLevel.Notification, }); vm.setNotificationData({ symbol: null, count: 4, level: NotificationLevel.Unsent, }); expect(vm.getSnapshot()).toMatchObject({ shouldRender: true, isVisible: true, symbol: "4", isHighlight: true, badgeType: "badge_2char", }); }); it("hides activity badges when hide bold is enabled", () => { const vm = new NotificationBadgeViewModel({ symbol: "", count: 1, level: NotificationLevel.Activity, }); vm.setHideBold(true); expect(vm.getSnapshot().shouldRender).toBe(false); }); it("updates clickable options without emitting for unchanged values", () => { const onClick = jest.fn(); const vm = new NotificationBadgeViewModel({ symbol: "!", count: 0, level: NotificationLevel.Highlight, onClick, ariaLabel: "Jump to unread", tabIndex: 0, }); const listener = jest.fn(); vm.subscribe(listener); vm.setClickOptions({ onClick, ariaLabel: "Jump to unread", tabIndex: 0, }); expect(listener).not.toHaveBeenCalled(); vm.setClickOptions({ onClick, ariaLabel: "Jump to first unread room", tabIndex: 0, }); expect(listener).toHaveBeenCalledTimes(1); expect(vm.getSnapshot()).toMatchObject({ isClickable: true, ariaLabel: "Jump to first unread room", tabIndex: 0, }); }); });