// @vitest-environment happy-dom
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { applyFavicon, EMPTY_FAVICON, normalizeBrandPath, resolveBrandAssetUrl } from '../systemBrand';
|
|
class MockImage {
|
get src() {
|
return '';
|
}
|
|
set src(value: string) {
|
queueMicrotask(() => this.listeners.get(value.includes('broken') ? 'error' : 'load')?.());
|
}
|
|
private listeners = new Map<string, () => void>();
|
|
addEventListener(type: string, listener: () => void) {
|
this.listeners.set(type, listener);
|
}
|
}
|
|
describe('systemBrand', () => {
|
beforeEach(() => {
|
document.head.innerHTML = '<link rel="icon" href="data:,">';
|
vi.stubGlobal('Image', MockImage);
|
});
|
|
it('normalizes empty and invalid persisted values', () => {
|
expect(normalizeBrandPath()).toBe('');
|
expect(normalizeBrandPath(' ')).toBe('');
|
expect(normalizeBrandPath('null')).toBe('');
|
expect(normalizeBrandPath(' Undefined ')).toBe('');
|
expect(normalizeBrandPath(' /file/logo.png ')).toBe('/file/logo.png');
|
});
|
|
it('resolves relative paths without changing absolute resources', () => {
|
expect(resolveBrandAssetUrl('/file/logo.png', '/dev/')).toBe('/dev/file/logo.png');
|
expect(resolveBrandAssetUrl('file/logo.png', '/dev')).toBe('/dev/file/logo.png');
|
expect(resolveBrandAssetUrl('https://cdn.example.com/logo.png', '/dev')).toBe('https://cdn.example.com/logo.png');
|
expect(resolveBrandAssetUrl('data:image/png;base64,abc', '/dev')).toBe('data:image/png;base64,abc');
|
});
|
|
it('uses the configured favicon after it loads', async () => {
|
await applyFavicon('/dev/file/favicon.png');
|
|
expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe('/dev/file/favicon.png');
|
});
|
|
it('clears the favicon for empty or failed resources', async () => {
|
await applyFavicon('');
|
expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe(EMPTY_FAVICON);
|
|
await applyFavicon('/broken/favicon.png');
|
expect(document.querySelector<HTMLLinkElement>('link[rel="icon"]')?.getAttribute('href')).toBe(EMPTY_FAVICON);
|
});
|
});
|