from __future__ import annotations import importlib import sys from datetime import UTC, date, datetime from pathlib import Path from fastapi.testclient import TestClient def get_retrieval_test_client() -> TestClient: repo_root = Path(__file__).resolve().parents[2] retrieval_service_root = repo_root / "services" / "retrieval-service" for module_name in list(sys.modules): if module_name == "app" or module_name.startswith("app."): del sys.modules[module_name] if str(retrieval_service_root) not in sys.path: sys.path.insert(0, str(retrieval_service_root)) importlib.invalidate_caches() from app.db.base import Base # type: ignore from app.db.models import ( # type: ignore ApprovalState, Chunk, Claim, ClaimEvidenceLink, ClaimRelationship, EvidenceAssessment, GraphRelationType, Source, SourceClass, SourceVersion, StrengthBand, SupportType, SensitivityClass, ) from app.db.session import SessionLocal, engine # type: ignore from app.main import app # type: ignore Base.metadata.create_all(bind=engine) with SessionLocal() as session: if session.query(Source).count() == 0: now = datetime.now(UTC) session.add_all( [ Source( source_id="LBL-NSCLC-DRUGA-EMA-2024", source_class=SourceClass.LBL, title="DRUG-A label", therapy_area="NSCLC", molecule="DRUG-A", geography="EU / EMA", audience_scope=["HCP", "Internal"], sensitivity_class=SensitivityClass.EXTERNAL, approval_state=ApprovalState.APPROVED, current_version_id="ver-lbl-1", hygiene_status="active", created_at=now, updated_at=now, ), Source( source_id="SOP-MED-NSCLC-010", source_class=SourceClass.SOP_MED, title="Medical SOP", therapy_area="NSCLC", molecule="DRUG-A", geography="EU / EMA", audience_scope=["Internal"], sensitivity_class=SensitivityClass.INTERNAL_ONLY, approval_state=ApprovalState.APPROVED, current_version_id="ver-sop-1", hygiene_status="active", created_at=now, updated_at=now, ), Source( source_id="DOC-CSR-NSCLC-014", source_class=SourceClass.DOC_CSR, title="CSR summary", therapy_area="NSCLC", molecule="DRUG-A", geography="EU / EMA", audience_scope=["HCP", "Internal"], sensitivity_class=SensitivityClass.EXTERNAL, approval_state=ApprovalState.APPROVED, current_version_id="ver-csr-1", hygiene_status="active", created_at=now, updated_at=now, ), SourceVersion( version_id="ver-lbl-1", source_id="LBL-NSCLC-DRUGA-EMA-2024", version_label="v1", approval_state=ApprovalState.APPROVED, approval_date=date(2024, 1, 1), is_latest_approved=True, created_at=now, ), SourceVersion( version_id="ver-sop-1", source_id="SOP-MED-NSCLC-010", version_label="v1", approval_state=ApprovalState.APPROVED, approval_date=date(2025, 1, 1), is_latest_approved=True, created_at=now, ), SourceVersion( version_id="ver-csr-1", source_id="DOC-CSR-NSCLC-014", version_label="v1", approval_state=ApprovalState.APPROVED, approval_date=date(2025, 2, 1), is_latest_approved=True, created_at=now, ), Chunk( chunk_id="chk-lbl-1", source_id="LBL-NSCLC-DRUGA-EMA-2024", version_id="ver-lbl-1", text="The recommended dose is 80 mg once daily for first-line metastatic NSCLC. Dose reductions remain within approved label boundaries.", claim_type="dose", section_path="2 POSOLOGY", page_start=2, page_end=2, token_count=17, audience_fit=["HCP", "Internal"], geography_fit="EU / EMA", therapy_area="NSCLC", created_at=now, ), Chunk( chunk_id="chk-sop-1", source_id="SOP-MED-NSCLC-010", version_id="ver-sop-1", text="Internal responders should preserve approved dose boundaries and citation discipline.", claim_type="dose", section_path="DOSING GUIDANCE", page_start=1, page_end=1, token_count=10, audience_fit=["Internal"], geography_fit="EU / EMA", therapy_area="NSCLC", created_at=now, ), Chunk( chunk_id="chk-csr-1", source_id="DOC-CSR-NSCLC-014", version_id="ver-csr-1", text="DRUG-A improves progression-free survival in EGFR-positive NSCLC and supports efficacy interpretation.", claim_type="efficacy", section_path="RESULTS", page_start=5, page_end=5, token_count=12, audience_fit=["HCP", "Internal"], geography_fit="EU / EMA", therapy_area="NSCLC", created_at=now, ), Claim( claim_id="clm-lbl-1", canonical_text="Dose reductions must remain within approved label boundaries.", claim_type="dose", molecule_id="DRUG-A", geography_id="EU / EMA", approval_state="approved", primary_source_id="LBL-NSCLC-DRUGA-EMA-2024", current_evidence_score=0.92, strength_band=StrengthBand.HIGH, created_at=now, ), Claim( claim_id="clm-csr-1", canonical_text="DRUG-A improves progression-free survival in EGFR-positive NSCLC.", claim_type="efficacy", molecule_id="DRUG-A", geography_id="EU / EMA", approval_state="approved", primary_source_id="DOC-CSR-NSCLC-014", current_evidence_score=0.88, strength_band=StrengthBand.HIGH, created_at=now, ), ClaimEvidenceLink( claim_id="clm-lbl-1", chunk_id="chk-lbl-1", source_id="LBL-NSCLC-DRUGA-EMA-2024", support_type=SupportType.PRIMARY, extraction_confidence=0.99, is_primary_support=True, ), ClaimEvidenceLink( claim_id="clm-csr-1", chunk_id="chk-csr-1", source_id="DOC-CSR-NSCLC-014", support_type=SupportType.PRIMARY, extraction_confidence=0.95, is_primary_support=True, ), EvidenceAssessment( assessment_id="asm-1", claim_id="clm-lbl-1", source_prior_score=0.95, recency_score=0.90, approval_score=1.0, sme_score=0.7, consistency_score=0.9, audience_fit_score=1.0, geography_fit_score=1.0, penalty_score=0.0, evidence_score=0.92, strength_band=StrengthBand.HIGH, explanation_json={"reasons": ["Label source present"]}, scored_at=now, ), EvidenceAssessment( assessment_id="asm-2", claim_id="clm-csr-1", source_prior_score=0.75, recency_score=0.90, approval_score=1.0, sme_score=0.6, consistency_score=0.95, audience_fit_score=1.0, geography_fit_score=1.0, penalty_score=0.0, evidence_score=0.88, strength_band=StrengthBand.HIGH, explanation_json={"reasons": ["CSR evidence present"]}, scored_at=now, ), ClaimRelationship( relationship_id="rel-1", from_claim_id="clm-lbl-1", to_claim_id="clm-csr-1", relation_type=GraphRelationType.SUPPORTED_BY, relation_metadata={"reason": "efficacy supports use context"}, created_at=now, ), ] ) session.commit() session.close() return TestClient(app)