from __future__ import annotations from gfa_core.mas.tools.stage_identity import merge_manifest_identity_params, resolve_stage_identity def test_postflight_manifest_identity_overrides_stale_task_identity(tmp_path): workspace_root = tmp_path / "workspace" (workspace_root / "job_manifest" / "final").mkdir(parents=True) stale_params = { "prefix": "Si.HDZIP", "scopeId": "HDZIP.target-Si.target_only", "scopeMode": "target_only", "analysisRoute": "single_species", "memberSetId": "HDZIP.target-Si.target_only:single_species:all_members", "targetSpecies": ["Si"], "referenceSpecies": [], } manifest = { "stage": "combo", "prefix": "Si.HDZIP", "scope_id": "HDZIP.target-Si.ref-At.target_plus_reference", "analysis_route": "subfamily_evidence", "member_set_id": "HDZIP.target-Si.ref-At.target_plus_reference:subfamily_evidence:domain_refined", "stage_context": { "scope_mode": "target_plus_reference", "family": "HDZIP", "target_species": ["Si"], "reference_species": ["At"], "selected_species": ["Si", "At"], }, } merged = merge_manifest_identity_params(stale_params, manifest) identity = resolve_stage_identity( stage="combo", prefix="Si.HDZIP", params=merged, job_id="job_manifest", workspace_root=workspace_root, ) assert identity.scope_id == "HDZIP.target-Si.ref-At.target_plus_reference" assert identity.scope_mode == "target_plus_reference" assert identity.analysis_route == "subfamily_evidence" assert identity.member_set_id == "HDZIP.target-Si.ref-At.target_plus_reference:subfamily_evidence:domain_refined" assert identity.reference_species == ["At"] def test_postflight_manifest_identity_preserves_unscoped_regular_combo(): merged = merge_manifest_identity_params( { "prefix": "Ft.SPL", "scopeId": "SPL.target-Ft.target_only", "analysisRoute": "single_species", "memberSetId": "SPL.target-Ft.target_only:single_species:all_members", }, {"stage": "combo", "prefix": "Ft.SPL", "status": "success"}, ) assert merged["prefix"] == "Ft.SPL" assert "scopeId" not in merged assert "scope_id" not in merged assert "analysisRoute" not in merged assert "analysis_route" not in merged assert "memberSetId" not in merged assert "member_set_id" not in merged def test_postflight_manifest_identity_merges_wgs_index_identity(): manifest = { "stage": "wgs_index", "prefix": "Os", "status": "success", "wgs_reference_id": "wgs-reference:" + "b" * 64, "wgs_analysis_id": "wgs-analysis:" + "c" * 64, } merged = merge_manifest_identity_params({"prefix": "Os"}, manifest) assert merged["wgsReferenceId"] == manifest["wgs_reference_id"] assert merged["wgsAnalysisId"] == manifest["wgs_analysis_id"]