Handles: numeric entities (< >), named entities (& etc), HTML tags, multi-level escaping (up to 5 decode iterations, capped to avoid infinite loop), whitespace/newline collapsing. Preserves dates, names, numbers, error codes, hostnames, versions -- only strips markup. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
64 lines
2.8 KiB
JavaScript
64 lines
2.8 KiB
JavaScript
const { test } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const { normalizeGlpiText } = require('./normalize');
|
|
|
|
test('HTML normal e removido, texto preservado', () => {
|
|
assert.equal(normalizeGlpiText('<p>Aguardando cliente</p>'), 'Aguardando cliente');
|
|
});
|
|
|
|
test('entidades HTML escapadas uma vez sao decodificadas e as tags removidas', () => {
|
|
const entrada = '<p>Aguardando retorno de Patricia sobre troca da carcaça</p>';
|
|
assert.equal(normalizeGlpiText(entrada), 'Aguardando retorno de Patricia sobre troca da carcaça');
|
|
});
|
|
|
|
test('entidades HTML escapadas duas vezes sao decodificadas iterativamente', () => {
|
|
const entrada = '&#60;p&#62;texto&#60;/p&#62;';
|
|
assert.equal(normalizeGlpiText(entrada), 'texto');
|
|
});
|
|
|
|
test('entidades nomeadas comuns (amp, nbsp) sao decodificadas', () => {
|
|
assert.equal(normalizeGlpiText('Suporte & Manutenção'), 'Suporte & Manutenção');
|
|
});
|
|
|
|
test('texto sem HTML permanece intacto (so trim de espacos)', () => {
|
|
assert.equal(normalizeGlpiText(' Servidor não responde '), 'Servidor não responde');
|
|
});
|
|
|
|
test('caracteres acentuados sao preservados', () => {
|
|
assert.equal(normalizeGlpiText('<p>Impressão não está funcionando corretamente na área de atendimento</p>'), 'Impressão não está funcionando corretamente na área de atendimento');
|
|
});
|
|
|
|
test('codigo tecnico (numeros, versao, hostname) e preservado', () => {
|
|
const entrada = '<p>Erro 0x8007000E no servidor SRV-FILE01, versao 10.2.3, IP 192.168.1.50</p>';
|
|
assert.equal(normalizeGlpiText(entrada), 'Erro 0x8007000E no servidor SRV-FILE01, versao 10.2.3, IP 192.168.1.50');
|
|
});
|
|
|
|
test('string vazia retorna string vazia', () => {
|
|
assert.equal(normalizeGlpiText(''), '');
|
|
});
|
|
|
|
test('null e undefined retornam string vazia sem lancar excecao', () => {
|
|
assert.doesNotThrow(() => normalizeGlpiText(null));
|
|
assert.doesNotThrow(() => normalizeGlpiText(undefined));
|
|
assert.equal(normalizeGlpiText(null), '');
|
|
assert.equal(normalizeGlpiText(undefined), '');
|
|
});
|
|
|
|
test('quebras de linha excessivas e espacos duplicados sao colapsados', () => {
|
|
const entrada = '<p>Linha 1</p>\n\n\n\n<p>Linha 2 com espacos</p>';
|
|
const resultado = normalizeGlpiText(entrada);
|
|
assert.ok(!resultado.includes('\n\n\n'));
|
|
assert.ok(!/ {2,}/.test(resultado));
|
|
});
|
|
|
|
test('decodificacao para no limite de iteracoes sem lancar excecao (protecao contra loop)', () => {
|
|
const entradaMaliciosa = '&'.repeat(20) + '#60;p>';
|
|
assert.doesNotThrow(() => normalizeGlpiText(entradaMaliciosa));
|
|
});
|
|
|
|
test('conteudo normalizado de duas codificacoes diferentes do mesmo texto e identico', () => {
|
|
const versaoHtml = '<p>Aguardando cliente</p>';
|
|
const versaoEscapada = '<p>Aguardando cliente</p>';
|
|
assert.equal(normalizeGlpiText(versaoHtml), normalizeGlpiText(versaoEscapada));
|
|
});
|