@@ -0,0 +1,549 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Tests for the Navegador Python SDK (navegador/sdk.py).
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ All tests use a mock GraphStore so no real database is required.
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from unittest.mock import MagicMock, patch
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import pytest
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.sdk import Navegador
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Helpers ───────────────────────────────────────────────────────────────────
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def _mock_store(rows=None):
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Return a mock GraphStore whose .query() yields the given rows."""
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = MagicMock()
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = MagicMock()
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result.result_set = rows or []
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store.query.return_value = result
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return store
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def _nav(rows=None):
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ """Return a Navegador instance wired to a mock store."""
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return Navegador(_mock_store(rows))
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Constructor tests ─────────────────────────────────────────────────────────
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestConstructors:
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_direct_init_stores_store(self):
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav._store is store
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_sqlite_classmethod(self):
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fake_store = _mock_store()
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.store.GraphStore.sqlite", return_value=fake_store) as mock_sqlite:
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador.sqlite("/tmp/test.db")
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sqlite.assert_called_once_with("/tmp/test.db")
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav._store is fake_store
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_sqlite_default_path(self):
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fake_store = _mock_store()
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.store.GraphStore.sqlite", return_value=fake_store) as mock_sqlite:
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Navegador.sqlite()
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sqlite.assert_called_once_with(".navegador/graph.db")
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_redis_classmethod(self):
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fake_store = _mock_store()
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.store.GraphStore.redis", return_value=fake_store) as mock_redis:
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador.redis("redis://myhost:6379")
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_redis.assert_called_once_with("redis://myhost:6379")
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav._store is fake_store
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_redis_default_url(self):
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fake_store = _mock_store()
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.store.GraphStore.redis", return_value=fake_store) as mock_redis:
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Navegador.redis()
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_redis.assert_called_once_with("redis://localhost:6379")
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Ingestion ─────────────────────────────────────────────────────────────────
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestIngest:
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_ingest_delegates_to_repo_ingester(self):
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ expected = {"files": 3, "functions": 10, "classes": 2, "edges": 5, "skipped": 0}
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.RepoIngester") as MockIngester:
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance = MockIngester.return_value
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance.ingest.return_value = expected
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = nav.ingest("/some/repo")
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MockIngester.assert_called_once_with(store)
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance.ingest.assert_called_once_with(
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "/some/repo", clear=False, incremental=False
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result == expected
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_ingest_passes_clear_and_incremental(self):
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.RepoIngester") as MockIngester:
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance = MockIngester.return_value
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance.ingest.return_value = {}
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.ingest("/repo", clear=True, incremental=True)
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_instance.ingest.assert_called_once_with(
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "/repo", clear=True, incremental=True
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Context loading ───────────────────────────────────────────────────────────
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestFileContext:
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_context_bundle(self):
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle, ContextNode
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.file_context("src/auth.py")
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(bundle, ContextBundle)
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "File"
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "auth.py"
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_file_path(self):
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.file_context("src/auth.py")
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # store.query must have been called with the file path param
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ call_args = store.query.call_args
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert call_args[0][1]["path"] == "src/auth.py"
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestFunctionContext:
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_context_bundle(self):
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.function_context("validate_token")
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(bundle, ContextBundle)
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "validate_token"
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "Function"
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_file_path_and_depth(self):
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.load_function") as mock_load:
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle, ContextNode
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.return_value = ContextBundle(
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ target=ContextNode(type="Function", name="fn")
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.function_context("fn", file_path="src/x.py", depth=3)
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.assert_called_once_with("fn", file_path="src/x.py", depth=3)
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_default_depth(self):
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.load_function") as mock_load:
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle, ContextNode
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.return_value = ContextBundle(
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ target=ContextNode(type="Function", name="fn")
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.function_context("fn")
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.assert_called_once_with("fn", file_path="", depth=2)
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestClassContext:
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_context_bundle(self):
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.class_context("AuthService")
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(bundle, ContextBundle)
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "AuthService"
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "Class"
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_file_path(self):
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.load_class") as mock_load:
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle, ContextNode
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.return_value = ContextBundle(
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ target=ContextNode(type="Class", name="AuthService")
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.class_context("AuthService", file_path="src/auth.py")
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_load.assert_called_once_with("AuthService", file_path="src/auth.py")
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestExplain:
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_context_bundle(self):
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.explain("validate_token")
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(bundle, ContextBundle)
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.metadata["query"] == "explain"
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_file_path(self):
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.explain") as mock_explain:
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextBundle, ContextNode
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_explain.return_value = ContextBundle(
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ target=ContextNode(type="Node", name="fn")
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.explain("fn", file_path="src/x.py")
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_explain.assert_called_once_with("fn", file_path="src/x.py")
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Knowledge ─────────────────────────────────────────────────────────────────
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAddConcept:
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.add_concept("JWT", description="Stateless token", domain="auth")
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ MockK.assert_called_once_with(store)
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.add_concept.assert_called_once_with(
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "JWT", description="Stateless token", domain="auth"
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAddRule:
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.add_rule("tokens must expire", severity="critical")
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.add_rule.assert_called_once_with(
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "tokens must expire", severity="critical"
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAddDecision:
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.add_decision("Use FalkorDB", rationale="Cypher + SQLite", status="accepted")
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.add_decision.assert_called_once_with(
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Use FalkorDB", rationale="Cypher + SQLite", status="accepted"
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAddPerson:
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.add_person("Alice", email="[email protected] ", role="lead")
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.add_person.assert_called_once_with(
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Alice", email="[email protected] ", role="lead"
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAddDomain:
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.add_domain("auth", description="Authentication layer")
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.add_domain.assert_called_once_with(
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "auth", description="Authentication layer"
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestAnnotate:
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_knowledge_ingester(self):
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.annotate("validate_token", "Function", concept="JWT")
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.annotate_code.assert_called_once_with(
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "validate_token", "Function", concept="JWT", rule=None
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_rule(self):
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.ingestion.KnowledgeIngester") as MockK:
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k = MockK.return_value
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.annotate("validate_token", "Function", rule="tokens must expire")
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_k.annotate_code.assert_called_once_with(
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "validate_token", "Function", concept=None, rule="tokens must expire"
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestConceptLoad:
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_context_loader(self):
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["JWT", "Stateless token auth", "active", "auth", [], [], [], []]]
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.concept("JWT")
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "JWT"
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "Concept"
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_not_found_returns_bundle_with_found_false(self):
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.concept("NonExistent")
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.metadata.get("found") is False
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestDomainLoad:
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_context_loader(self):
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["Function", "login", "src/auth.py", "Log in"]]
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.domain("auth")
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "auth"
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "Domain"
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestDecisionLoad:
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_context_loader(self):
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [[
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Use FalkorDB",
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Graph DB",
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Cypher queries",
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Neo4j",
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "accepted",
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "2026-01-01",
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "infrastructure",
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [],
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [],
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ]]
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.decision("Use FalkorDB")
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.name == "Use FalkorDB"
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.type == "Decision"
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.target.rationale == "Cypher queries"
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_not_found(self):
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bundle = nav.decision("Unknown")
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert bundle.metadata.get("found") is False
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Search ────────────────────────────────────────────────────────────────────
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestSearch:
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_returns_nodes(self):
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextNode
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["Function", "validate_token", "src/auth.py", 10, "Validate a token"]]
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = nav.search("validate")
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert len(results) == 1
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(results[0], ContextNode)
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert results[0].name == "validate_token"
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_empty(self):
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav.search("xyz") == []
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_passes_limit(self):
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.search") as mock_search:
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_search.return_value = []
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.search("auth", limit=5)
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_search.assert_called_once_with("auth", limit=5)
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestSearchAll:
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_all_returns_nodes(self):
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextNode
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["Concept", "JWT", "", None, "Stateless token auth"]]
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = nav.search_all("JWT")
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert len(results) == 1
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert results[0].type == "Concept"
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_all_passes_limit(self):
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.search_all") as mock_sa:
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sa.return_value = []
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.search_all("auth", limit=10)
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sa.assert_called_once_with("auth", limit=10)
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestSearchKnowledge:
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_knowledge_returns_nodes(self):
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextNode
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["Concept", "JWT", "Stateless token auth", "auth", "active"]]
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = nav.search_knowledge("JWT")
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert len(results) == 1
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert results[0].domain == "auth"
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_knowledge_empty(self):
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav.search_knowledge("missing") == []
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_search_knowledge_passes_limit(self):
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.search_knowledge") as mock_sk:
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sk.return_value = []
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.search_knowledge("auth", limit=3)
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_sk.assert_called_once_with("auth", limit=3)
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Graph ─────────────────────────────────────────────────────────────────────
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestQuery:
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_store(self):
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([[42]])
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = nav.query("MATCH (n) RETURN count(n)")
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store.query.assert_called_once_with("MATCH (n) RETURN count(n)", None)
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result.result_set == [[42]]
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_params(self):
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.query("MATCH (n:Function {name: $name}) RETURN n", {"name": "foo"})
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store.query.assert_called_once_with(
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "MATCH (n:Function {name: $name}) RETURN n", {"name": "foo"}
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ )
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestStats:
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_dict_with_expected_keys(self):
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ node_result = MagicMock()
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ node_result.result_set = [["Function", 5], ["Class", 2]]
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ edge_result = MagicMock()
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ edge_result.result_set = [["CALLS", 8], ["INHERITS", 1]]
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = MagicMock()
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store.query.side_effect = [node_result, edge_result]
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s = nav.stats()
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["total_nodes"] == 7
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["total_edges"] == 9
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["nodes"]["Function"] == 5
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["nodes"]["Class"] == 2
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["edges"]["CALLS"] == 8
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["edges"]["INHERITS"] == 1
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_empty_graph(self):
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ s = nav.stats()
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["total_nodes"] == 0
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["total_edges"] == 0
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["nodes"] == {}
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert s["edges"] == {}
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestExport:
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_export_graph(self):
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ expected = {"nodes": 10, "edges": 5}
472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.export.export_graph", return_value=expected) as mock_export:
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = nav.export("/tmp/out.jsonl")
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_export.assert_called_once_with(store, "/tmp/out.jsonl")
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result == expected
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestImportGraph:
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_import_graph(self):
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ expected = {"nodes": 10, "edges": 5}
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.export.import_graph", return_value=expected) as mock_import:
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ result = nav.import_graph("/tmp/in.jsonl")
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_import.assert_called_once_with(store, "/tmp/in.jsonl", clear=True)
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert result == expected
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_clear_false(self):
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.graph.export.import_graph", return_value={}) as mock_import:
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.import_graph("/tmp/in.jsonl", clear=False)
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_import.assert_called_once_with(store, "/tmp/in.jsonl", clear=False)
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestClear:
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_delegates_to_store(self):
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store()
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.clear()
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store.clear.assert_called_once()
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Owners ────────────────────────────────────────────────────────────────────
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestFindOwners:
511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_returns_person_nodes(self):
512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from navegador.context.loader import ContextNode
513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rows = [["Class", "AuthService", "Alice", "[email protected] ", "lead", "auth"]]
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav(rows)
516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ results = nav.find_owners("AuthService")
517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert len(results) == 1
518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert isinstance(results[0], ContextNode)
519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert results[0].type == "Person"
520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert results[0].name == "Alice"
521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_empty(self):
523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = _nav([])
524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert nav.find_owners("nobody") == []
525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_passes_file_path(self):
527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ store = _mock_store([])
528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav = Navegador(store)
529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with patch("navegador.context.loader.ContextLoader.find_owners") as mock_fo:
531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_fo.return_value = []
532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nav.find_owners("AuthService", file_path="src/auth.py")
533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mock_fo.assert_called_once_with("AuthService", file_path="src/auth.py")
534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ── Top-level import ──────────────────────────────────────────────────────────
537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ class TestTopLevelImport:
540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_navegador_exported_from_package(self):
541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import navegador
542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert hasattr(navegador, "Navegador")
544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert navegador.Navegador is Navegador
545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ def test_navegador_in_all(self):
547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ import navegador
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert "Navegador" in navegador.__all__