misc: accept empty string as None in parse_decimal (#87264) #1174
|
@ -1,4 +1,5 @@
|
|||
import datetime
|
||||
import decimal
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
|
@ -27,6 +28,7 @@ from wcs.qommon.misc import (
|
|||
format_time,
|
||||
get_as_datetime,
|
||||
normalize_geolocation,
|
||||
parse_decimal,
|
||||
parse_isotime,
|
||||
simplify,
|
||||
validate_phone_fr,
|
||||
|
@ -707,3 +709,49 @@ def test_validate_phone_fr(pub):
|
|||
|
||||
assert all(validate_phone_fr(pn) for pn in valid)
|
||||
assert all(not validate_phone_fr(pn) for pn in invalid)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'value, expected',
|
||||
[
|
||||
('1.3', decimal.Decimal('1.3')),
|
||||
('1,5', decimal.Decimal(1.5)),
|
||||
(True, decimal.Decimal(0)),
|
||||
(False, decimal.Decimal(0)),
|
||||
(None, 0),
|
||||
('', 0),
|
||||
],
|
||||
ids=['1.3', '1,5', 'True', 'False', 'None', 'empty-string'],
|
||||
)
|
||||
def test_parse_decimal_base(value, expected):
|
||||
assert parse_decimal(value) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'value, expected',
|
||||
[
|
||||
('1.3', decimal.Decimal('1.3')),
|
||||
('1,5', decimal.Decimal(1.5)),
|
||||
(True, decimal.Decimal(0)),
|
||||
(False, decimal.Decimal(0)),
|
||||
(None, None),
|
||||
('', None),
|
||||
],
|
||||
ids=['1.3', '1,5', 'True', 'False', 'None', 'empty-string'],
|
||||
)
|
||||
def test_parse_decimal_keep_none(value, expected):
|
||||
assert parse_decimal(value, keep_none=True) == expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
'value, exception',
|
||||
[
|
||||
(None, TypeError),
|
||||
('', decimal.InvalidOperation),
|
||||
('xyz', decimal.InvalidOperation),
|
||||
],
|
||||
ids=['None', 'empty-string', 'alpha'],
|
||||
)
|
||||
def test_parse_decimal_do_raise(value, exception):
|
||||
with pytest.raises(exception):
|
||||
parse_decimal(value, do_raise=True)
|
||||
|
|
|
@ -1346,7 +1346,7 @@ def get_dependencies_from_template(string):
|
|||
|
||||
def parse_decimal(value, do_raise=False, keep_none=False):
|
||||
value = unlazy(value)
|
||||
if keep_none and value is None:
|
||||
if keep_none and (value is None or value == ''):
|
||||
return None
|
||||
if isinstance(value, bool):
|
||||
# treat all booleans as 0 (contrary to Python behaviour where
|
||||
|
|
Loading…
Reference in New Issue