forked from wangziqi/gongxue-base
117 lines
3.8 KiB
TypeScript
117 lines
3.8 KiB
TypeScript
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<Occupancy>;
|
|
const roomRepo = {
|
|
findOne: jest.fn().mockResolvedValue({ id: 2, capacity: 4 }),
|
|
update: jest.fn(),
|
|
} as any as Repository<Room>;
|
|
const studentRepo = {
|
|
findOne: jest.fn().mockResolvedValue({ id: 3, gender: '男', organizationId: 7 }),
|
|
} as any as Repository<Student>;
|
|
|
|
const service = new OccupanciesService(
|
|
occupancyRepo,
|
|
roomRepo,
|
|
studentRepo,
|
|
{} as Repository<Deposit>,
|
|
{
|
|
findOne: jest.fn().mockResolvedValue({ id: 4, roomId: 2, status: 'available' }),
|
|
update: jest.fn(),
|
|
} as any as Repository<Bed>,
|
|
{} as Repository<Locker>,
|
|
{} as Repository<any>,
|
|
{} 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<Occupancy>;
|
|
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<Room>;
|
|
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<Student>;
|
|
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<Bed>;
|
|
const organizationRepo = {
|
|
findOne: jest.fn().mockResolvedValue({ id: 7, name: '本机构', isHost: true }),
|
|
create: jest.fn((value) => value),
|
|
save: jest.fn(),
|
|
} as any as Repository<any>;
|
|
|
|
const service = new OccupanciesService(
|
|
occupancyRepo,
|
|
roomRepo,
|
|
studentRepo,
|
|
{ findOne: jest.fn(), create: jest.fn(), save: jest.fn() } as any as Repository<Deposit>,
|
|
bedRepo,
|
|
{ findOne: jest.fn() } as any as Repository<Locker>,
|
|
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();
|
|
});
|
|
});
|