Files
dh-inspeccion-v2/api-v3/test/unit/inspection-findings-dto.test.ts
T

108 lines
4.8 KiB
TypeScript

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 { CloseInspectionFindingDto } from '../../src/inspection-findings/dto/close-inspection-finding.dto';
import { CreateInspectionFindingDto } from '../../src/inspection-findings/dto/create-inspection-finding.dto';
import { ListInspectionFindingsQueryDto } from '../../src/inspection-findings/dto/list-inspection-findings-query.dto';
import { CreateFindingCatalogItemDto } from '../../src/inspection-findings/dto/create-finding-catalog-item.dto';
import { CreateFindingCategoryDto } from '../../src/inspection-findings/dto/create-finding-category.dto';
import { UpdateFindingCatalogItemDto } from '../../src/inspection-findings/dto/update-finding-catalog-item.dto';
import { UpdateInspectionFindingFollowUpDto } from '../../src/inspection-findings/dto/update-inspection-finding-follow-up.dto';
const ASSET_ID = '16e54e65-60cf-4739-b0d1-ccdd904fbfd5';
const CATALOG_ID = '9e38a67b-d6b1-49e0-8ec3-69a68366bd88';
test('finding DTO accepts catalog findings with a correction deadline', async () => {
const dto = plainToInstance(CreateInspectionFindingDto, {
assetId: ASSET_ID,
catalogItemId: CATALOG_ID,
description: ' Pérdida visible en la unión bridada. ',
correctionDueOn: '2026-09-15',
});
assert.deepEqual(await validate(dto), []);
assert.equal(dto.description, 'Pérdida visible en la unión bridada.');
});
test('custom findings require a title and reject malformed dates', async () => {
const dto = plainToInstance(CreateInspectionFindingDto, {
assetId: ASSET_ID,
catalogItemId: null,
description: 'Observación específica',
correctionDueOn: '15/09/2026',
});
const errors = await validate(dto);
assert.equal(errors.some((error) => error.property === 'customTitle'), true);
assert.equal(errors.some((error) => error.property === 'correctionDueOn'), true);
});
test('follow-up DTO keeps company response and verification planning as separate dates', async () => {
const dto = plainToInstance(UpdateInspectionFindingFollowUpDto, {
companyResponse: ' Se corregirá durante la parada programada. ',
companyResponseReceivedOn: '2026-08-20',
companyCommittedCorrectionOn: '2026-09-10',
nextControlOn: '2026-09-15',
});
assert.deepEqual(await validate(dto), []);
assert.equal(dto.companyResponse, 'Se corregirá durante la parada programada.');
});
test('global finding filters accept the two operational work queues', async () => {
const administrative = plainToInstance(ListInspectionFindingsQueryDto, {
page: '1', pageSize: '25', workflow: 'COMPANY_OVERDUE', search: ' PSEnergy ',
});
const operational = plainToInstance(ListInspectionFindingsQueryDto, {
page: '1', pageSize: '25', workflow: 'VERIFICATION_OVERDUE',
});
assert.deepEqual(await validate(administrative), []);
assert.deepEqual(await validate(operational), []);
assert.equal(administrative.search, 'PSEnergy');
});
test('finding close DTO requires a meaningful conclusion', async () => {
const valid = plainToInstance(CloseInspectionFindingDto, { closureNotes: ' Solución verificada en campo. ' });
const invalid = plainToInstance(CloseInspectionFindingDto, { closureNotes: 'x' });
assert.deepEqual(await validate(valid), []);
assert.equal(valid.closureNotes, 'Solución verificada en campo.');
assert.equal((await validate(invalid)).length > 0, true);
});
test('catalog category DTO normalizes the immutable code', async () => {
const dto = plainToInstance(CreateFindingCategoryDto, {
code: ' seguridad_operativa ',
name: ' Seguridad operativa ',
sortOrder: '25',
});
assert.deepEqual(await validate(dto), []);
assert.equal(dto.code, 'SEGURIDAD_OPERATIVA');
assert.equal(dto.name, 'Seguridad operativa');
assert.equal(dto.sortOrder, 25);
});
test('catalog item DTO accepts nullable reference fields and normalizes its code', async () => {
const dto = plainToInstance(CreateFindingCatalogItemDto, {
categoryId: CATALOG_ID,
code: ' perdida_brida ',
sourceNumber: '171',
title: ' Pérdida visible en unión bridada ',
legalBasis: ' ',
glossary: null,
importNote: ' Alta manual ',
});
assert.deepEqual(await validate(dto), []);
assert.equal(dto.code, 'PERDIDA_BRIDA');
assert.equal(dto.legalBasis, null);
assert.equal(dto.importNote, 'Alta manual');
});
test('catalog item update rejects an empty title and invalid source number', async () => {
const dto = plainToInstance(UpdateFindingCatalogItemDto, {
title: ' ',
sourceNumber: 0,
});
const errors = await validate(dto);
assert.equal(errors.some((error) => error.property === 'title'), true);
assert.equal(errors.some((error) => error.property === 'sourceNumber'), true);
});