fix(enrichers): split_sentences y extract_iocs_text leen entities.notes
El campo `notes` es lo que el usuario escribe en el panel Note del
Inspector (doble click sobre el nodo) — sitio canonico para texto
largo. Antes los enrichers leian metadata.text/description/query como
prioridad, dejando notes ignorado y forzando al usuario a inyectar
texto via la UI metadata-extra (poco descubrible).
Cambios:
- Ambos run.py abren la BD y leen `entities.notes` por SQL antes de
fallback a node_name. metadata.text/description/query ya no se
consultan (KISS — solo notes y name).
- conftest.make_node admite kwarg `notes` para inyectar contenido
en la columna notes desde tests.
- Tests actualizados: SAMPLE_TEXT y los IoC dumps van por `notes=`
en lugar de `metadata={"text": ...}`.
- Renombrado el test que verificaba prioridad: ahora se llama
`*_uses_notes_priority` y verifica notes > name.
Tests verdes WSL (44) y Windows (33 + 11 skipped).
This commit is contained in:
@@ -32,10 +32,9 @@ def _ioc_paragraph(n: int) -> str:
|
||||
def test_extract_iocs_text_finds_email_and_ip(ops_db, app_dir, registry_root):
|
||||
"""Texto con emails, IPs, CVE, hash → entidades creadas con tipos correctos."""
|
||||
make_node(ops_db, node_id="t1", name="incident",
|
||||
type_ref="text", metadata={"text": SAMPLE_TEXT})
|
||||
type_ref="text", notes=SAMPLE_TEXT)
|
||||
ctx = base_ctx(ops_db=ops_db, app_dir=app_dir, registry_root=registry_root,
|
||||
node_id="t1", node_name="incident", node_type="text",
|
||||
metadata={"text": SAMPLE_TEXT})
|
||||
node_id="t1", node_name="incident", node_type="text")
|
||||
|
||||
rc, out, err = run_enricher("extract_iocs_text", ctx)
|
||||
assert rc == 0, err
|
||||
@@ -53,17 +52,16 @@ def test_extract_iocs_text_finds_email_and_ip(ops_db, app_dir, registry_root):
|
||||
assert all(r["to_entity"] == "t1" for r in rels)
|
||||
|
||||
|
||||
def test_extract_iocs_text_uses_metadata_text(ops_db, app_dir, registry_root):
|
||||
"""metadata.text se prioriza sobre node_name."""
|
||||
def test_extract_iocs_text_uses_notes_priority(ops_db, app_dir, registry_root):
|
||||
"""`entities.notes` se prioriza sobre node_name."""
|
||||
make_node(ops_db, node_id="t1", name="placeholder",
|
||||
type_ref="text", metadata={"text": SAMPLE_TEXT})
|
||||
type_ref="text", notes=SAMPLE_TEXT)
|
||||
ctx = base_ctx(ops_db=ops_db, app_dir=app_dir, registry_root=registry_root,
|
||||
node_id="t1", node_name="placeholder", node_type="text",
|
||||
metadata={"text": SAMPLE_TEXT})
|
||||
node_id="t1", node_name="placeholder", node_type="text")
|
||||
rc, out, err = run_enricher("extract_iocs_text", ctx)
|
||||
assert rc == 0, err
|
||||
# El name "placeholder" no contiene IoCs; si se hubiese usado, no
|
||||
# habria entidades. Ergo entities_added > 0 demuestra que leyo text.
|
||||
# habria entidades. Ergo entities_added > 0 demuestra que leyo notes.
|
||||
assert out["entities_added"] >= 2, out
|
||||
|
||||
|
||||
@@ -83,10 +81,9 @@ def test_extract_iocs_text_above_threshold_creates_group(ops_db, app_dir,
|
||||
""">=50 IoCs → Group heterogeneo con todos dentro (fase 1)."""
|
||||
text = _ioc_paragraph(180) # ~60 emails + ~60 IPs + ~60 CVEs
|
||||
make_node(ops_db, node_id="t1", name="dump",
|
||||
type_ref="text", metadata={"text": text})
|
||||
type_ref="text", notes=text)
|
||||
ctx = base_ctx(ops_db=ops_db, app_dir=app_dir, registry_root=registry_root,
|
||||
node_id="t1", node_name="dump", node_type="text",
|
||||
metadata={"text": text})
|
||||
node_id="t1", node_name="dump", node_type="text")
|
||||
rc, out, err = run_enricher("extract_iocs_text", ctx)
|
||||
assert rc == 0, err
|
||||
assert out["iocs_found"] >= 50, out
|
||||
|
||||
Reference in New Issue
Block a user