// Tests del parser de bloques osintdb. Se ejecutan con `node --test tests/` // gracias al type stripping nativo de Node (>= 23), sin necesidad de Obsidian. import { test } from "node:test"; import assert from "node:assert/strict"; import { parseBlock } from "../parse.ts"; test("SQL crudo: el bloque entero es la sentencia", () => { const r = parseBlock("SELECT * FROM main.personas LIMIT 10;"); assert.equal(r.sql, "SELECT * FROM main.personas LIMIT 10;"); assert.equal(r.query, undefined); assert.equal(r.error, undefined); }); test("SQL multilínea se conserva entero", () => { const src = "SELECT nombre, contexto\nFROM main.personas\nWHERE contexto = 'caso_x'"; const r = parseBlock(src); assert.equal(r.sql, src); }); test("query nombrada con max_rows", () => { const r = parseBlock("query: personas_por_contexto\nmax_rows: 100"); assert.equal(r.query, "personas_por_contexto"); assert.equal(r.maxRows, 100); assert.equal(r.sql, undefined); assert.equal(r.error, undefined); }); test("directivas title y max_rows seguidas de SQL crudo", () => { const r = parseBlock("title: Personas\nmax_rows: 50\nSELECT * FROM main.personas"); assert.equal(r.title, "Personas"); assert.equal(r.maxRows, 50); assert.equal(r.sql, "SELECT * FROM main.personas"); }); test("líneas en blanco iniciales se ignoran", () => { const r = parseBlock("\n\nquery: dominios_activos"); assert.equal(r.query, "dominios_activos"); }); test("bloque vacío devuelve error", () => { const r = parseBlock(" \n "); assert.ok(r.error); }); test("max_rows no numérico devuelve error", () => { const r = parseBlock("max_rows: muchas\nSELECT 1"); assert.ok(r.error?.includes("max_rows")); }); test("query sin nombre devuelve error", () => { const r = parseBlock("query: "); assert.ok(r.error); }); test("mezclar query nombrada con SQL devuelve error", () => { const r = parseBlock("query: personas\nSELECT 1"); assert.ok(r.error?.includes("mezcla")); }); test("un SELECT que contiene dos puntos no se confunde con directiva", () => { const src = "SELECT 'query: falsa' AS texto FROM main.personas"; const r = parseBlock(src); assert.equal(r.sql, src); assert.equal(r.query, undefined); });