Files
agent 011ccfb8cd feat: scaffold inicial del plugin de Obsidian osint_obsidian_plugin
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>
2026-06-12 23:58:04 +02:00

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);
});