misc: accept empty string as None in parse_decimal (#87264) #1174

Merged
bdauvergne merged 1 commits from wip/87264-parse-decimal-avec-keep-none-Tru into main 2024-02-26 11:12:54 +01:00
2 changed files with 49 additions and 1 deletions

View File

@ -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)

View File

@ -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