import { TestBed } from '@angular/core/testing'; import { ChatFontService, CHAT_FONT_SIZES, DEFAULT_CHAT_FONT } from './chat-font.service'; import { SessionService } from './session.service'; describe('ChatFontService(会话字号偏好)', () => { let svc: ChatFontService; let session: SessionService; /* * effect() 由 Angular 的变更检测调度,测试里必须手动 flush 才会跑。 * 不 flush 的话读到的永远是初始值(实测:默认 15 时读到的还是 CSS 兜底的 14)。 */ const flush = () => TestBed.flushEffects(); beforeEach(() => { localStorage.clear(); document.documentElement.style.removeProperty('--chat-read-size'); TestBed.configureTestingModule({}); svc = TestBed.inject(ChatFontService); session = TestBed.inject(SessionService); session.setSession('tok', { id: 'u1', name: '测试', companyId: 'c1' } as never); svc.load(); }); afterEach(() => { localStorage.clear(); document.documentElement.style.removeProperty('--chat-read-size'); }); it('未保存过时为默认值', () => { expect(svc.size()).toBe(DEFAULT_CHAT_FONT); }); it('设置后写进 DOM 变量(正文即时生效)', () => { svc.set(17); flush(); expect(document.documentElement.style.getPropertyValue('--chat-read-size')).toBe('17px'); }); it('默认值也会写进 DOM 变量(不依赖 CSS 兜底)', () => { flush(); expect(document.documentElement.style.getPropertyValue('--chat-read-size')).toBe( `${DEFAULT_CHAT_FONT}px`, ); }); it('非法值吸附到最近的合法档位', () => { svc.set(16.4); expect(svc.size()).toBe(16); svc.set(100); expect(svc.size()).toBe(CHAT_FONT_SIZES[CHAT_FONT_SIZES.length - 1]); svc.set(-5); expect(svc.size()).toBe(CHAT_FONT_SIZES[0]); }); it('持久化:重载后保持', () => { svc.set(18); // 模拟刷新 (svc as unknown as { loadedFor: string | null }).loadedFor = null; svc.load(); expect(svc.size()).toBe(18); }); it('按用户隔离', () => { svc.set(18); session.setSession('tok2', { id: 'u2', name: '乙', companyId: 'c1' } as never); (svc as unknown as { loadedFor: string | null }).loadedFor = null; svc.load(); expect(svc.size()).toBe(DEFAULT_CHAT_FONT); }); });