File size: 3,258 Bytes
55d9355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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/);
});