import { SchedulesService } from './schedules.service'; const createQb = () => ({ andWhere: jest.fn().mockReturnThis(), orderBy: jest.fn().mockReturnThis(), addOrderBy: jest.fn().mockReturnThis(), getMany: jest.fn().mockResolvedValue([]), }); describe('SchedulesService — teacher class scope', () => { it('filters schedule list to assigned classes when no class filter is selected', async () => { const qb = createQb(); const scheduleRepo = { createQueryBuilder: jest.fn().mockReturnValue(qb) }; const service = new SchedulesService( scheduleRepo as never, {} as never, {} as never, {} as never, ); await service.findAll({}, [3, 5]); expect(qb.andWhere).toHaveBeenCalledWith('cs.classId IN (:...accessibleClassIds)', { accessibleClassIds: [3, 5], }); }); it('returns no schedules when teacher has no assigned classes', async () => { const qb = createQb(); const scheduleRepo = { createQueryBuilder: jest.fn().mockReturnValue(qb) }; const service = new SchedulesService( scheduleRepo as never, {} as never, {} as never, {} as never, ); await expect(service.findAll({}, [])).resolves.toEqual([]); expect(qb.getMany).not.toHaveBeenCalled(); }); }); describe('SchedulesService — shared classroom occupancy visibility', () => { it('shows other classes as masked busy blocks while preserving assigned-class details', async () => { const qb = createQb(); qb.getMany.mockResolvedValue([ { id: 1, classId: 3, classroomId: 10, weekDay: 1, startTime: '09:00', endTime: '10:00', startDate: '2026-07-01', endDate: '2026-07-31', subject: '数学', teacherId: 8, scheduleType: 'INTERNAL', status: 'active', notes: '本班备注', }, { id: 2, classId: 99, classroomId: 10, weekDay: 1, startTime: '10:00', endTime: '11:00', startDate: '2026-07-01', endDate: '2026-07-31', subject: '其他班隐私科目', teacherId: 9, scheduleType: 'INTERNAL', status: 'active', notes: '其他班备注', }, ]); const service = new SchedulesService( { createQueryBuilder: jest.fn().mockReturnValue(qb) } as never, {} as never, {} as never, {} as never, ); const result = await service.getWeeklyView({}, [3]); const blocks = result[10][1]; expect(blocks[0]).toEqual(expect.objectContaining({ subject: '数学', canViewDetails: true })); expect(blocks[1]).toEqual( expect.objectContaining({ subject: '已占用', classId: null, teacherId: null, notes: null, canViewDetails: false, }), ); expect(JSON.stringify(blocks[1])).not.toContain('其他班隐私科目'); expect(JSON.stringify(blocks[1])).not.toContain('其他班备注'); expect(qb.andWhere).not.toHaveBeenCalledWith( 'cs.classId IN (:...accessibleClassIds)', expect.anything(), ); }); });