import test from 'node:test'; import assert from 'node:assert/strict'; import { adoptedValues, applyImportDefaults, importDefaults, decimalValue, EMPTY_REASON } from '../src/importDefaults.js'; const imported = (patch = {}) => ({ preview: { tipo: 'evolutivo', avaliacoes: [{ id: 'evo-1', modelo: 'MODELO_A' }, { id: 'evo-2', modelo: 'MODELO_A' }], sugestoes: { motivos_desvalorizantes: [{ descricao: 'Sem esgoto', alegado: false, confirmado: true }] } }, referenciaAnos: 'ano_base', anos: { 'evo-1': '2025', 'evo-2': '2023' }, ...patch, }); test('importação preenche motivos, método, modelo e referências ordenadas', () => { const defaults = importDefaults(imported()); assert.equal(defaults.metodo_avaliacao, 'Método Comparativo Dados de Mercado - ABNT NBR 14.653-2 e Método de Quantificação de Custo'); assert.equal(defaults.modelo_avaliacao, 'MODELO_A'); assert.equal(defaults.datas_referencia, 'Dezembro/2023, Dezembro/2025'); assert.deepEqual(defaults.motivos_desvalorizantes, [{ descricao: 'Sem esgoto', alegado: false, confirmado: true }]); }); test('corrigir exercício ou ano-base atualiza somente os campos ainda automáticos', () => { const previous = importDefaults(imported()); const next = importDefaults(imported({ referenciaAnos: 'exercicio_iptu' })); const form = { ...previous, modelo_avaliacao: 'Texto revisado', motivos_desvalorizantes: [] }; const result = applyImportDefaults(form, next, previous, new Set(['modelo_avaliacao', 'motivos_desvalorizantes'])); assert.equal(result.datas_referencia, 'Dezembro/2022, Dezembro/2024'); assert.equal(result.modelo_avaliacao, 'Texto revisado'); assert.deepEqual(result.motivos_desvalorizantes, []); }); test('trocar arquivo substitui sugestões e preserva inclusive edições vazias', () => { const previous = importDefaults(imported()); const next = { ...previous, modelo_avaliacao: 'MODELO_B', datas_referencia: 'Dezembro/2020' }; const result = applyImportDefaults({ ...previous, datas_referencia: '' }, next, previous, new Set(['datas_referencia'])); assert.equal(result.modelo_avaliacao, 'MODELO_B'); assert.equal(result.datas_referencia, ''); }); test('remover arquivo limpa sugestões antigas e mantém campos manuais', () => { const previous = importDefaults(imported()); const result = applyImportDefaults({ ...previous, numero_laudo: 'LA_01', modelo_avaliacao: 'Manual' }, {}, previous, new Set(['modelo_avaliacao'])); assert.equal(result.modelo_avaliacao, 'Manual'); assert.equal(result.metodo_avaliacao, ''); assert.equal(result.numero_laudo, 'LA_01'); assert.deepEqual(result.motivos_desvalorizantes, [EMPTY_REASON]); }); test('referências pendentes não são adivinhadas', () => { assert.equal(importDefaults(imported({ anos: {} })).datas_referencia, ''); }); test('valores adotados aceitam reais e zero sem perder a parte decimal', () => { assert.deepEqual(adoptedValues({ valoresAdotados: { a: 'R$ 1.234.567,89', b: '0,00', c: '100.12' } }), { a: '1234567.89', b: '0.00', c: '100.12' }); for (const input of ['', '-1', 'NaN', '1..2,00', '1,234', '1e3']) assert.equal(decimalValue(input), null); assert.throws(() => adoptedValues({ valoresAdotados: { a: '' } }), /valores de mercado válidos/); });