From 30c29c59d2cf47312df056d019c238b81df5617b Mon Sep 17 00:00:00 2001 From: Klemen Tusar Date: Tue, 16 Jul 2024 22:26:06 +0100 Subject: [PATCH] :bug: fix `decode`: properly account for `strict_null_handling` when `allow_empty_lists` (#5) --- src/qs_codec/decode.py | 2 +- tests/unit/decode_test.py | 5 +++++ tests/unit/encode_test.py | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/qs_codec/decode.py b/src/qs_codec/decode.py index a38f12a..6fad395 100644 --- a/src/qs_codec/decode.py +++ b/src/qs_codec/decode.py @@ -129,7 +129,7 @@ def _parse_object( root: str = chain[i] if root == "[]" and options.parse_lists: - if options.allow_empty_lists and leaf == "": + if options.allow_empty_lists and (leaf == "" or (options.strict_null_handling and leaf is None)): obj = [] else: obj = list(leaf) if isinstance(leaf, (list, tuple)) else [leaf] diff --git a/tests/unit/decode_test.py b/tests/unit/decode_test.py index f87a884..8a9d9e5 100644 --- a/tests/unit/decode_test.py +++ b/tests/unit/decode_test.py @@ -137,6 +137,11 @@ def test_allows_empty_lists_in_obj_values(self) -> None: assert decode("foo[]&bar=baz", DecodeOptions(allow_empty_lists=True)) == {"foo": [], "bar": "baz"} assert decode("foo[]&bar=baz", DecodeOptions(allow_empty_lists=False)) == {"foo": [""], "bar": "baz"} + def test_allow_empty_lists_and_strict_null_handling(self) -> None: + assert decode("testEmptyList[]", DecodeOptions(strict_null_handling=True, allow_empty_lists=True)) == { + "testEmptyList": [] + } + def test_parses_a_single_nested_string(self) -> None: assert decode("a[b]=c") == {"a": {"b": "c"}} diff --git a/tests/unit/encode_test.py b/tests/unit/encode_test.py index 2ead5a6..fbdb113 100644 --- a/tests/unit/encode_test.py +++ b/tests/unit/encode_test.py @@ -236,6 +236,12 @@ def test_should_omit_map_key_value_pair_when_value_is_empty_list_and_when_asked( assert encode({"a": [], "b": "zz"}, options=EncodeOptions(allow_empty_lists=False)) == "b=zz" assert encode({"a": [], "b": "zz"}, options=EncodeOptions(allow_empty_lists=True)) == "a[]&b=zz" + def test_empty_list_with_strict_null_handling(self) -> None: + assert ( + encode({"testEmptyList": []}, options=EncodeOptions(strict_null_handling=True, allow_empty_lists=True)) + == "testEmptyList[]" + ) + def test_encodes_a_nested_list_value(self) -> None: assert ( encode(