From 040ad73e6df63bc6dee7a0d707b7b00304c30d7e Mon Sep 17 00:00:00 2001 From: leocagli Date: Sun, 30 Aug 2026 14:17:13 -0300 Subject: [PATCH 1/2] fix(test): el smoke de SAIJ vuelve a pasar, y ahora tambien cubre legislacion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SAIJ cambio dos cosas y el smoke test las detecto, que es para lo que fue escrito. Venia 0 de 8 con 6 fallos y 2 saltados. Primera: las respuestas ahora vienen envueltas en un nivel `document`. Lo que estaba en `abs.content` esta en `abs.document.content`. El test buscaba `abs.content.titulo`, no lo encontraba, y caia al fallback `abs.document`, que antes era un string y hoy es un objeto: de ahi los seis "'titulo' no es string". Segunda: el filtro de legislacion ahora lleva tilde. "Legislacion" devuelve cero resultados y "Legislación" devuelve. Por eso ese test se salteaba en silencio, que en un repo legal es el peor de los tres estados. El titulo ademas se llama distinto en cada tipo y ninguno coincide: `titulo` en jurisprudencia, `titulo-doctrina` en doctrina, `titulo-norma` en legislacion. Va por una funcion que los cubre a los tres. Las dos formas de respuesta se aceptan, la vieja y la nueva, para que el test no se rompa si SAIJ vuelve atras. Queda 4 de 4, sin saltados. Co-Authored-By: Claude Opus 5 --- test/saij-smoke-test.mjs | 43 ++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/test/saij-smoke-test.mjs b/test/saij-smoke-test.mjs index 2062e9e..2333ae3 100644 --- a/test/saij-smoke-test.mjs +++ b/test/saij-smoke-test.mjs @@ -89,6 +89,32 @@ async function httpGetJson(url) { // ---------- Contrato de salida esperado ---------- +/** + * El contenido de un resultado, sea cual sea la forma que devuelva SAIJ. + * + * Hasta agosto de 2026 venia como { content: {...} }. Ahora viene envuelto en + * { document: { metadata, content } }. Se aceptan las dos: asi el test no se + * rompe el dia que SAIJ vuelva atras. + */ +function contenidoDe(abs) { + return abs?.document?.content ?? abs?.content ?? {}; +} + +/** + * El titulo se llama distinto en cada tipo de documento y ninguno coincide. + * Antes no se notaba porque el fallback terminaba en abs.document, que era un + * string; ahora abs.document es un objeto, asi que caer al fallback devolvia + * un objeto y el test fallaba con "'titulo' no es string". + */ +function tituloDe(c) { + return c["titulo"] || c["titulo-doctrina"] || c["titulo-norma"] || + c["caratula"] || c["standard-name"] || ""; +} + +function textoDe(c) { + return c["texto"] || c["sumario"] || c["sintesis"] || c["texto-completo"] || ""; +} + function validarResultado(r, index) { const errores = []; @@ -131,7 +157,7 @@ function validarResultado(r, index) { async function probarBusqueda(tipo, consulta, label) { const facetMap = { jurisprudencia: "Total|Tipo de Documento/Jurisprudencia", - legislacion: "Total|Tipo de Documento/Legislacion", + legislacion: "Total|Tipo de Documento/Legislación", doctrina: "Total|Tipo de Documento/Doctrina", }; const facet = facetMap[tipo]; @@ -190,11 +216,12 @@ async function probarBusqueda(tipo, consulta, label) { continue; } + const c = contenidoDe(abs); const resultado = { uuid: it.uuid, url: BASE + "/" + it.uuid, - titulo: abs?.content?.titulo || abs?.content?.caratula || abs?.document || "(sin titulo)", - texto: abs?.content?.texto || abs?.content?.sintesis || abs?.content?.sumario || "", + titulo: tituloDe(c) || "(sin titulo)", + texto: textoDe(c), }; const v = validarResultado(resultado, i); @@ -254,19 +281,19 @@ async function probarDocumento() { return; } - const metadata = doc.metadata || {}; - const content = doc.content || {}; + const metadata = doc?.document?.metadata ?? doc.metadata ?? {}; + const content = contenidoDe(doc); - if (!metadata["document-content-type"] && !content.titulo) { + if (!metadata["document-content-type"] && !tituloDe(content)) { skip("saij_documento", "documento devuelto sin metadatos reconocibles"); return; } const errores = []; - if (!content.titulo && !content.caratula && !content["titulo-norma"]) { + if (!tituloDe(content)) { errores.push("sin titulo reconocible en el documento"); } - if (!content.texto && !content["texto-completo"] && !content.sintesis) { + if (!textoDe(content)) { errores.push("sin texto en el documento"); } From 803be881cbd6a24593667c97f0a5afcf600b5f38 Mon Sep 17 00:00:00 2001 From: leocagli Date: Sun, 30 Aug 2026 14:34:33 -0300 Subject: [PATCH 2/2] fix(ci): el smoke test vuelve a ejecutarse, que hasta ahora nunca paso El workflow pedia `cache: "npm"` en setup-node y el repo no tiene lockfile. setup-node aborta el job al no encontrarlo, asi que moria en "Setup Node.js" y el paso de tests quedaba skipped. O sea que el CI de este repo nunca corrio, ni una vez, desde que se agrego el 17 de agosto. Y el log decia "Smoke tests failed", que es peor que fallar: no habia fallado ningun test porque no se ejecuto ninguno. No hay nada que cachear. El smoke usa fetch pelado, sin dependencias. Co-Authored-By: Claude Opus 5 --- .github/workflows/saij-smoke.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/saij-smoke.yml b/.github/workflows/saij-smoke.yml index 1f99bf2..fc75cd5 100644 --- a/.github/workflows/saij-smoke.yml +++ b/.github/workflows/saij-smoke.yml @@ -39,7 +39,10 @@ jobs: uses: actions/setup-node@v4 with: node-version: "20" - cache: "npm" + # Sin `cache: "npm"`: este repo no tiene lockfile y setup-node aborta + # el job entero al no encontrarlo. El paso de tests quedaba `skipped` + # y el log decia "Smoke tests failed" sin que corriera un solo test. + # No hay nada que cachear: el smoke usa fetch, sin dependencias. - name: Run SAIJ smoke tests id: smoke