From: Sarah Hoffmann Date: Wed, 20 Jan 2021 15:43:06 +0000 (+0100) Subject: add more tests for CLI parameter parser X-Git-Tag: v3.7.0~49^2~1 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/42ec67f63c36eb6317ec72b3071437d33d0ce3d0 add more tests for CLI parameter parser --- diff --git a/nominatim/cli.py b/nominatim/cli.py index 75790b13..6c110ce7 100644 --- a/nominatim/cli.py +++ b/nominatim/cli.py @@ -392,6 +392,7 @@ class UpdateRefresh: if args.website: run_legacy_script('setup.php', '--setup-website', nominatim_env=args, throw_on_fail=True) + return 0 class AdminCheckDatabase: @@ -513,6 +514,24 @@ DETAILS_SWITCHES = ( ('polygon_geojson', 'Include geometry of result.') ) +def _add_api_output_arguments(parser): + group = parser.add_argument_group('Output arguments') + group.add_argument('--format', default='jsonv2', + choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], + help='Format of result') + for name, desc in EXTRADATA_PARAMS: + group.add_argument('--' + name, action='store_true', help=desc) + + group.add_argument('--lang', '--accept-language', metavar='LANGS', + help='Preferred language order for presenting search results') + group.add_argument('--polygon-output', + choices=['geojson', 'kml', 'svg', 'text'], + help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') + group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', + help="""Simplify output geometry. + Parameter is difference tolerance in degrees.""") + + class APISearch: """\ Execute API search query. @@ -526,21 +545,7 @@ class APISearch: for name, desc in STRUCTURED_QUERY: group.add_argument('--' + name, help='Structured query: ' + desc) - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) group = parser.add_argument_group('Result limitation') group.add_argument('--countrycodes', metavar='CC,..', @@ -601,21 +606,7 @@ class APIReverse: group.add_argument('--zoom', type=int, help='Level of detail required for the address') - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) @staticmethod @@ -652,21 +643,7 @@ class APILookup: action='append', required=True, dest='ids', help='OSM id to lookup in format (may be repeated)') - group = parser.add_argument_group('Output arguments') - group.add_argument('--format', default='jsonv2', - choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'], - help='Format of result') - for name, desc in EXTRADATA_PARAMS: - group.add_argument('--' + name, action='store_true', help=desc) - - group.add_argument('--lang', '--accept-language', metavar='LANGS', - help='Preferred language order for presenting search results') - group.add_argument('--polygon-output', - choices=['geojson', 'kml', 'svg', 'text'], - help='Output geometry of results as a GeoJSON, KML, SVG or WKT.') - group.add_argument('--polygon-threshold', type=float, metavar='TOLERANCE', - help="""Simplify output geometry. - Parameter is difference tolerance in degrees.""") + _add_api_output_arguments(parser) @staticmethod diff --git a/test/python/test_cli.py b/test/python/test_cli.py index 36da3cd2..eae4f65a 100644 --- a/test/python/test_cli.py +++ b/test/python/test_cli.py @@ -48,6 +48,7 @@ def test_cli_help(capsys): captured = capsys.readouterr() assert captured.out.startswith('usage:') + @pytest.mark.parametrize("command,script", [ (('import', '--continue', 'load-data'), 'setup'), (('freeze',), 'setup'), @@ -65,6 +66,57 @@ def test_legacy_commands_simple(mock_run_legacy, command, script): assert mock_run_legacy.called == 1 assert mock_run_legacy.last_args[0] == script + '.php' + +@pytest.mark.parametrize("name,oid", [('file', 'foo.osm'), ('diff', 'foo.osc'), + ('node', 12), ('way', 8), ('relation', 32)]) +def test_add_data_command(mock_run_legacy, name, oid): + assert 0 == call_nominatim('add-data', '--' + name, str(oid)) + + assert mock_run_legacy.called == 1 + assert mock_run_legacy.last_args == ('update.php', '--import-' + name, oid) + + +@pytest.mark.parametrize("params,do_bnds,do_ranks", [ + ([], 1, 1), + (['--boundaries-only'], 1, 0), + (['--no-boundaries'], 0, 1), + (['--boundaries-only', '--no-boundaries'], 0, 0)]) +def test_index_command(monkeypatch, params, do_bnds, do_ranks): + bnd_mock = MockParamCapture() + monkeypatch.setattr(nominatim.cli.Indexer, 'index_boundaries', bnd_mock) + rank_mock = MockParamCapture() + monkeypatch.setattr(nominatim.cli.Indexer, 'index_by_rank', rank_mock) + + assert 0 == call_nominatim('index', *params) + + assert bnd_mock.called == do_bnds + assert rank_mock.called == do_ranks + + +@pytest.mark.parametrize("command,params", [ + ('postcodes', ('update.php', '--calculate-postcodes')), + ('word-counts', ('update.php', '--recompute-word-counts')), + ('address-levels', ('update.php', '--update-address-levels')), + ('functions', ('setup.php',)), + ('wiki-data', ('setup.php', '--import-wikipedia-articles')), + ('importance', ('update.php', '--recompute-importance')), + ('website', ('setup.php', '--setup-website')), + ]) +def test_refresh_command(mock_run_legacy, command, params): + assert 0 == call_nominatim('refresh', '--' + command) + + assert mock_run_legacy.called == 1 + assert len(mock_run_legacy.last_args) >= len(params) + assert mock_run_legacy.last_args[:len(params)] == params + + +def test_refresh_importance_computed_after_wiki_import(mock_run_legacy): + assert 0 == call_nominatim('refresh', '--importance', '--wiki-data') + + assert mock_run_legacy.called == 2 + assert mock_run_legacy.last_args == ('update.php', '--recompute-importance') + + @pytest.mark.parametrize("params", [ ('search', '--query', 'new'), ('reverse', '--lat', '0', '--lon', '0'),