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]'