import 'reflect-metadata'; import assert from 'node:assert/strict'; import test from 'node:test'; import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; import { REQUIRED_PERMISSIONS_KEY } from '../../src/authorization/decorators/require-permissions.decorator'; import { InspectionDeadlineDayType } from '../../src/database/entities'; import { UpdateInspectionDeadlinePolicyDto } from '../../src/inspection-deadlines/dto/update-inspection-deadline-policy.dto'; import { InspectionDeadlinesController } from '../../src/inspection-deadlines/inspection-deadlines.controller'; function permissions(method: string): string[] { const handler = InspectionDeadlinesController.prototype[ method as keyof InspectionDeadlinesController ]; return Reflect.getMetadata(REQUIRED_PERMISSIONS_KEY, handler) as string[]; } test('F4 deadline administration is protected by one dedicated JEFE permission', () => { assert.deepEqual(permissions('policies'), ['inspection_deadlines.manage']); assert.deepEqual(permissions('updatePolicy'), ['inspection_deadlines.manage']); assert.deepEqual(permissions('nonWorkingDays'), ['inspection_deadlines.manage']); assert.deepEqual(permissions('upsertNonWorkingDay'), ['inspection_deadlines.manage']); }); test('F4 deadline policy accepts business or calendar days with a bounded amount', async () => { const valid = plainToInstance(UpdateInspectionDeadlinePolicyDto, { days: 5, dayType: InspectionDeadlineDayType.BUSINESS, }); assert.equal((await validate(valid)).length, 0); const calendar = plainToInstance(UpdateInspectionDeadlinePolicyDto, { days: 10, dayType: InspectionDeadlineDayType.CALENDAR, }); assert.equal((await validate(calendar)).length, 0); const invalid = plainToInstance(UpdateInspectionDeadlinePolicyDto, { days: 0, dayType: 'UNKNOWN', }); assert.ok((await validate(invalid)).length >= 2); });