import assert from 'node:assert/strict'; import test from 'node:test'; import { plainToInstance } from 'class-transformer'; import { validate } from 'class-validator'; import { CreateAreaCompanyRelationDto } from '../../src/asset-master/dto/create-area-company-relation.dto'; import { EndAreaCompanyRelationDto } from '../../src/asset-master/dto/end-area-company-relation.dto'; import { ListAreaCompanyRelationsQueryDto } from '../../src/asset-master/dto/list-area-company-relations-query.dto'; import { ListOperationalAreasQueryDto } from '../../src/asset-master/dto/list-operational-areas-query.dto'; import { CreateAssetTypeDto } from '../../src/asset-master/dto/create-asset-type.dto'; import { AssetTypeOperationalRole } from '../../src/database/entities'; const AREA_ID = '11111111-1111-4111-8111-111111111111'; const COMPANY_ID = '22222222-2222-4222-8222-222222222222'; test('D5.3 relation DTO trims reasons and accepts UUID v4 anchors', async () => { const dto = plainToInstance(CreateAreaCompanyRelationDto, { areaId: AREA_ID, companyId: COMPANY_ID, reason: ' Contrato de explotación vigente ', }); assert.deepEqual(await validate(dto), []); assert.equal(dto.reason, 'Contrato de explotación vigente'); const end = plainToInstance(EndAreaCompanyRelationDto, { reason: ' Fin de contrato ' }); assert.deepEqual(await validate(end), []); assert.equal(end.reason, 'Fin de contrato'); }); test('D5.3 relation DTO rejects incomplete identifiers and short reasons', async () => { const dto = plainToInstance(CreateAreaCompanyRelationDto, { areaId: 'area', companyId: COMPANY_ID, reason: 'x', }); const properties = new Set((await validate(dto)).map((error) => error.property)); assert.equal(properties.has('areaId'), true); assert.equal(properties.has('reason'), true); }); test('D5.3 history filter accepts explicit booleans', async () => { const query = plainToInstance(ListAreaCompanyRelationsQueryDto, { areaId: AREA_ID, includeHistory: 'true', }); assert.deepEqual(await validate(query), []); assert.equal(query.includeHistory, true); }); test('D5.3 operational area filter validates the physical parent', async () => { const valid = plainToInstance(ListOperationalAreasQueryDto, { parentId: AREA_ID }); assert.deepEqual(await validate(valid), []); const invalid = plainToInstance(ListOperationalAreasQueryDto, { parentId: 'parent' }); assert.equal((await validate(invalid)).some((error) => error.property === 'parentId'), true); }); test('D5.3 asset type operational role is constrained to the enum', async () => { const valid = plainToInstance(CreateAssetTypeDto, { code: 'area', name: 'Área', description: '', canBeRoot: true, operationalRole: AssetTypeOperationalRole.AREA, allowedParentTypeIds: [], }); assert.deepEqual(await validate(valid), []); const invalid = plainToInstance(CreateAssetTypeDto, { code: 'company', name: 'Empresa', description: '', canBeRoot: true, operationalRole: 'MULTI', allowedParentTypeIds: [], }); assert.equal((await validate(invalid)).some((error) => error.property === 'operationalRole'), true); });