"""Tests for contract product package_spec JSON codec.""" from app.utils.crm_package_spec import ( decode_package_specs, encode_package_specs, normalize_package_specs_list, resolve_package_specs_from_payload, ) def test_decode_legacy_scalar(): assert decode_package_specs("25kg/桶") == ["25kg/桶"] assert decode_package_specs(" 槽罐车 ") == ["槽罐车"] def test_decode_empty(): assert decode_package_specs(None) == [] assert decode_package_specs("") == [] assert decode_package_specs(" ") == [] def test_decode_json_array(): assert decode_package_specs('["25kg/桶", "槽罐车"]') == ["25kg/桶", "槽罐车"] assert decode_package_specs('[" a ", "b", "a"]') == ["a", "b"] def test_decode_invalid_json_as_scalar(): assert decode_package_specs("[not-json") == ["[not-json"] assert decode_package_specs('{"a":1}') == ['{"a":1}'] def test_encode_roundtrip(): raw = encode_package_specs(["25kg/桶", "槽罐车"]) assert decode_package_specs(raw) == ["25kg/桶", "槽罐车"] assert raw.startswith("[") def test_encode_dedupe_preserve_order(): assert decode_package_specs(encode_package_specs(["a", " b ", "a", "c"])) == ["a", "b", "c"] def test_encode_empty_is_empty_string(): assert encode_package_specs([]) == "" assert encode_package_specs(None) == "" def test_normalize_package_specs_list(): assert normalize_package_specs_list([" x ", "", "y", "x"]) == ["x", "y"] def test_resolve_from_payload_prefers_package_specs(): assert resolve_package_specs_from_payload( {"packageSpecs": ["25kg/桶", "槽罐车"], "packageSpec": "ignore"} ) == ["25kg/桶", "槽罐车"] def test_resolve_from_payload_legacy_scalar(): assert resolve_package_specs_from_payload({"packageSpec": "槽罐车"}) == ["槽罐车"] assert resolve_package_specs_from_payload({"package_spec": "吨桶"}) == ["吨桶"]