Files
Project_Velocity/app/tests/notification-center.spec.ts
2026-04-12 02:02:58 +05:30

60 lines
1.8 KiB
TypeScript

import { test, expect } from '@playwright/test';
test.beforeEach(async ({ page }) => {
await page.addInitScript(() => {
class FakeWebSocket {
url: string;
readyState = 1;
onopen: ((event: Event) => void) | null = null;
onmessage: ((event: MessageEvent) => void) | null = null;
onclose: (() => void) | null = null;
onerror: (() => void) | null = null;
constructor(url: string) {
this.url = url;
setTimeout(() => {
this.onopen?.(new Event('open'));
if (url.includes('/notifications')) {
this.onmessage?.(
new MessageEvent('message', {
data: JSON.stringify({
type: 'WS_ASSET_OPENED',
data: {
lead_id: 'lead-1',
lead_name: 'Mohammed Al-Rashid',
asset_name: 'PH-01 Deck',
},
}),
}),
);
}
}, 50);
}
send() {}
close() {
this.onclose?.();
}
}
Object.defineProperty(window, 'WebSocket', {
configurable: true,
writable: true,
value: FakeWebSocket,
});
});
});
test('shows unread notification badge and panel content', async ({ page }) => {
await page.goto('/login');
await page.getByText('Tap to authenticate with FaceID').waitFor();
await page.getByRole('button').first().click();
await expect(page.getByText('Project Velocity')).toBeVisible({ timeout: 5000 });
await expect(page.locator('#notification-bell')).toBeVisible();
await expect(page.locator('#notification-bell')).toContainText(/[1-9]/);
await page.locator('#notification-bell').click();
await expect(page.locator('#notification-panel')).toBeVisible();
await expect(page.getByText('Velocity Link Opened').first()).toBeVisible();
});