"""Tests for asset projection purge (legal-hold aware).""" from __future__ import annotations from app.indexing.projection import AssetPurgeTarget, purge_projection_by_asset_id class _FakeRepo: def __init__(self, target: AssetPurgeTarget) -> None: self.target = target self.purged: tuple[str, list[str]] | None = None def find_asset_documents(self, asset_id: str) -> AssetPurgeTarget: return self.target def purge_chunks(self, asset_id: str, document_ids: list[str]) -> None: self.purged = (asset_id, document_ids) def test_unknown_asset_is_noop(): repo = _FakeRepo(AssetPurgeTarget(found=False)) calls: list[list[str]] = [] result = purge_projection_by_asset_id("a1", repository=repo, search_purge=calls.append) assert result["purged"] is False assert result["reason"] == "unknown_asset" assert calls == [] assert repo.purged is None def test_legal_hold_blocks_purge(): repo = _FakeRepo(AssetPurgeTarget(found=True, document_ids=["d1"], legal_hold=True)) calls: list[list[str]] = [] result = purge_projection_by_asset_id("a1", repository=repo, search_purge=calls.append) assert result["purged"] is False assert result["reason"] == "legal_hold" assert calls == [] # search index NOT touched under legal hold assert repo.purged is None # chunks NOT deleted def test_purge_removes_chunks_and_search_entries(): repo = _FakeRepo(AssetPurgeTarget(found=True, document_ids=["d1", "d2"], legal_hold=False)) calls: list[list[str]] = [] result = purge_projection_by_asset_id("a1", repository=repo, search_purge=calls.append) assert result["purged"] is True assert result["documents"] == ["d1", "d2"] assert repo.purged == ("a1", ["d1", "d2"]) assert calls == [["d1", "d2"]]