def test_protobuf_input( money_input: Any, str_output: str, units: int, nanos: int, proto_currency: str, currency_code: Optional[str], decimal_input: str, protobuf_bytes: bytes, ) -> None: m1 = Money(money_input) proto_output = m1.as_protobuf() assert proto_output.units == units assert proto_output.nanos == nanos assert proto_output.currency_code is not None assert proto_output.currency_code == proto_currency assert proto_output.SerializeToString() == protobuf_bytes m2 = Money(proto_output.SerializeToString()) assert str(m2) == str_output assert m2.as_decimal() == Decimal(decimal_input) assert m2.units == units assert m2.nanos == nanos if currency_code is None: assert m2.currency is None else: assert m2.currency == currency_code if currency_code is None: assert m2.currency is None else: assert m2.currency_code == currency_code assert m2.as_protobuf().currency_code == proto_currency m3 = Money(proto_output) assert str(m3) == str_output assert m3.as_decimal() == Decimal(decimal_input) assert m3.units == units assert m3.nanos == nanos if currency_code is None: assert m3.currency is None else: assert m3.currency == currency_code if currency_code is None: assert m3.currency is None else: assert m3.currency_code == currency_code assert m3.as_protobuf().currency_code == proto_currency assert m3 == m2
def test_info_methods() -> None: m = Money("4711.75", currency="EUR") assert m.amount == Decimal("4711.75") assert m.currency == "EUR" assert m.units == 4711 assert m.nanos == 750000000 assert m.amount_as_string() == "4711.75" assert m.amount_as_string(min_decimals=5, max_decimals=8) == "4711.75000" assert m.amount_as_string(min_decimals=0, max_decimals=8) == "4711.75" assert m.amount_as_string(min_decimals=0, max_decimals=1) == "4711.8" assert m.amount_as_string(min_decimals=0, max_decimals=0) == "4712" assert m.amount_as_string(max_decimals=0) == "4712" assert m.amount_as_string(min_decimals=10) == "4711.7500000000" with pytest.raises(ValueError): m.amount_as_string(min_decimals=2, max_decimals=0) assert m.as_string() == "4711.75 EUR" assert m.as_str() == "4711.75 EUR" assert m.as_decimal() == Decimal("4711.75") assert m.as_int() == 4711 assert m.as_float() == float(m) assert m.is_zero() is False assert m.is_signed() is False assert Money(0).is_zero() is True assert Money(0).is_signed() is False assert Money(-1).is_signed() is True m = Money("-0.0000000001", currency="EUR") assert m.amount == Decimal("-0.0000000001") assert m.currency == "EUR" assert m.units == 0 assert m.nanos == 0 assert m.amount_as_string() == "0.00" assert m.amount_as_string(max_decimals=10) == "-0.0000000001" assert m.as_string() == "0.00 EUR" assert m.as_decimal() == Decimal("-0.0000000001") assert m.as_int() == 0 assert m.is_zero() is False assert m.is_signed() is True
def test_info_methods() -> None: m = Money("4711.75", currency="EUR") assert m.amount == Decimal("4711.75") assert m.currency == "EUR" assert m.currency_code == "EUR" assert m.units == 4711 assert m.nanos == 750000000 assert m.amount_as_string() == "4711.75" assert m.amount_as_string(min_decimals=5, max_decimals=8) == "4711.75000" assert m.amount_as_string(min_decimals=0, max_decimals=8) == "4711.75" assert m.amount_as_string(min_decimals=0, max_decimals=1) == "4711.8" assert m.amount_as_string(min_decimals=0, max_decimals=0) == "4712" assert m.amount_as_string(max_decimals=0) == "4712" assert m.amount_as_string(min_decimals=10) == "4711.7500000000" with pytest.raises(ValueError): m.amount_as_string(min_decimals=2, max_decimals=0) assert m.as_string() == "4711.75 EUR" assert m.as_str() == "4711.75 EUR" assert m.as_decimal() == Decimal("4711.75") assert m.as_int() == 4711 assert m.as_float() == float(m) assert m.is_zero() is False assert m.is_signed() is False assert m.as_json() == '{"value": "4711.75 EUR", "units": 4711, "nanos": 750000000, "currency_code": "EUR"}' assert m.json() == '{"value": "4711.75 EUR", "units": 4711, "nanos": 750000000, "currency_code": "EUR"}' assert type(m.as_protobuf()) is MoneyProtobufMessage assert m.as_protobuf().currency_code == "EUR" assert m.as_protobuf().units == 4711 assert m.as_protobuf().nanos == 750000000 assert m.as_protobuf().SerializeToString() == b"\n\x03EUR\x10\xe7$\x18\x80\xaf\xd0\xe5\x02" assert m.as_proto().SerializeToString() == b"\n\x03EUR\x10\xe7$\x18\x80\xaf\xd0\xe5\x02" assert m.protobuf().SerializeToString() == b"\n\x03EUR\x10\xe7$\x18\x80\xaf\xd0\xe5\x02" assert m.proto().SerializeToString() == b"\n\x03EUR\x10\xe7$\x18\x80\xaf\xd0\xe5\x02" assert type(m.as_protobuf(proto_class=MoneyProtobufMessage)) is MoneyProtobufMessage with pytest.raises(TypeError): m.as_protobuf(proto_class=None) assert Money(0).is_zero() is True assert Money(0).is_signed() is False assert Money(-1).is_signed() is True m = Money("-0.0000000001", currency="EUR") assert m.amount == Decimal("-0.0000000001") assert m.currency == "EUR" assert m.units == 0 assert m.nanos == 0 assert m.amount_as_string() == "0.00" assert m.amount_as_string(max_decimals=10) == "-0.0000000001" assert m.as_string() == "0.00 EUR" assert m.as_decimal() == Decimal("-0.0000000001") assert m.as_int() == 0 assert m.is_zero() is False assert m.is_signed() is True assert m.as_protobuf().currency_code == "EUR" assert m.as_protobuf().units == 0 assert m.as_protobuf().nanos == 0 assert m.as_protobuf().SerializeToString() == b"\n\x03EUR" m = Money(1.337) assert m.amount == Decimal("1.337") assert m.currency is None assert m.currency_code is None assert m.units == 1 assert m.nanos == 337000000 assert m.amount_as_string() == "1.337" assert m.amount_as_string(max_decimals=2) == "1.34" assert m.as_protobuf().currency_code == "" assert m.as_protobuf().units == 1 assert m.as_protobuf().nanos == 337000000 assert m.as_protobuf().SerializeToString() == b"\x10\x01\x18\xc0\xec\xd8\xa0\x01" m = Money(0) assert m.amount == Decimal("0") assert m.currency is None assert m.currency_code is None assert m.units == 0 assert m.nanos == 0 assert m.amount_as_string() == "0.00" assert m.amount_as_string(max_decimals=4) == "0.00" assert m.amount_as_string(max_decimals=0) == "0" assert m.as_protobuf().currency_code == "" assert m.as_protobuf().units == 0 assert m.as_protobuf().nanos == 0 assert m.as_protobuf().SerializeToString() == b""