import os import re import sys import unittest HERE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.join(HERE, "..", "scripts")) from agent import resolve_case_reference class FakeCorpus: def __init__(self): self.meta = { "babu-specific": { "case_name": "Babu Lal vs Hazari Lal Klshori Lal & Ors", "neutral_citation": "1982 INSC 11", "year": 1982, }, "babu-other": { "case_name": "Babu Lal vs State Of Uttar Pradesh", "neutral_citation": "1964 INSC 40", "year": 1964, }, "bachan-death": { "case_name": "Bachan Singh vs State Of Punjab", "neutral_citation": "1980 INSC 120", "year": 1980, }, "bachan-service": { "case_name": "Bachan Singh & Anr vs Union Of India & Ors", "neutral_citation": "1972 INSC 85", "year": 1972, }, } def is_retrieval_eligible(self, doc_id): return str(doc_id) in self.meta def _card(self, doc_id): return {"doc_id": str(doc_id), **self.meta[str(doc_id)]} @staticmethod def _normal(value): return re.sub(r"[^a-z0-9]+", " ", str(value).lower()).strip() def identity_hits(self, query): normalized = self._normal(query) for doc_id, item in self.meta.items(): if normalized == self._normal(item["case_name"]): return [doc_id], "case name" if normalized == self._normal(item["neutral_citation"]): return [doc_id], "citation" return [], None def name_lookup(self, name, k=4): query_tokens = set(self._normal(name).split()) - {"v", "vs", "versus", "and", "anr", "ors"} ranked = [] for doc_id, item in self.meta.items(): title_tokens = set(self._normal(item["case_name"]).split()) overlap = len(query_tokens & title_tokens) if overlap: ranked.append((overlap, doc_id)) ranked.sort(reverse=True) return [self._card(doc_id) for _, doc_id in ranked[:k]] class CaseReferenceResolutionTest(unittest.TestCase): def setUp(self): self.corpus = FakeCorpus() def test_full_party_title_resolves_without_vector_search(self): result = resolve_case_reference( self.corpus, "Babu Lal vs Hazari Lal Klshori Lal & Ors" ) self.assertEqual(result["status"], "resolved") self.assertEqual(result["case"]["doc_id"], "babu-specific") def test_short_name_binds_to_active_case(self): result = resolve_case_reference( self.corpus, "Babu Lal", active_case_id="babu-specific" ) self.assertEqual(result["status"], "resolved") self.assertEqual(result["source"], "active_case") def test_short_name_binds_to_unique_recent_result(self): result = resolve_case_reference( self.corpus, "Babu Lal", recent_case_ids=["babu-specific"] ) self.assertEqual(result["status"], "resolved") self.assertEqual(result["source"], "recent_result") def test_fresh_ambiguous_name_requires_user_selection(self): result = resolve_case_reference(self.corpus, "Bachan Singh") self.assertEqual(result["status"], "ambiguous") self.assertGreaterEqual(len(result["candidates"]), 2) def test_missing_case_is_reported_as_not_found(self): result = resolve_case_reference( self.corpus, "Anne Besant National Girls High School" ) self.assertEqual(result["status"], "not_found") self.assertEqual(result["candidates"], []) if __name__ == "__main__": unittest.main()