integrate evidence-grounded AI enrichment
This commit is contained in:
@@ -49,6 +49,36 @@ class Phase13ApiTests(unittest.TestCase):
|
||||
self.assertEqual(status, "not_configured"); self.assertEqual(provider, ""); self.assertEqual(version, "")
|
||||
self.assertNotIn("output", metadata)
|
||||
|
||||
def test_structured_enrichment_contract_has_classification_priority_confidence_uncertainty_and_provenance(self):
|
||||
status, business = self.request("POST", "/api/v1/businesses", {"name": "Structured Co", "website": "https://structured.test"}); self.assertEqual(status, 201)
|
||||
bid = business["id"]
|
||||
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Provides solar installation"})
|
||||
status, run = self.request("POST", f"/api/v1/businesses/{bid}/ai/suggest", {}); self.assertEqual(status, 201)
|
||||
output = run["output"]
|
||||
for key in ("classification", "summary", "priority_recommendation", "confidence", "uncertainty", "conflicts", "citations", "policy"):
|
||||
self.assertIn(key, output)
|
||||
self.assertTrue(output["citations"][0]["provenance"])
|
||||
self.assertTrue(output["citations"][0]["hash"])
|
||||
self.assertEqual(output["policy"]["claim_policy"], "stored_evidence_only")
|
||||
|
||||
def test_approval_rejects_stale_source_hashes(self):
|
||||
_, business = self.request("POST", "/api/v1/businesses", {"name": "Stale Co"})
|
||||
bid = business["id"]
|
||||
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Original claim"})
|
||||
_, run = self.request("POST", f"/api/v1/businesses/{bid}/ai/suggest", {})
|
||||
self.request("POST", f"/api/v1/businesses/{bid}/evidence", {"kind": "source", "url": "https://source.test", "claim": "Changed claim"})
|
||||
status, result = self.request("POST", f"/api/v1/ai-runs/{run['id']}/approve", {})
|
||||
self.assertEqual(status, 409); self.assertEqual(result["error"], "ai_run_stale")
|
||||
|
||||
def test_remote_provider_is_not_configured_and_status_never_makes_network_call(self):
|
||||
os.environ["AI_PROVIDER"] = "openai"
|
||||
status, provider, version, metadata = generate({"name": "Remote"}, [], [], [])
|
||||
self.assertEqual(status, "not_configured"); self.assertEqual(provider, "openai"); self.assertNotIn("output", metadata)
|
||||
status, result = self.request("GET", "/api/v1/ai/provider-config")
|
||||
self.assertEqual(status, 200); self.assertEqual(result["status"], "not_configured"); self.assertFalse(result["network_enabled"])
|
||||
status, result = self.request("POST", "/api/v1/ai/provider-config", {"provider": "openai", "enabled": True, "reviewed": True})
|
||||
self.assertEqual(status, 409); self.assertFalse(result["network_enabled"])
|
||||
|
||||
def test_endpoint_persists_citations_and_approval_without_crm_write(self):
|
||||
status, business = self.request("POST", "/api/v1/businesses", {"name": "Evidence Co", "website": "https://evidence.test"}); self.assertEqual(status, 201)
|
||||
bid = business["id"]
|
||||
|
||||
Reference in New Issue
Block a user