Example #1
0
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""