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 { InspectionCommunicationChannel, InspectionCommunicationDirection, InspectionCommunicationType, InspectionEvidenceKind, InspectionEvidencePurpose, } from '../../src/database/entities'; import { CreateInspectionCommunicationDto } from '../../src/inspection-findings/dto/create-inspection-communication.dto'; import { CreateInspectionEvidenceDto } from '../../src/inspection-findings/dto/create-inspection-evidence.dto'; test('D4 evidence DTO transforms multipart coordinates and accepts a communication link', async () => { const dto = plainToInstance(CreateInspectionEvidenceDto, { kind: InspectionEvidenceKind.DOCUMENT, purpose: InspectionEvidencePurpose.COMPANY_RESPONSE, communicationId: 'd567722e-888f-45e8-8ac6-a8bfa6855518', capturedAt: '2026-08-14T20:30:00.000Z', latitude: '-32.889458', longitude: '-68.845839', accuracyM: '4.250', deviceLabel: 'Panel web', }); assert.deepEqual(await validate(dto), []); assert.equal(dto.latitude, -32.889458); assert.equal(dto.accuracyM, 4.25); }); test('D4 communication DTO accepts a company response and normalizes text', async () => { const dto = plainToInstance(CreateInspectionCommunicationDto, { direction: InspectionCommunicationDirection.INBOUND, channel: InspectionCommunicationChannel.EMAIL, type: InspectionCommunicationType.COMPANY_RESPONSE, occurredAt: '2026-08-14T20:30:00.000Z', subject: ' Respuesta al hallazgo H001 ', details: ' Se comprometen a corregir. ', contactEmail: 'responsable@empresa.test', }); assert.deepEqual(await validate(dto), []); assert.equal(dto.subject, 'Respuesta al hallazgo H001'); assert.equal(dto.details, 'Se comprometen a corregir.'); }); test('D4 communication DTO rejects invalid email and date', async () => { const dto = plainToInstance(CreateInspectionCommunicationDto, { direction: InspectionCommunicationDirection.OUTBOUND, channel: InspectionCommunicationChannel.EMAIL, type: InspectionCommunicationType.AUTHORITY_NOTICE, occurredAt: '14/08/2026', subject: 'Notificación', contactEmail: 'correo-invalido', }); const errors = await validate(dto); assert.equal(errors.some((error) => error.property === 'occurredAt'), true); assert.equal(errors.some((error) => error.property === 'contactEmail'), true); });