Files
boilerplate/apps/frontend/src/app/layout/notification-panel.spec.ts
Bastian Wagner c03b2e17f5 bump
2026-07-16 15:23:53 +02:00

80 lines
2.4 KiB
TypeScript

import { TestBed } from '@angular/core/testing';
import { provideRouter } from '@angular/router';
import { signal } from '@angular/core';
import type { NotificationDto } from '@boilerplate/api-client';
import { NotificationStore } from '../core/notification.store';
import { NotificationPanelComponent } from './notification-panel';
const notification: NotificationDto = {
id: 'n1',
type: 'system',
title: 'Titel',
message: 'Nachricht',
link: '/',
metadata: null,
read: false,
readAt: null,
createdAt: '2026-07-16T08:00:00.000Z',
};
describe('NotificationPanelComponent', () => {
it('shows unread notifications and emits close', async () => {
const closed = vi.fn();
await TestBed.configureTestingModule({
imports: [NotificationPanelComponent],
providers: [
provideRouter([]),
{
provide: NotificationStore,
useValue: {
notifications: signal([notification]),
loading: signal(false),
error: signal(null),
markAllAsRead: vi.fn(),
markAsRead: vi.fn(),
markAsUnread: vi.fn(),
delete: vi.fn(),
isInternalLink: () => true,
},
},
],
}).compileComponents();
const fixture = TestBed.createComponent(NotificationPanelComponent);
fixture.componentInstance.closed.subscribe(closed);
fixture.detectChanges();
const element = fixture.nativeElement as HTMLElement;
expect(element.querySelector('article.unread')).not.toBeNull();
element.querySelector<HTMLButtonElement>('header button')?.click();
expect(closed).toHaveBeenCalledOnce();
});
it('renders empty and error states', async () => {
await TestBed.configureTestingModule({
imports: [NotificationPanelComponent],
providers: [
provideRouter([]),
{
provide: NotificationStore,
useValue: {
notifications: signal([]),
loading: signal(false),
error: signal({
message: 'Fehler',
requestId: 'req-1',
status: 500,
code: 'INTERNAL_ERROR',
}),
markAllAsRead: vi.fn(),
isInternalLink: () => false,
},
},
],
}).compileComponents();
const fixture = TestBed.createComponent(NotificationPanelComponent);
fixture.detectChanges();
expect((fixture.nativeElement as HTMLElement).textContent).toContain('req-1');
});
});