刘光辉
4 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// @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);
  });
});