import { TestBed } from '@angular/core/testing'; import { AlertService } from './alert.service'; /** * 全局异常提示(2026-11-10 用户裁决)。 * * 核心约束:**不会自动消失**,只能由用户手动关闭。 */ describe('AlertService', () => { let svc: AlertService; beforeEach(() => { TestBed.resetTestingModule(); TestBed.configureTestingModule({ providers: [AlertService] }); svc = TestBed.inject(AlertService); }); it('show 后进入列表', () => { svc.show('请求异常', '细节'); expect(svc.alerts().length).toBe(1); expect(svc.alerts()[0].title).toBe('请求异常'); expect(svc.alerts()[0].detail).toBe('细节'); }); it('🔴 不会自动消失(等一段时间仍在)', async () => { svc.show('请求异常'); await new Promise((r) => setTimeout(r, 300)); expect(svc.alerts().length).toBe(1); }); it('手动 dismiss 才移除', () => { svc.show('请求异常'); const id = svc.alerts()[0].id; svc.dismiss(id); expect(svc.alerts()).toEqual([]); }); it('同一标题不重复弹(避免每秒 tick 刷屏)', () => { svc.show('请求异常'); svc.show('请求异常'); svc.show('请求异常'); expect(svc.alerts().length).toBe(1); }); it('不同标题可以并存', () => { svc.show('A'); svc.show('B'); expect(svc.alerts().length).toBe(2); }); it('clear 清空全部', () => { svc.show('A'); svc.show('B'); svc.clear(); expect(svc.alerts()).toEqual([]); }); }); /* * 状态型提示(2026-11-10 用户反馈:不能只弹一次)。 * * 约束:当前会话只要存在超时,就一直显示;条件消失后自动撤掉; * 用户手动关掉后不马上重弹,但条件重新出现时要能再提示。 */ describe('AlertService · syncState', () => { let svc: AlertService; beforeEach(() => { TestBed.resetTestingModule(); TestBed.configureTestingModule({ providers: [AlertService] }); svc = TestBed.inject(AlertService); }); it('条件成立 → 显示', () => { svc.syncState('容器长时间未响应', true, '1 条超时'); expect(svc.alerts().length).toBe(1); expect(svc.alerts()[0].detail).toBe('1 条超时'); }); it('🔴 条件持续成立 → 一直显示(不会被去重逻辑吞掉)', () => { svc.syncState('容器长时间未响应', true, '1 条超时'); svc.syncState('容器长时间未响应', true, '2 条超时'); expect(svc.alerts().length).toBe(1); expect(svc.alerts()[0].detail).toBe('2 条超时'); // 计数实时更新 }); it('条件消失 → 自动撤掉', () => { svc.syncState('容器长时间未响应', true); svc.syncState('容器长时间未响应', false); expect(svc.alerts()).toEqual([]); }); it('🔴 用户手动关掉后不马上重弹(避免"关不掉")', () => { svc.syncState('容器长时间未响应', true); svc.dismiss(svc.alerts()[0].id); svc.syncState('容器长时间未响应', true); expect(svc.alerts()).toEqual([]); }); it('🔴 条件消失再出现后,重新提示(问题二次发生要能看见)', () => { svc.syncState('容器长时间未响应', true); svc.dismiss(svc.alerts()[0].id); svc.syncState('容器长时间未响应', false); // 问题消失,解除锁定 svc.syncState('容器长时间未响应', true); // 再次超时 expect(svc.alerts().length).toBe(1); }); });