mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 15:30:56 +00:00
45 lines
1.9 KiB
TypeScript
45 lines
1.9 KiB
TypeScript
import { ConflictException } from '@nestjs/common';
|
|
|
|
import { VehiclesService } from './vehicles.service';
|
|
|
|
// One driver ⇒ one truck: create/update must refuse a driver already assigned
|
|
// to another (non-deleted) vehicle until they are detached.
|
|
describe('VehiclesService driver assignment guard', () => {
|
|
const otherTruck = { id: 'v2', plateNumber: '3-11111', assignedDriverId: 'd1' };
|
|
|
|
const makeService = (findOne: jest.Mock) =>
|
|
new VehiclesService(
|
|
{ findOne, create: jest.fn((x) => x), save: jest.fn(async (x) => x) } as any,
|
|
{ record: jest.fn() } as any,
|
|
);
|
|
|
|
it('rejects create when the driver is on another truck', async () => {
|
|
// First findOne = plate uniqueness (null), second = driver holder.
|
|
const findOne = jest.fn().mockResolvedValueOnce(null).mockResolvedValueOnce(otherTruck);
|
|
const svc = makeService(findOne);
|
|
await expect(
|
|
svc.create({ plateNumber: '3-22222', vehicleType: 'TRUCK', assignedDriverId: 'd1' } as any),
|
|
).rejects.toThrow(ConflictException);
|
|
});
|
|
|
|
it('rejects update when reassigning a driver still attached elsewhere', async () => {
|
|
const findOne = jest
|
|
.fn()
|
|
.mockResolvedValueOnce({ id: 'v1', plateNumber: '3-22222', assignedDriverId: null }) // findById
|
|
.mockResolvedValueOnce(otherTruck); // driver holder
|
|
const svc = makeService(findOne);
|
|
await expect(svc.update('v1', { assignedDriverId: 'd1' } as any)).rejects.toThrow(
|
|
ConflictException,
|
|
);
|
|
});
|
|
|
|
it('allows update that keeps the same driver on the same truck', async () => {
|
|
const findOne = jest
|
|
.fn()
|
|
.mockResolvedValueOnce({ id: 'v1', plateNumber: '3-22222', assignedDriverId: 'd1' });
|
|
const svc = makeService(findOne);
|
|
await expect(svc.update('v1', { assignedDriverId: 'd1' } as any)).resolves.toBeDefined();
|
|
expect(findOne).toHaveBeenCalledTimes(1); // guard skipped — no holder lookup
|
|
});
|
|
});
|