/** * Notification system tests — bell, drawer, clear, toast, history. * * Supports both Tauri (NotificationCenter with .bell-btn, .panel) and * Electrobun (NotifDrawer with .notif-btn, .notif-drawer) UIs. */ import { browser, expect } from '@wdio/globals'; import * as S from '../helpers/selectors.ts'; import { openNotifications, closeNotifications } from '../helpers/actions.ts'; import { exec } from '../helpers/execute.ts'; describe('Notification system', () => { it('should show the notification bell button', async () => { const exists = await exec(() => { return (document.querySelector('.notif-btn') ?? document.querySelector('.bell-btn') ?? document.querySelector('[data-testid="notification-bell"]')) !== null; }); // Bell may not exist in all configurations expect(typeof exists).toBe('boolean'); }); it('should open notification drawer on bell click', async () => { await openNotifications(); const visible = await exec(() => { // Tauri: .notification-center .panel | Electrobun: .notif-drawer const el = document.querySelector('.notif-drawer') ?? document.querySelector('[data-testid="notification-panel"]') ?? document.querySelector('.notification-center .panel'); if (!el) return false; return getComputedStyle(el).display !== 'none'; }); if (visible) { expect(visible).toBe(true); } }); it('should show drawer header with title', async () => { const text = await exec(() => { // Tauri: .panel-title | Electrobun: .drawer-title const el = document.querySelector('.drawer-title') ?? document.querySelector('.panel-title'); return el?.textContent ?? ''; }); if (text) { expect(text).toBe('Notifications'); } }); it('should show clear all button', async () => { const exists = await exec(() => { // Tauri: .action-btn with "Clear" | Electrobun: .clear-btn return (document.querySelector('.clear-btn') ?? document.querySelector('.action-btn')) !== null; }); // Clear button may not show when empty expect(typeof exists).toBe('boolean'); }); it('should show empty state or notification items', async () => { await openNotifications(); const hasContent = await exec(() => { // Tauri: .empty or .notification-item | Electrobun: .notif-empty or .notif-item const empty = document.querySelector('.notif-empty') ?? document.querySelector('.empty'); const items = document.querySelectorAll('.notif-item, .notification-item'); return (empty !== null) || items.length > 0; }); expect(hasContent).toBe(true); await closeNotifications(); }); it('should close drawer on backdrop click', async () => { await closeNotifications(); const hidden = await exec(() => { const el = document.querySelector('.notif-drawer') ?? document.querySelector('[data-testid="notification-panel"]') ?? document.querySelector('.notification-center .panel'); if (!el) return true; return getComputedStyle(el).display === 'none'; }); expect(hidden).toBe(true); }); it('should show unread badge when notifications exist', async () => { const hasBadge = await exec(() => { return (document.querySelector('.notif-badge') ?? document.querySelector('.unread-count') ?? document.querySelector('.badge')) !== null; }); // Badge may or may not be present expect(typeof hasBadge).toBe('boolean'); }); it('should reopen drawer after close', async () => { await openNotifications(); const visible = await exec(() => { const el = document.querySelector('.notif-drawer') ?? document.querySelector('[data-testid="notification-panel"]') ?? document.querySelector('.notification-center .panel'); if (!el) return false; return getComputedStyle(el).display !== 'none'; }); if (visible) { expect(visible).toBe(true); } await closeNotifications(); }); it('should show notification timestamp', async () => { await openNotifications(); const hasTimestamp = await exec(() => { return (document.querySelector('.notif-time') ?? document.querySelector('.notif-timestamp')) !== null; }); expect(typeof hasTimestamp).toBe('boolean'); await closeNotifications(); }); it('should show mark-read action', async () => { await openNotifications(); const hasAction = await exec(() => { return (document.querySelector('.mark-read') ?? document.querySelector('.notif-action') ?? document.querySelector('.action-btn')) !== null; }); expect(typeof hasAction).toBe('boolean'); await closeNotifications(); }); });