feat(okf): add minimal okf_viz Cytoscape generator with tests

Full suite green (20 tests). Smoke-tested on Google crypto_bitcoin bundle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 19:39:53 +09:00
parent 7b239dda8f
commit 75acd3aa3e
2 changed files with 151 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
import sys, tempfile, unittest
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from okf_viz import build_graph, render_html, main
FIX = Path(__file__).resolve().parent / "fixtures" / "mini_bundle"
class TestViz(unittest.TestCase):
def test_build_graph_nodes_and_edges(self):
g = build_graph(FIX)
ids = {n["id"] for n in g["nodes"]}
self.assertIn("tables/orders", ids)
self.assertTrue(any(e["source"] == "tables/orders" and e["target"] == "tables/customers"
for e in g["edges"]))
def test_render_html_embeds_data_and_cdn(self):
html = render_html(build_graph(FIX), "Mini")
self.assertIn("cytoscape", html)
self.assertIn('"nodes"', html)
def test_render_html_escapes_script_close(self):
g = {"nodes": [{"id": "x", "type": "T", "title": "x",
"description": "", "body": "</script><b>hi</b>"}], "edges": []}
html = render_html(g, "X")
self.assertNotIn("</script><b>hi", html)
def test_main_writes_file(self):
with tempfile.TemporaryDirectory() as d:
out = Path(d) / "v.html"
self.assertEqual(main(["--bundle", str(FIX), "--out", str(out)]), 0)
self.assertTrue(out.exists() and out.stat().st_size > 500)
if __name__ == "__main__":
unittest.main()