Carpincho/test/configuracion.test.cjs
Exequiel Aramburu 99264aba3d Se adecuó el UI
2026-09-27 23:05:15 -03:00

85 lines
5.1 KiB
JavaScript

const {test} = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs/promises');
const path = require('node:path');
const os = require('node:os');
const vm = require('node:vm');
const model = require('../src/gui_common/js/configuracion-modelo.js');
const {guardarConfiguracion} = require('../src/core/configuracion-store.js');
const {registrarConfiguracion} = require('../src/gui_web/configuracion-api.js');
const express = require('../src/node_modules/express');
const fixture = require('./fixtures/configuracion.cjs');
test('el formulario conserva propiedades ajenas y no modifica el objeto original', () => {
const old = fixture(), fields = model.read(old);
fields.NombreEstacion = 'Nuevo'; fields.inicio_auto = 'Activado';
const next = model.build(old, fields);
assert.equal(old.ConfGeneral.NombreEstacion, 'Estación prueba');
assert.equal(next.ConfGeneral.inicio_automatico, true);
assert.deepEqual(next.Redes, old.Redes);
assert.equal(next.ConfGeneral.conservar, old.ConfGeneral.conservar);
assert.deepEqual(model.validate(fields), {});
});
test('validación condicional de visor, IP y SMTP', () => {
const fields = model.read(fixture());
fields.Modo = 'Visor'; assert(model.validate(fields).Llave_R);
fields.Llave_R = 'llave'; assert.deepEqual(model.validate(fields), {});
fields.Modo = 'Recolector_IP'; fields.r_puerto = '65536'; fields.r_path = 'datos';
assert(model.validate(fields).r_puerto); assert(model.validate(fields).r_path);
fields.r_puerto = '65535'; fields.r_path = '/datos'; assert.deepEqual(model.validate(fields), {});
fields.Tipo_SMTP = 'Manual'; fields.Usuario_SMTP = 'invalido';
const errors = model.validate(fields);
assert(errors.Usuario_SMTP && errors.Contrasenia_SMTP && errors.Server_SMTP && errors.Email_receptor);
});
test('guardar y volver a leer, rechazo sin alterar el archivo y limpieza de temporales', async t => {
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'carpincho-config-'));
t.after(() => fs.rm(dir, {recursive: true, force: true}));
const file = path.join(dir, 'ConfiguracionGeneral.js');
const config = fixture(); config.ConfGeneral.NombreEstacion = 'Prueba " especial';
await guardarConfiguracion(config, file);
const previous = await fs.readFile(file, 'utf8');
const sandbox = {module: {exports: {}}}; vm.runInNewContext(previous, sandbox);
assert.deepEqual(JSON.parse(JSON.stringify(sandbox.module.exports)), config);
config.ConfGeneral.debugTamanio = -1;
await assert.rejects(guardarConfiguracion(config, file));
assert.equal(await fs.readFile(file, 'utf8'), previous);
await assert.rejects(guardarConfiguracion(fixture(), dir));
assert.deepEqual(await fs.readdir(dir), ['ConfiguracionGeneral.js']);
});
test('HTTP espera la escritura, informa rechazos y permite reintentar', async t => {
const app = express(); app.use(express.json());
let release, fail = false, reload = 0;
registrarConfiguracion(app, {guardar: async config => {
assert(config.ConfGeneral);
if (fail) throw new Error('disco no disponible');
await new Promise(resolve => {release = resolve;});
}, reconfigurar: () => {reload++;}});
const server = await new Promise(resolve => {const s = app.listen(0,'127.0.0.1',()=>resolve(s));});
t.after(() => server.close());
const url = `http://127.0.0.1:${server.address().port}/GuardarConf`;
const request = () => fetch(url,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({configuracion:fixture()})});
let replied = false;
const pending = request().then(response => {replied = true; return response.json();});
while (!release) await new Promise(resolve => setTimeout(resolve, 5));
assert.equal(replied, false); assert.equal(reload, 0);
release(); assert.deepEqual(await pending,{ok:true}); assert.equal(reload,1);
fail = true; const failed = await request(); assert.equal(failed.status,500); assert.equal((await failed.json()).ok,false);
fail = false; release = null; const retry = request();
while (!release) await new Promise(resolve => setTimeout(resolve,5));
release(); assert.equal((await (await retry).json()).ok,true);
});
test('la reconfiguración actualiza el objeto compartido y los parámetros del recolector', async () => {
const source = await fs.readFile(path.join(__dirname,'../src/core/ema.js'),'utf8');
const start = source.indexOf(' Reconfigurar: function');
const end = source.indexOf(' Iniciar: function',start);
const current = fixture();
const context = {configGeneralEMA:current, APP:{Configuracion:{},RegistrarLog() {}},recolector:{conf:{}},Correo:{EnviarEmail(){throw new Error('Unexpected email');}}};
vm.runInNewContext('handler = ({'+source.slice(start,end)+'}).Reconfigurar;',context);
const next = fixture(); next.ConfGeneral.Tiempo_de_Recoleccion=30;next.ConfGeneral.UTC=2;next.ConfGeneral.Modo='Recolector_IP';
context.handler(next);
assert.equal(current.ConfGeneral.Tiempo_de_Recoleccion,30);
assert.equal(context.APP.Configuracion.TiempoContinuo,30);
assert.equal(context.APP.Configuracion.Modo,'Recolector_IP');
assert.equal(context.APP.Configuracion.utc,2);
});