Milestone 0 plus the manual-registry spine from Milestone 1

This commit is contained in:
2026-04-25 22:00:26 +02:00
parent a833d4f82c
commit 3b2d1667bb
13 changed files with 1000 additions and 2 deletions

View File

@@ -0,0 +1,98 @@
from repo_registry.core.service import RegistryService
from repo_registry.storage.sqlite import NotFoundError, RegistryStore
def make_service(tmp_path):
store = RegistryStore(tmp_path / "registry.sqlite3")
store.initialize()
return RegistryService(store)
def test_manual_registry_builds_ability_map(tmp_path):
service = make_service(tmp_path)
repository = service.register_repository(
name="MailRouter",
url="https://example.com/mail-router.git",
description="Routes incoming customer email",
)
ability_id = service.add_ability(
repository.id,
name="Business Email Routing",
description="Route inbound messages to the right department.",
confidence=0.92,
)
capability_id = service.add_capability(
repository.id,
ability_id,
name="Classify Incoming Email",
description="Classify messages into intent categories.",
inputs=["subject", "body"],
outputs=["intent", "confidence"],
confidence=0.88,
)
service.add_feature(
repository.id,
capability_id,
name="POST /api/classify-email",
type="REST endpoint",
location="src/routes/classify_email.py",
confidence=0.84,
)
service.add_evidence(
repository.id,
capability_id,
type="unit_test",
reference="tests/test_email_classification.py",
strength="strong",
)
ability_map = service.ability_map(repository.id)
assert ability_map.repository.name == "MailRouter"
assert ability_map.abilities[0].name == "Business Email Routing"
capability = ability_map.abilities[0].capabilities[0]
assert capability.name == "Classify Incoming Email"
assert capability.inputs == ["subject", "body"]
assert capability.features[0].location == "src/routes/classify_email.py"
assert capability.evidence[0].strength == "strong"
def test_search_matches_approved_abilities_and_capabilities(tmp_path):
service = make_service(tmp_path)
repository = service.register_repository(
name="MailRouter",
url="https://example.com/mail-router.git",
)
ability_id = service.add_ability(
repository.id,
name="Business Email Routing",
description="Route inbound messages.",
)
service.add_capability(
repository.id,
ability_id,
name="Classify Incoming Email",
description="Classify messages into intent categories.",
)
results = service.search("classify")
assert len(results) == 1
assert results[0].repository_name == "MailRouter"
assert results[0].match_type == "capability"
assert results[0].match_name == "Classify Incoming Email"
def test_capability_must_belong_to_repository(tmp_path):
service = make_service(tmp_path)
first = service.register_repository(name="First", url="https://example.com/first.git")
second = service.register_repository(name="Second", url="https://example.com/second.git")
ability_id = service.add_ability(first.id, name="Document Classification")
try:
service.add_capability(second.id, ability_id, name="Classify Document")
except NotFoundError as exc:
assert "ability" in str(exc)
else:
raise AssertionError("expected a NotFoundError")

69
tests/test_web_api.py Normal file
View File

@@ -0,0 +1,69 @@
from fastapi.testclient import TestClient
from repo_registry.web_api.app import Settings, app, get_settings
def test_api_manual_registry_loop(tmp_path):
def override_settings():
return Settings(database_path=str(tmp_path / "api.sqlite3"))
app.dependency_overrides[get_settings] = override_settings
client = TestClient(app)
try:
repository_response = client.post(
"/repos",
json={
"name": "MailRouter",
"url": "https://example.com/mail-router.git",
"description": "Routes incoming customer email",
},
)
assert repository_response.status_code == 201
repository_id = repository_response.json()["id"]
ability_response = client.post(
f"/repos/{repository_id}/abilities",
json={
"name": "Business Email Routing",
"description": "Route inbound messages.",
},
)
assert ability_response.status_code == 201
ability_id = ability_response.json()["id"]
capability_response = client.post(
f"/repos/{repository_id}/capabilities",
json={
"ability_id": ability_id,
"name": "Classify Incoming Email",
"inputs": ["subject", "body"],
"outputs": ["intent"],
},
)
assert capability_response.status_code == 201
capability_id = capability_response.json()["id"]
feature_response = client.post(
f"/repos/{repository_id}/features",
json={
"capability_id": capability_id,
"name": "POST /api/classify-email",
"type": "REST endpoint",
"location": "src/routes/classify_email.py",
},
)
assert feature_response.status_code == 201
map_response = client.get(f"/repos/{repository_id}/ability-map")
assert map_response.status_code == 200
ability_map = map_response.json()
assert ability_map["repository"]["name"] == "MailRouter"
assert ability_map["abilities"][0]["capabilities"][0]["name"] == (
"Classify Incoming Email"
)
search_response = client.get("/search", params={"q": "email"})
assert search_response.status_code == 200
assert search_response.json()
finally:
app.dependency_overrides.clear()