lesson-records.component.spec.ts 4.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import {TestBed} from '@angular/core/testing';
  2. import {ActivatedRoute,convertToParamMap} from '@angular/router';
  3. import {OperationsService} from '../operations.service';
  4. import {LessonRecordsComponent} from './lesson-records.component';
  5. import {LessonRecordDetailComponent} from './lesson-record-detail.component';
  6. describe('上课记录与复习转交',()=>{
  7. let ops:jasmine.SpyObj<OperationsService>;
  8. beforeEach(()=>{ops=jasmine.createSpyObj<OperationsService>('OperationsService',['request']);TestBed.configureTestingModule({providers:[{provide:OperationsService,useValue:ops},{provide:ActivatedRoute,useValue:{snapshot:{queryParamMap:convertToParamMap({})}}}]});});
  9. const page=(items:unknown[],total=2)=>({items,total,cumulativeTotal:51,page:1,pageSize:100,version:'snapshot1'});
  10. it('单个会员查看全部连续读取分页,保持筛选与实际总课次数',async()=>{
  11. const c=TestBed.runInInjectionContext(()=>new LessonRecordsComponent());c.studentId=20;c.all=true;c.coachName='钱老师';
  12. ops.request.and.returnValues(Promise.resolve(page([{lessonId:'a'}])),Promise.resolve(page([{lessonId:'b'}])));
  13. await c.load();expect(c.data()?.items.length).toBe(2);expect(c.data()?.cumulativeTotal).toBe(51);expect(ops.request.calls.mostRecent().args[1]).toEqual(jasmine.objectContaining({studentId:20,coachName:'钱老师',page:2}));
  14. });
  15. it('后续页失败时清除不完整结果并允许重试',async()=>{
  16. const c=TestBed.runInInjectionContext(()=>new LessonRecordsComponent());c.studentId=20;c.all=true;
  17. ops.request.and.returnValues(Promise.resolve(page([{lessonId:'a'}])),Promise.reject(new Error('网络中断')));
  18. await c.load();expect(c.data()).toBeNull();expect(c.error()).toBe('网络中断');expect(c.busy()).toBeFalse();
  19. });
  20. it('查询默认没有月份限制;切换条件清除查看全部',async()=>{
  21. const c=TestBed.runInInjectionContext(()=>new LessonRecordsComponent());expect(c.params()['dateFrom']).toBe('');expect(c.params()['dateTo']).toBe('');
  22. c.all=true;c.page=4;ops.request.and.resolveTo(page([]));c.query();expect(c.page).toBe(1);expect(c.all).toBeFalse();
  23. });
  24. it('转交预览失败不保留旧预览;未选择目标或原因不能提交',async()=>{
  25. const c=TestBed.runInInjectionContext(()=>new LessonRecordDetailComponent());await c.checkTransfer();expect(ops.request).not.toHaveBeenCalled();
  26. c.coachId=11;c.reason='老师交接';c.preview.set({version:'old',count:2} as never);ops.request.and.rejectWith(new Error('任务变化'));
  27. await c.checkTransfer();expect(c.preview()).toBeNull();expect(c.error()).toBe('任务变化');
  28. });
  29. it('陪练支持姓名片段和编号搜索,修改搜索后清除旧目标和旧预览',async()=>{
  30. const c=TestBed.runInInjectionContext(()=>new LessonRecordDetailComponent());c.coaches.set([{userId:69,displayName:'钱老师'},{userId:1665,displayName:'张老师'}]);
  31. c.searchCoach('钱');expect(c.filteredCoaches().map(x=>x.userId)).toEqual([69]);c.selectCoach(c.filteredCoaches()[0]);expect(c.coachId).toBe(69);
  32. c.preview.set({count:10,version:'old'} as never);c.searchCoach('665');expect(c.coachId).toBe(0);expect(c.preview()).toBeNull();expect(c.filteredCoaches().map(x=>x.userId)).toEqual([1665]);
  33. c.reason='老师交接';await c.checkTransfer();expect(ops.request).not.toHaveBeenCalled();
  34. c.searchCoach('不存在');expect(c.filteredCoaches()).toEqual([]);
  35. });
  36. it('键盘可选择搜索结果,Escape 仅收起陪练列表',()=>{
  37. const c=TestBed.runInInjectionContext(()=>new LessonRecordDetailComponent());c.coaches.set([{userId:69,displayName:'钱老师'}]);c.searchCoach('钱');
  38. c.coachKeydown(new KeyboardEvent('keydown',{key:'ArrowDown'}));c.coachKeydown(new KeyboardEvent('keydown',{key:'Enter'}));expect(c.coachId).toBe(69);expect(c.coachPickerOpen()).toBeFalse();
  39. c.openCoaches();c.coachKeydown(new KeyboardEvent('keydown',{key:'Escape'}));expect(c.coachPickerOpen()).toBeFalse();expect(c.coachId).toBe(69);
  40. });
  41. it('保存失败保留同一幂等请求,重复点击仅提交一次;成功后回读',async()=>{
  42. const c=TestBed.runInInjectionContext(()=>new LessonRecordDetailComponent());c.data.set({studentId:20,appointmentId:'1000'} as never);c.coachId=11;c.reason='老师交接';
  43. ops.request.and.resolveTo({version:'v1',count:2});await c.checkTransfer();ops.request.and.rejectWith(new Error('断网'));
  44. await c.saveTransfer();const first=ops.request.calls.mostRecent().args[1];expect(c.preview()?.version).toBe('v1');await c.saveTransfer();expect(ops.request.calls.mostRecent().args[1]?.['idempotencyKey']).toBe(first?.['idempotencyKey']);
  45. ops.request.and.returnValues(Promise.resolve({count:2}),Promise.resolve({studentId:20,appointmentId:'1000'}));await c.saveTransfer();expect(c.preview()).toBeNull();expect(c.message()).toContain('2');
  46. });
  47. });