Repository navigation
Expand file tree
/
Copy pathapresentacao-ia.test.mjs
More file actions
53 lines (47 loc) · 3.74 KB
/
Copy pathapresentacao-ia.test.mjs
File metadata and controls
53 lines (47 loc) · 3.74 KB
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
// Lógica pura da apresentação com IA (web/js/apresentacao-ia-logica.js): Épico ausente, corpo do pedido, frases do resultado e a lista.
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import vm from "node:vm";
const ctx = vm.createContext({ tr: (t, p = {}) => t.replace(/\{(\w+)\}/g, (_, k) => p[k] ?? "") });
vm.runInContext(readFileSync(new URL("web/js/apresentacao-ia-logica.js", import.meta.url), "utf8") + "\nthis.api = { AP_IA_NIVEIS, AP_IA_PUBLICOS, apIaCorpoPedido, apIaMensagem, apIaLista, apIaUrl, apIaRotuloNivel };", ctx);
const j = (x) => JSON.parse(JSON.stringify(x)); // o vm tem os seus próprios Object e Array: compara por valor
const { AP_IA_NIVEIS, AP_IA_PUBLICOS, apIaCorpoPedido, apIaMensagem, apIaLista, apIaUrl, apIaRotuloNivel } = ctx.api;
assert.deepEqual(j(AP_IA_NIVEIS.map((n) => n.id)), ["rapido", "padrao", "completo"], "o Épico nunca aparece na tela");
assert.deepEqual(j(AP_IA_PUBLICOS), ["cliente", "interno"]);
assert.equal(apIaRotuloNivel().epico, undefined);
const base = { workspaceId: "w", blueprintId: "b", publico: "cliente", nivel: "padrao" };
assert.deepEqual(j(apIaCorpoPedido(base)), base, "sem sessão: terminal novo");
assert.deepEqual(j(apIaCorpoPedido({ ...base, sessao: { id: "s1", canal: true } })), { ...base, sessaoId: "s1" });
assert.deepEqual(j(apIaCorpoPedido({ ...base, sessao: { id: "s2", canal: false } })), { ...base, sessaoId: "s2", semCanal: true }, "sessão sem canal só copia o pedido");
assert.equal(apIaCorpoPedido({ ...base, nivel: "epico" }), null, "Épico não vira pedido pela tela");
assert.equal(apIaCorpoPedido({ ...base, publico: "todos" }), null);
assert.equal(apIaCorpoPedido({ ...base, blueprintId: "" }), null);
assert.equal(apIaCorpoPedido(), null);
assert(/^Pedido enviado à sessão/.test(apIaMensagem(200, {}, true)));
assert(/^Terminal aberto/.test(apIaMensagem(200, { ok: true }, false)));
assert(/Ela aparece na lista/.test(apIaMensagem(200, {}, false)));
assert(/não está mais conectada/.test(apIaMensagem(409, { codigo: "sessao-caiu" }, true)), "o código vale mais que o status");
assert(/Pasta do projeto/.test(apIaMensagem(409, {}, false)));
assert(/não achou este blueprint/.test(apIaMensagem(404, {}, false)));
assert(/Motivo: sem wt/.test(apIaMensagem(501, { codigo: "sem-terminal", erro: "sem wt" }, false)));
assert.equal(apIaMensagem(500, { erro: "falhou assim" }, false), "falhou assim", "o erro do servidor aparece como veio");
assert.equal(apIaMensagem(500, {}, false), "Não foi possível pedir a apresentação (erro 500).");
const lista = apIaLista([
{ id: "a1", titulo: "Antiga", publico: "cliente", nivel: "rapido", em: "2026-10-20T10:00:00Z" },
{ id: "b2", titulo: "Nova", publico: "interno", nivel: "completo", em: "2026-10-26T09:00:00Z" },
{ id: "../x", titulo: "Torta", em: "2026-10-27" },
{ id: "c3", titulo: "x".repeat(300), publico: "outro", nivel: "epico", em: "2026-10-22" },
null, { titulo: "sem id" },
], new Set());
assert.deepEqual(j(lista.map((a) => a.id)), ["b2", "c3", "a1"], "mais nova primeiro; id fora do padrão não entra");
assert.equal(lista[0].em, "2026-10-26T09:00:00Z", "só para a ordem: não aparece na tela");
assert.equal(lista[1].titulo.length, 120);
assert.equal(lista[1].publico, "");
assert.equal(lista[1].nivel, "", "um nível desconhecido aparece sem rótulo, a apresentação não some");
assert.deepEqual(j(apIaLista([{ id: "a1", em: "2026-10-20" }, { id: "b2", em: "2026-10-21" }], new Set(["b2"])).map((a) => a.id)), ["a1"], "as ocultas saem");
assert.deepEqual(j(apIaLista(undefined)), []);
assert.equal(apIaUrl("a1"), "/apresentacao/a1");
assert.equal(apIaUrl("a1", true), "/apresentacao/a1?baixar=1");
assert.equal(apIaUrl("../segredo"), "");
assert.equal(apIaUrl('x"onload="'), "");
console.log("apresentacao-ia: ok");