scripts/ais-relay-entity-decode.test.cjs
Rama main · réplica de lectura del repositorio original.
/**
* Regression tests for _decodeRedditEntities in ais-relay.cjs (#5436).
*
* ais-relay.cjs starts an HTTP/WebSocket server, poll loops, and intervals at
* top level (no require.main guard), so it cannot be require()d from a test.
* Instead we lift the real function body out of the production source and eval
* it, so the assertions run against the shipped code, not a copy.
*
* Run: node --test scripts/ais-relay-entity-decode.test.cjs
*/
'use strict';
const { strict: assert } = require('node:assert');
const { readFileSync } = require('node:fs');
const { join } = require('node:path');
const test = require('node:test');
const relaySource = readFileSync(join(__dirname, 'ais-relay.cjs'), 'utf8');
function loadFunction(name) {
const match = relaySource.match(new RegExp(`function ${name}\\([^)]*\\) \\{[\\s\\S]*?\\n\\}`));
assert.ok(match, `could not locate ${name}() in ais-relay.cjs`);
// eslint-disable-next-line no-new-func
return new Function(`${match[0]}; return ${name};`)();
}
const _decodeRedditEntities = loadFunction('_decodeRedditEntities');
test('_decodeRedditEntities decodes exactly one level (no double-decode)', () => {
// A Reddit title whose literal text is `<script>` arrives escaped as
// `&lt;script&gt;`. Replacing `&` first would yield `<script>`.
assert.equal(_decodeRedditEntities('&lt;script&gt;'), '<script>');
assert.equal(_decodeRedditEntities('&quot;no comment&quot;'), '"no comment"');
assert.equal(_decodeRedditEntities('&#39;'), ''');
assert.equal(_decodeRedditEntities('&amp;'), '&');
});
test('_decodeRedditEntities still decodes single-level entities', () => {
assert.equal(_decodeRedditEntities('Tom & Jerry'), 'Tom & Jerry');
assert.equal(_decodeRedditEntities('a < b > c'), 'a < b > c');
assert.equal(_decodeRedditEntities('"hello"'), '"hello"');
assert.equal(_decodeRedditEntities('it's'), "it's");
assert.equal(
_decodeRedditEntities('AT&T <tag> "q" it's'),
'AT&T <tag> "q" it\'s',
);
});
test('_decodeRedditEntities leaves non-entities and unknown text alone', () => {
assert.equal(_decodeRedditEntities('plain headline & no entities'), 'plain headline & no entities');
assert.equal(_decodeRedditEntities(' stays'), ' stays');
});
test('_decodeRedditEntities passes non-strings through unchanged', () => {
assert.equal(_decodeRedditEntities(null), null);
assert.equal(_decodeRedditEntities(undefined), undefined);
assert.equal(_decodeRedditEntities(42), 42);
});