import assert from 'node:assert/strict'; import test from 'node:test'; import { validateAssetAttributeValues } from '../../src/asset-master/asset-attribute-validator'; import { AssetAttributeDataType, type AssetAttributeDefinition, } from '../../src/database/entities'; function definition( id: string, name: string, dataType: AssetAttributeDataType, overrides: Partial = {}, ): AssetAttributeDefinition { return { id, name, code: name.toLowerCase(), dataType, assetTypeId: '16e54e65-60cf-4739-b0d1-ccdd904fbfd5', isRequired: false, isActive: true, unit: null, options: null, sortOrder: 0, createdAt: new Date(), updatedAt: new Date(), ...overrides, }; } test('normalizes configured values without accepting arbitrary attributes', () => { const definitions = [ definition('7450ea58-6348-4cfc-88f1-e0f3bcd38913', 'Presión', AssetAttributeDataType.NUMBER), definition('f82088f8-6fc0-46c9-98b2-d694f80449c3', 'Crítico', AssetAttributeDataType.BOOLEAN), ]; assert.deepEqual(validateAssetAttributeValues(definitions, { [definitions[0]!.id]: 12.5, [definitions[1]!.id]: false, }), [ { definitionId: definitions[0]!.id, value: 12.5 }, { definitionId: definitions[1]!.id, value: false }, ]); assert.throws(() => validateAssetAttributeValues(definitions, { unknown: 'value' })); }); test('enforces required, date and selection semantics', () => { const requiredDate = definition( '880d0cdf-2400-4892-9a78-bcd8e7a3e270', 'Instalación', AssetAttributeDataType.DATE, { isRequired: true }, ); const selector = definition( '26430113-1116-45f0-a1d5-f96858e97b2e', 'Clase', AssetAttributeDataType.SELECT, { options: ['A', 'B'] }, ); assert.throws(() => validateAssetAttributeValues([requiredDate], {})); assert.throws(() => validateAssetAttributeValues([requiredDate], { [requiredDate.id]: '2026-02-30' })); assert.throws(() => validateAssetAttributeValues([selector], { [selector.id]: 'C' })); assert.deepEqual(validateAssetAttributeValues([requiredDate, selector], { [requiredDate.id]: '2026-08-13', [selector.id]: 'B', }), [ { definitionId: requiredDate.id, value: '2026-08-13' }, { definitionId: selector.id, value: 'B' }, ]); });