from types import SimpleNamespace from app.services.part_key_service import build_scene_manifest, get_effective_assignments def test_build_scene_manifest_prefers_canonical_material_from_resolved_assignments(): cad_file = SimpleNamespace( id="cad-1", resolved_material_assignments={ "roller_part": { "source_name": "KERO_Z-575693-QP-DRH_ISB_1_1", "prim_path": "/Root/Assembly/roller_part", "canonical_material": "HARTOMAT_010101_Steel-Bare", } }, manual_material_overrides=None, source_material_assignments=None, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) assert manifest["parts"] == [ { "part_key": "roller_part", "source_name": "KERO_Z-575693-QP-DRH_ISB_1_1", "prim_path": "/Root/Assembly/roller_part", "effective_material": "HARTOMAT_010101_Steel-Bare", "assignment_provenance": "auto", "is_unassigned": False, } ] assert manifest["unassigned_parts"] == [] assert get_effective_assignments(cad_file) == { "roller_part": "HARTOMAT_010101_Steel-Bare", } def test_build_scene_manifest_normalizes_legacy_schaeffler_material_names(): cad_file = SimpleNamespace( id="cad-legacy", resolved_material_assignments={ "roller_part": { "source_name": "KERO_Z-575693-QP-DRH_ISB_1_1", "prim_path": "/Root/Assembly/roller_part", "canonical_material": "SCHAEFFLER_010101_Steel-Bare", } }, manual_material_overrides={"manual_part": "SCHAEFFLER_020101_Durotect-Blue"}, source_material_assignments={"roller": "SCHAEFFLER_030103_Elastomer-Black"}, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) assert manifest["parts"] == [ { "part_key": "roller_part", "source_name": "KERO_Z-575693-QP-DRH_ISB_1_1", "prim_path": "/Root/Assembly/roller_part", "effective_material": "HARTOMAT_010101_Steel-Bare", "assignment_provenance": "auto", "is_unassigned": False, } ] assert get_effective_assignments(cad_file) == { "roller_part": "HARTOMAT_010101_Steel-Bare", } def test_build_scene_manifest_adds_semantic_alias_for_deduplicated_instance_keys(): cad_file = SimpleNamespace( id="cad-alias", resolved_material_assignments={ "roller_part_2": { "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_2", "canonical_material": "HARTOMAT_010101_Steel-Bare", } }, manual_material_overrides=None, source_material_assignments=None, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) assert manifest["parts"] == [ { "part_key": "roller_part_2", "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_2", "effective_material": "HARTOMAT_010101_Steel-Bare", "assignment_provenance": "auto", "is_unassigned": False, }, { "part_key": "roller_part", "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_2", "effective_material": "HARTOMAT_010101_Steel-Bare", "assignment_provenance": "auto", "is_unassigned": False, }, ] assert manifest["unassigned_parts"] == [] assert get_effective_assignments(cad_file) == { "roller_part_2": "HARTOMAT_010101_Steel-Bare", "roller_part": "HARTOMAT_010101_Steel-Bare", } def test_build_scene_manifest_skips_alias_when_canonical_key_already_exists(): cad_file = SimpleNamespace( id="cad-existing-alias", resolved_material_assignments={ "roller_part": { "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part", "canonical_material": "HARTOMAT_010101_Steel-Bare", }, "roller_part_2": { "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_2", "canonical_material": "HARTOMAT_020202_Steel-Bare", }, }, manual_material_overrides=None, source_material_assignments=None, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) assert [part["part_key"] for part in manifest["parts"]] == [ "roller_part", "roller_part_2", ] assert get_effective_assignments(cad_file) == { "roller_part": "HARTOMAT_010101_Steel-Bare", "roller_part_2": "HARTOMAT_020202_Steel-Bare", } def test_build_scene_manifest_alias_inherits_leaf_manual_override(): cad_file = SimpleNamespace( id="cad-manual-alias", resolved_material_assignments={ "roller_part_3": { "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_3", "canonical_material": "HARTOMAT_010101_Steel-Bare", } }, manual_material_overrides={ "roller_part_3": "SCHAEFFLER_020101_Durotect-Blue", }, source_material_assignments=None, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) alias_part = next(part for part in manifest["parts"] if part["part_key"] == "roller_part") assert alias_part == { "part_key": "roller_part", "source_name": "RollerPart", "prim_path": "/Root/Assembly/roller_part_3", "effective_material": "HARTOMAT_020101_Durotect-Blue", "assignment_provenance": "manual", "is_unassigned": False, } assert get_effective_assignments(cad_file) == { "roller_part_3": "HARTOMAT_020101_Durotect-Blue", "roller_part": "HARTOMAT_020101_Durotect-Blue", } def test_build_scene_manifest_adds_semantic_alias_for_exporter_af_suffix_keys(): cad_file = SimpleNamespace( id="cad-af-alias", resolved_material_assignments={ "kero_z_575693_qp_drh_isb_1_af6": { "source_name": "KERO_Z-575693-QP-DRH_ISB_1_AF6_", "prim_path": "/Root/Assembly/kero_z_575693_qp_drh_isb_1_af6", "canonical_material": "HARTOMAT_010101_Steel-Bare", } }, manual_material_overrides=None, source_material_assignments=None, parsed_objects=None, ) manifest = build_scene_manifest(cad_file) assert [part["part_key"] for part in manifest["parts"]] == [ "kero_z_575693_qp_drh_isb_1_af6", "kero_z_575693_qp_drh_isb_1", ] assert get_effective_assignments(cad_file) == { "kero_z_575693_qp_drh_isb_1_af6": "HARTOMAT_010101_Steel-Bare", "kero_z_575693_qp_drh_isb_1": "HARTOMAT_010101_Steel-Bare", }