import { Repository, DataSource } from 'typeorm'; import { OccupanciesService } from './occupancies.service'; import { Occupancy } from '../entities/occupancy.entity'; import { Room } from '../entities/room.entity'; import { Student } from '../entities/student.entity'; import { Deposit } from '../entities/deposit.entity'; import { Bed } from '../entities/bed.entity'; import { Locker } from '../entities/locker.entity'; describe('OccupanciesService — responsible organization', () => { it('defaults the responsible organization to the student organization', async () => { const occupancyRepo = { findOne: jest.fn().mockResolvedValue(null), count: jest.fn().mockResolvedValue(0), create: jest.fn((value) => value), save: jest.fn(async (value) => ({ ...value, id: 10 })), } as any as Repository; const roomRepo = { findOne: jest.fn().mockResolvedValue({ id: 2, capacity: 4 }), update: jest.fn(), } as any as Repository; const studentRepo = { findOne: jest.fn().mockResolvedValue({ id: 3, gender: '男', organizationId: 7 }), } as any as Repository; const service = new OccupanciesService( occupancyRepo, roomRepo, studentRepo, {} as Repository, { findOne: jest.fn().mockResolvedValue({ id: 4, roomId: 2, status: 'available' }), update: jest.fn(), } as any as Repository, {} as Repository, {} as Repository, {} as DataSource, ); await service.checkIn({ studentId: 3, roomId: 2, checkInDate: '2026-07-10', bedId: 4, }); expect(occupancyRepo.create).toHaveBeenCalledWith( expect.objectContaining({ responsibleOrganizationId: 7 }), ); }); }); describe('OccupanciesService — import bed capacity', () => { it('rejects creating a new bed when the room already has its capacity in beds', async () => { const occupancyRepo = { findOne: jest.fn().mockResolvedValue(null), count: jest.fn().mockResolvedValue(0), create: jest.fn((value) => value), save: jest.fn(), } as any as Repository; const roomRepo = { findOne: jest.fn().mockResolvedValue({ id: 2, roomNumber: '4-102', capacity: 4 }), create: jest.fn((value) => value), save: jest.fn(), update: jest.fn(), } as any as Repository; const studentRepo = { findOne: jest.fn().mockResolvedValue({ id: 3, name: '张三', organizationId: 7 }), create: jest.fn((value) => value), save: jest.fn(), update: jest.fn(), } as any as Repository; const bedRepo = { findOne: jest.fn().mockResolvedValue(null), count: jest.fn().mockResolvedValue(4), create: jest.fn((value) => value), save: jest.fn(), update: jest.fn(), } as any as Repository; const organizationRepo = { findOne: jest.fn().mockResolvedValue({ id: 7, name: '本机构', isHost: true }), create: jest.fn((value) => value), save: jest.fn(), } as any as Repository; const service = new OccupanciesService( occupancyRepo, roomRepo, studentRepo, { findOne: jest.fn(), create: jest.fn(), save: jest.fn() } as any as Repository, bedRepo, { findOne: jest.fn() } as any as Repository, organizationRepo, {} as DataSource, ); const result = await service.batchImportCheckIn([ { name: '张三', roomNumber: '4-102', bedNumber: '5号床', checkInDate: '2026-07-14', }, ]); expect(result).toEqual( expect.objectContaining({ imported: 0, skipped: 1, errors: [expect.stringContaining('不能超过额定人数 4')], }), ); expect(bedRepo.save).not.toHaveBeenCalled(); expect(occupancyRepo.save).not.toHaveBeenCalled(); }); });