Navegador

navegador / tests / test_ingestion_knowledge.py
Blame History Raw 201 lines
1
"""Tests for KnowledgeIngester — manual knowledge curation."""
2
3
from unittest.mock import MagicMock
4
5
import pytest
6
7
from navegador.graph.schema import EdgeType, NodeLabel
8
from navegador.ingestion.knowledge import KnowledgeIngester
9
10
11
def _mock_store():
12
return MagicMock()
13
14
15
class TestKnowledgeIngesterDomains:
16
def test_add_domain(self):
17
store = _mock_store()
18
k = KnowledgeIngester(store)
19
k.add_domain("auth", description="Authentication layer")
20
store.create_node.assert_called_once_with(
21
NodeLabel.Domain, {"name": "auth", "description": "Authentication layer"}
22
)
23
24
def test_add_domain_no_description(self):
25
store = _mock_store()
26
k = KnowledgeIngester(store)
27
k.add_domain("billing")
28
store.create_node.assert_called_once()
29
30
31
class TestKnowledgeIngesterConcepts:
32
def test_add_concept_minimal(self):
33
store = _mock_store()
34
k = KnowledgeIngester(store)
35
k.add_concept("JWT")
36
store.create_node.assert_called_once_with(
37
NodeLabel.Concept,
38
{"name": "JWT", "description": "", "domain": "", "status": "",
39
"rules": "", "examples": "", "wiki_refs": ""}
40
)
41
42
def test_add_concept_with_domain_creates_edge(self):
43
store = _mock_store()
44
k = KnowledgeIngester(store)
45
k.add_concept("JWT", domain="auth")
46
# Should create Domain node + BELONGS_TO edge
47
assert store.create_node.call_count == 2
48
store.create_edge.assert_called_once()
49
edge_call = store.create_edge.call_args
50
assert edge_call[0][2] == EdgeType.BELONGS_TO
51
52
def test_relate_concepts(self):
53
store = _mock_store()
54
k = KnowledgeIngester(store)
55
k.relate_concepts("JWT", "OAuth")
56
store.create_edge.assert_called_once_with(
57
NodeLabel.Concept, {"name": "JWT"},
58
EdgeType.RELATED_TO,
59
NodeLabel.Concept, {"name": "OAuth"},
60
)
61
62
63
class TestKnowledgeIngesterRules:
64
def test_add_rule(self):
65
store = _mock_store()
66
k = KnowledgeIngester(store)
67
k.add_rule("Tokens must expire", severity="critical")
68
call_args = store.create_node.call_args[0]
69
assert call_args[0] == NodeLabel.Rule
70
assert call_args[1]["severity"] == "critical"
71
72
def test_rule_governs(self):
73
store = _mock_store()
74
k = KnowledgeIngester(store)
75
k.rule_governs("Tokens must expire", "JWT", NodeLabel.Concept)
76
store.create_edge.assert_called_once_with(
77
NodeLabel.Rule, {"name": "Tokens must expire"},
78
EdgeType.GOVERNS,
79
NodeLabel.Concept, {"name": "JWT"},
80
)
81
82
83
class TestKnowledgeIngesterDecisions:
84
def test_add_decision(self):
85
store = _mock_store()
86
k = KnowledgeIngester(store)
87
k.add_decision("Use JWT", status="accepted", rationale="Horizontal scaling")
88
call_args = store.create_node.call_args[0]
89
assert call_args[0] == NodeLabel.Decision
90
assert call_args[1]["status"] == "accepted"
91
assert call_args[1]["rationale"] == "Horizontal scaling"
92
93
94
class TestKnowledgeIngesterPeople:
95
def test_add_person(self):
96
store = _mock_store()
97
k = KnowledgeIngester(store)
98
k.add_person("Alice", email="[email protected]", role="lead", team="auth")
99
store.create_node.assert_called_once_with(
100
NodeLabel.Person,
101
{"name": "Alice", "email": "[email protected]", "role": "lead", "team": "auth"}
102
)
103
104
def test_assign(self):
105
store = _mock_store()
106
k = KnowledgeIngester(store)
107
k.assign("validate_token", NodeLabel.Function, "Alice")
108
store.create_edge.assert_called_once_with(
109
NodeLabel.Function, {"name": "validate_token"},
110
EdgeType.ASSIGNED_TO,
111
NodeLabel.Person, {"name": "Alice"},
112
)
113
114
115
class TestKnowledgeIngesterWiki:
116
def test_wiki_page(self):
117
store = _mock_store()
118
k = KnowledgeIngester(store)
119
k.wiki_page("Auth Guide", url="https://example.com", source="github", content="# Auth")
120
call_args = store.create_node.call_args[0]
121
assert call_args[0] == NodeLabel.WikiPage
122
assert call_args[1]["name"] == "Auth Guide"
123
124
def test_wiki_documents(self):
125
store = _mock_store()
126
k = KnowledgeIngester(store)
127
k.wiki_documents("Auth Guide", "JWT", {"name": "JWT"}, NodeLabel.Concept)
128
store.create_edge.assert_called_once_with(
129
NodeLabel.WikiPage, {"name": "Auth Guide"},
130
EdgeType.DOCUMENTS,
131
NodeLabel.Concept, {"name": "JWT"},
132
)
133
134
135
class TestKnowledgeIngesterAnnotate:
136
def test_annotate_with_concept(self):
137
store = _mock_store()
138
k = KnowledgeIngester(store)
139
k.annotate_code("validate_token", "Function", concept="JWT")
140
store.create_edge.assert_called_once_with(
141
NodeLabel.Concept, {"name": "JWT"},
142
EdgeType.ANNOTATES,
143
NodeLabel.Function, {"name": "validate_token"},
144
)
145
146
def test_annotate_with_rule(self):
147
store = _mock_store()
148
k = KnowledgeIngester(store)
149
k.annotate_code("validate_token", "Function", rule="Tokens must expire")
150
store.create_edge.assert_called_once_with(
151
NodeLabel.Rule, {"name": "Tokens must expire"},
152
EdgeType.ANNOTATES,
153
NodeLabel.Function, {"name": "validate_token"},
154
)
155
156
def test_annotate_with_both(self):
157
store = _mock_store()
158
k = KnowledgeIngester(store)
159
k.annotate_code("validate_token", "Function", concept="JWT", rule="Tokens must expire")
160
assert store.create_edge.call_count == 2
161
162
def test_code_implements(self):
163
store = _mock_store()
164
k = KnowledgeIngester(store)
165
k.code_implements("validate_token", "Function", "JWT")
166
store.create_edge.assert_called_once_with(
167
NodeLabel.Function, {"name": "validate_token"},
168
EdgeType.IMPLEMENTS,
169
NodeLabel.Concept, {"name": "JWT"},
170
)
171
172
def test_annotate_invalid_label_raises(self):
173
store = _mock_store()
174
k = KnowledgeIngester(store)
175
with pytest.raises(ValueError):
176
k.annotate_code("foo", "InvalidLabel", concept="Bar")
177
178
179
class TestKnowledgeIngesterRuleWithDomain:
180
def test_add_rule_with_domain_creates_link(self):
181
from navegador.graph.schema import EdgeType
182
store = _mock_store()
183
k = KnowledgeIngester(store)
184
k.add_rule("Tokens must expire", domain="auth", severity="critical")
185
# create_node called twice: once for rule, once for domain
186
assert store.create_node.call_count == 2
187
# BELONGS_TO edge created
188
edge_calls = [c[0][2] for c in store.create_edge.call_args_list]
189
assert EdgeType.BELONGS_TO in edge_calls
190
191
192
class TestKnowledgeIngesterDecisionWithDomain:
193
def test_add_decision_with_domain_creates_link(self):
194
from navegador.graph.schema import EdgeType
195
store = _mock_store()
196
k = KnowledgeIngester(store)
197
k.add_decision("Use PostgreSQL", domain="infra", status="accepted")
198
assert store.create_node.call_count == 2
199
edge_calls = [c[0][2] for c in store.create_edge.call_args_list]
200
assert EdgeType.BELONGS_TO in edge_calls
201

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button