011ccfb8cd
Plugin fino (id osint-db) que habla HTTP con el service local osint_db (FastAPI + DuckDB) y renderiza tablas de datos en las notas del vault osint mediante el code block osintdb. Incluye parser puro de directivas con tests (node --test), settings tab, comando de paleta, enlaces internos para columnas note_path, build con esbuild + tsc y deploy.sh al vault. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
// 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);
|
|
});
|