from pathlib import Path from apps.web.pipeline_backend import resolve_member_protein_for_stage_route def _write(path: Path, text: str) -> Path: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(text, encoding="utf-8") return path def _pep(ids: list[str]) -> str: return "".join(f">{gene_id}\nMA\n" for gene_id in ids) def test_subfamily_evidence_route_requires_curated_members(tmp_path: Path): ws = tmp_path / "workspace" / "job1" final_dir = ws / "final" input_dir = tmp_path / "input" / "job1" prefix = "Target.Os.CrR" identified_ids = ["id1", "id2"] _write(final_dir / f"{prefix}.identified_members.id", "\n".join(identified_ids) + "\n") _write(final_dir / f"{prefix}.identified_members.pep.fa", _pep(identified_ids)) protein_file, error = resolve_member_protein_for_stage_route( ws=ws, final_dir=final_dir, in_dir=input_dir, prefix=prefix, analysis_route="subfamily_evidence", ) assert protein_file is None assert error assert "成员初筛确认" in error def test_subfamily_evidence_route_uses_curated_and_regular_route_uses_final(tmp_path: Path): ws = tmp_path / "workspace" / "job1" final_dir = ws / "final" input_dir = tmp_path / "input" / "job1" prefix = "Target.Os.CrR" curated_ids = ["id1", "id3"] final_ids = ["id1", "id2", "id3", "id4"] curated_pep = _write(final_dir / f"{prefix}.curated_members.pep.fa", _pep(curated_ids)) _write(final_dir / f"{prefix}.curated_members.id", "\n".join(curated_ids) + "\n") final_pep = _write(final_dir / f"{prefix}.final_members.pep.fa", _pep(final_ids)) _write(final_dir / f"{prefix}.final_members.id", "\n".join(final_ids) + "\n") _write( final_dir / f"{prefix}.subfamily_confirm.manifest.json", ( '{"stage":"subfamily_confirm","status":"success",' '"parameters":{"final_members_source_stage":"subfamily_confirm"},' '"artifacts":{"final_members_id":{"path":"x"},"final_members_pep":{"path":"y"}}}' ), ) subfamily_file, subfamily_error = resolve_member_protein_for_stage_route( ws=ws, final_dir=final_dir, in_dir=input_dir, prefix=prefix, analysis_route="subfamily_evidence", ) regular_file, regular_error = resolve_member_protein_for_stage_route( ws=ws, final_dir=final_dir, in_dir=input_dir, prefix=prefix, analysis_route="", ) assert subfamily_error is None assert subfamily_file == curated_pep assert regular_error is None assert regular_file == final_pep