alert.service.spec.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { TestBed } from '@angular/core/testing';
  2. import { AlertService } from './alert.service';
  3. /**
  4. * 全局异常提示(2026-11-10 用户裁决)。
  5. *
  6. * 核心约束:**不会自动消失**,只能由用户手动关闭。
  7. */
  8. describe('AlertService', () => {
  9. let svc: AlertService;
  10. beforeEach(() => {
  11. TestBed.resetTestingModule();
  12. TestBed.configureTestingModule({ providers: [AlertService] });
  13. svc = TestBed.inject(AlertService);
  14. });
  15. it('show 后进入列表', () => {
  16. svc.show('请求异常', '细节');
  17. expect(svc.alerts().length).toBe(1);
  18. expect(svc.alerts()[0].title).toBe('请求异常');
  19. expect(svc.alerts()[0].detail).toBe('细节');
  20. });
  21. it('🔴 不会自动消失(等一段时间仍在)', async () => {
  22. svc.show('请求异常');
  23. await new Promise((r) => setTimeout(r, 300));
  24. expect(svc.alerts().length).toBe(1);
  25. });
  26. it('手动 dismiss 才移除', () => {
  27. svc.show('请求异常');
  28. const id = svc.alerts()[0].id;
  29. svc.dismiss(id);
  30. expect(svc.alerts()).toEqual([]);
  31. });
  32. it('同一标题不重复弹(避免每秒 tick 刷屏)', () => {
  33. svc.show('请求异常');
  34. svc.show('请求异常');
  35. svc.show('请求异常');
  36. expect(svc.alerts().length).toBe(1);
  37. });
  38. it('不同标题可以并存', () => {
  39. svc.show('A');
  40. svc.show('B');
  41. expect(svc.alerts().length).toBe(2);
  42. });
  43. it('clear 清空全部', () => {
  44. svc.show('A');
  45. svc.show('B');
  46. svc.clear();
  47. expect(svc.alerts()).toEqual([]);
  48. });
  49. });
  50. /*
  51. * 状态型提示(2026-11-10 用户反馈:不能只弹一次)。
  52. *
  53. * 约束:当前会话只要存在超时,就一直显示;条件消失后自动撤掉;
  54. * 用户手动关掉后不马上重弹,但条件重新出现时要能再提示。
  55. */
  56. describe('AlertService · syncState', () => {
  57. let svc: AlertService;
  58. beforeEach(() => {
  59. TestBed.resetTestingModule();
  60. TestBed.configureTestingModule({ providers: [AlertService] });
  61. svc = TestBed.inject(AlertService);
  62. });
  63. it('条件成立 → 显示', () => {
  64. svc.syncState('容器长时间未响应', true, '1 条超时');
  65. expect(svc.alerts().length).toBe(1);
  66. expect(svc.alerts()[0].detail).toBe('1 条超时');
  67. });
  68. it('🔴 条件持续成立 → 一直显示(不会被去重逻辑吞掉)', () => {
  69. svc.syncState('容器长时间未响应', true, '1 条超时');
  70. svc.syncState('容器长时间未响应', true, '2 条超时');
  71. expect(svc.alerts().length).toBe(1);
  72. expect(svc.alerts()[0].detail).toBe('2 条超时'); // 计数实时更新
  73. });
  74. it('条件消失 → 自动撤掉', () => {
  75. svc.syncState('容器长时间未响应', true);
  76. svc.syncState('容器长时间未响应', false);
  77. expect(svc.alerts()).toEqual([]);
  78. });
  79. it('🔴 用户手动关掉后不马上重弹(避免"关不掉")', () => {
  80. svc.syncState('容器长时间未响应', true);
  81. svc.dismiss(svc.alerts()[0].id);
  82. svc.syncState('容器长时间未响应', true);
  83. expect(svc.alerts()).toEqual([]);
  84. });
  85. it('🔴 条件消失再出现后,重新提示(问题二次发生要能看见)', () => {
  86. svc.syncState('容器长时间未响应', true);
  87. svc.dismiss(svc.alerts()[0].id);
  88. svc.syncState('容器长时间未响应', false); // 问题消失,解除锁定
  89. svc.syncState('容器长时间未响应', true); // 再次超时
  90. expect(svc.alerts().length).toBe(1);
  91. });
  92. });