Files
HartOMat/backend/tests/test_part_key_service.py
T

204 lines
6.9 KiB
Python

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",
}