import json import sys from pathlib import Path import pytest def test_domain_scope_records_protein_count_before_manifest(tmp_path, monkeypatch): from apps.cli import run_domain ws = tmp_path / "job_scope_domain" final_dir = ws / "final" analysis_dir = ws / "domain" / "analysis" phylogeny_dir = ws / "phylogeny" / "analysis" final_dir.mkdir(parents=True) analysis_dir.mkdir(parents=True) phylogeny_dir.mkdir(parents=True) scope_id = "SPL.target-Ft.ref-At.target_plus_reference" scope_file = final_dir / "Ft.SPL.scope.json" scope_file.write_text( json.dumps( { "family": "SPL", "prefix": "Ft.SPL", "scope_id": scope_id, "scope_mode": "target_plus_reference", "target_species": ["Ft"], "reference_species": ["At"], "comparative_species": [], "selected_species": ["Ft", "At"], } ), encoding="utf-8", ) protein_file = phylogeny_dir / "scope.pep.fa" protein_file.write_text(">Ft_gene1\nMAAA\n>At_gene1\nMCCC\n", encoding="utf-8") tree_file = final_dir / "Target.SPL.target-Ft.ref-At.subfamily_evidence.tree.nwk" tree_file.write_text("(Ft_gene1,At_gene1);\n", encoding="utf-8") phylogeny_manifest = final_dir / f"Ft.SPL.{run_domain.sanitize_token(scope_id)}.phylogeny.manifest.json" phylogeny_manifest.write_text( json.dumps( { "stage": "phylogeny", "status": "success", "prefix": "Ft.SPL", "parameters": {"scope_input_fasta": str(protein_file)}, "artifacts": {"tree": {"path": str(tree_file.relative_to(ws))}}, } ), encoding="utf-8", ) pfam_hmm = tmp_path / "Pfam-A.hmm" pfam_hmm.write_text("HMMER3/f\n", encoding="utf-8") domtblout = analysis_dir / "scope.domtblout" tblout = analysis_dir / "scope.tblout" plot_png = final_dir / "Target.SPL.target-Ft.ref-At.subfamily_evidence.domain.png" plot_pdf = final_dir / "Target.SPL.target-Ft.ref-At.subfamily_evidence.domain.pdf" def fake_run_hmmscan(*args, **kwargs): domtblout.write_text("# empty domtblout\n", encoding="utf-8") tblout.write_text("# empty tblout\n", encoding="utf-8") return True, {"elapsed_sec": 0.01, "domtblout": domtblout, "tblout": tblout} def fake_run_r_plotting(*args, **kwargs): plot_png.write_text("png", encoding="utf-8") plot_pdf.write_text("pdf", encoding="utf-8") return {"success": True, "output_files": [str(plot_png), str(plot_pdf)]} monkeypatch.setattr(run_domain, "prepare_pfam_database", lambda *args, **kwargs: (pfam_hmm, True, "")) monkeypatch.setattr(run_domain, "run_hmmscan", fake_run_hmmscan) monkeypatch.setattr( run_domain, "parse_domtblout", lambda *args, **kwargs: ( [], {"total_hits": 0, "significant_hits": 0, "unique_proteins": 0, "unique_domains": 0}, ), ) monkeypatch.setattr(run_domain, "run_r_plotting", fake_run_r_plotting) monkeypatch.setattr(run_domain, "get_tool_versions", lambda: {}) monkeypatch.setattr( sys, "argv", [ "run_domain.py", "--prefix", "Ft.SPL", "--workspace", str(ws), "--scope-file", str(scope_file), "--analysis-route", "subfamily_evidence", "--member-set-id", f"{scope_id}:subfamily_evidence:domain_refined", "--tree", str(tree_file), "--subfamily", "NONE", ], ) with pytest.raises(SystemExit) as exit_info: run_domain.main() assert exit_info.value.code == 0 manifest_file = final_dir / "Target.SPL.target-Ft.ref-At.subfamily_evidence.domain.manifest.json" assert manifest_file.exists() manifest = json.loads(manifest_file.read_text(encoding="utf-8")) assert manifest["parameters"]["protein_record_count"] == 2 assert manifest["metrics"]["protein_record_count"] == 2