def test_decode_nibbles_odd_no_pad() -> None: spec = copy.deepcopy(iso8583.specs.default) spec["t"]["data_enc"] = "ascii" spec["p"]["data_enc"] = "ascii" spec["2"]["data_enc"] = "b" spec["2"]["len_enc"] = "bcd" spec["2"]["len_type"] = 2 spec["2"]["max_len"] = 8 spec["2"]["len_count"] = "nibbles" data = b"02004000000000000000\x00\x03\x12\x30" with pytest.raises( iso8583.DecodeError, match="Field data is 4 nibbles, expecting 3: field 2 pos 22", ): iso8583.decode(data, spec=spec)
def test_decode_nibbles_fixed_missing() -> None: """Fixed field is missing""" spec = copy.deepcopy(iso8583.specs.default) spec["t"]["data_enc"] = "ascii" spec["p"]["data_enc"] = "ascii" spec["2"]["data_enc"] = "ascii" spec["2"]["len_enc"] = "ascii" spec["2"]["len_type"] = 0 spec["2"]["max_len"] = 4 spec["2"]["len_count"] = "nibbles" s = b"02004000000000000000" with pytest.raises( iso8583.DecodeError, match="Field data is 0 nibbles, expecting 4: field 2 pos 20", ): iso8583.decode(s, spec=spec)
def test_decode_nibbles_variable_partial() -> None: """Variable field is provided partially""" spec = copy.deepcopy(iso8583.specs.default) spec["t"]["data_enc"] = "ascii" spec["p"]["data_enc"] = "ascii" spec["2"]["data_enc"] = "ascii" spec["2"]["len_enc"] = "ascii" spec["2"]["len_type"] = 2 spec["2"]["max_len"] = 4 spec["2"]["len_count"] = "nibbles" s = b"02004000000000000000041" with pytest.raises( iso8583.DecodeError, match="Field data is 2 nibbles, expecting 4: field 2 pos 22", ): iso8583.decode(s, spec=spec)
def test_decode_nibbles_variable_over_max() -> None: """Variable field length is over maximum allowed""" spec = copy.deepcopy(iso8583.specs.default) spec["t"]["data_enc"] = "ascii" spec["p"]["data_enc"] = "ascii" spec["2"]["data_enc"] = "ascii" spec["2"]["len_enc"] = "ascii" spec["2"]["len_type"] = 2 spec["2"]["max_len"] = 4 spec["2"]["len_count"] = "nibbles" s = b"02004000000000000000081234" with pytest.raises( iso8583.DecodeError, match="Field data is 8 nibbles, larger than maximum 4: field 2 pos 20", ): iso8583.decode(s, spec=spec)
def test_decode_nibbles( data_enc: str, len_enc: str, len_type: int, max_len: int, len_count: str, data: bytes, result_f2_len: bytes, ) -> None: spec = copy.deepcopy(iso8583.specs.default) spec["t"]["data_enc"] = "ascii" spec["p"]["data_enc"] = "ascii" spec["2"]["data_enc"] = data_enc spec["2"]["len_enc"] = len_enc spec["2"]["len_type"] = len_type spec["2"]["max_len"] = max_len spec["2"]["len_count"] = len_count decoded, encoded = iso8583.decode(data, spec) assert decoded["2"] == "1234" assert encoded["2"]["len"] == result_f2_len