1 # SPDX-License-Identifier: GPL-3.0-or-later
3 # This file is part of Nominatim. (https://nominatim.org)
5 # Copyright (C) 2025 by the Nominatim developer community.
6 # For a full list of authors see the git log.
8 Tests for the streaming JSON writer.
14 from nominatim_api.utils.json_writer import JsonWriter
17 @pytest.mark.parametrize("inval,outstr", [(None, 'null'),
18 (True, 'true'), (False, 'false'),
19 (23, '23'), (0, '0'), (-1.3, '-1.3'),
20 ('g\nä', '"g\\nä"'), ('"', '"\\\""'),
21 ({}, '{}'), ([], '[]')])
22 def test_simple_value(inval, outstr):
26 assert writer() == outstr
30 def test_empty_array():
31 writer = JsonWriter().start_array().end_array()
33 assert writer() == '[]'
37 def test_array_with_single_value():
38 writer = JsonWriter().start_array().value(None).end_array()
40 assert writer() == '[null]'
44 @pytest.mark.parametrize("invals,outstr", [((1, ), '[1]'),
45 (('a', 'b'), '["a","b"]')])
46 def test_array_with_data(invals, outstr):
51 writer.value(ival).next()
54 assert writer() == outstr
58 def test_empty_object():
59 writer = JsonWriter().start_object().end_object()
61 assert writer() == '{}'
65 def test_object_single_entry():
66 writer = JsonWriter()\
72 assert writer() == '{"something":5}'
76 def test_object_many_values():
77 writer = JsonWriter()\
81 .keyval('baz', 'b\taz')\
84 assert writer() == '{"foo":null,"bar":{},"baz":"b\\taz"}'
88 def test_object_many_values_without_none():
89 writer = JsonWriter()\
91 .keyval_not_none('foo', 0)\
92 .keyval_not_none('bar', None)\
93 .keyval_not_none('baz', '')\
94 .keyval_not_none('eve', False,
95 transform=lambda v: 'yes' if v else 'no')\
98 assert writer() == '{"foo":0,"baz":"","eve":"no"}'
102 def test_raw_output():
103 writer = JsonWriter()\
105 .raw('{ "nicely": "formatted here" }').next()\
109 assert writer() == '[{ "nicely": "formatted here" },1]'