]> git.openstreetmap.org Git - nominatim.git/commitdiff
add tests for new data invalidation functions
authorSarah Hoffmann <lonvia@denofr.de>
Thu, 14 Apr 2022 12:52:13 +0000 (14:52 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Thu, 14 Apr 2022 12:52:13 +0000 (14:52 +0200)
nominatim/cli.py
nominatim/clicmd/refresh.py
test/python/cli/test_cmd_api.py
test/python/cli/test_cmd_refresh.py
test/python/tools/test_refresh.py

index 0a3bd2b007c8793dee1ee75107eb543e3e952642..315c1cfef45c21daf682b2df9e2b75a68b1327e3 100644 (file)
@@ -70,7 +70,10 @@ class CommandlineParser:
             appropriate subcommand.
         """
         args = NominatimArgs()
-        self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args)
+        try:
+            self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args)
+        except SystemExit:
+            return 1
 
         if args.subcommand is None:
             self.parser.print_help()
index 4fbdfebbb993f43bfb00438131a8e818714494dd..ecc7498eff7ef0b448a274e8158171f593ccedd7 100644 (file)
@@ -7,6 +7,7 @@
 """
 Implementation of 'refresh' subcommand.
 """
+from argparse import ArgumentTypeError
 import logging
 from pathlib import Path
 
@@ -24,7 +25,7 @@ def _parse_osm_object(obj):
         Raises an ArgumentError if the format is not recognized.
     """
     if len(obj) < 2 or obj[0].lower() not in 'nrw' or not obj[1:].isdigit():
-        raise ArgumentError("Expect OSM object id of form [N|W|R]<id>.")
+        raise ArgumentTypeError("Cannot parse OSM ID. Expect format: [N|W|R]<id>.")
 
     return (obj[0].upper(), int(obj[1:]))
 
@@ -79,7 +80,7 @@ class UpdateRefresh:
                            help='Enable debug warning statements in functions')
 
 
-    def run(self, args):
+    def run(self, args): #pylint: disable=too-many-branches
         from ..tools import refresh, postcodes
         from ..indexer.indexer import Indexer
 
index f24125c2e80eaed3ba66524d030edf01533bf102..80248ac739359967c6690f6deb72dd53ec8bd55a 100644 (file)
@@ -14,15 +14,14 @@ import nominatim.clicmd.api
 
 @pytest.mark.parametrize("endpoint", (('search', 'reverse', 'lookup', 'details', 'status')))
 def test_no_api_without_phpcgi(src_dir, endpoint):
-    with pytest.raises(SystemExit):
-        nominatim.cli.nominatim(module_dir='MODULE NOT AVAILABLE',
-                                osm2pgsql_path='OSM2PGSQL NOT AVAILABLE',
-                                phplib_dir=str(src_dir / 'lib-php'),
-                                data_dir=str(src_dir / 'data'),
-                                phpcgi_path=None,
-                                sqllib_dir=str(src_dir / 'lib-sql'),
-                                config_dir=str(src_dir / 'settings'),
-                                cli_args=[endpoint])
+    assert nominatim.cli.nominatim(module_dir='MODULE NOT AVAILABLE',
+                                   osm2pgsql_path='OSM2PGSQL NOT AVAILABLE',
+                                   phplib_dir=str(src_dir / 'lib-php'),
+                                   data_dir=str(src_dir / 'data'),
+                                   phpcgi_path=None,
+                                   sqllib_dir=str(src_dir / 'lib-sql'),
+                                   config_dir=str(src_dir / 'settings'),
+                                   cli_args=[endpoint]) == 1
 
 
 @pytest.mark.parametrize("params", [('search', '--query', 'new'),
index b6281c7a82034b24bda2d8d610d819410860f754..7f44765bcade9ce08cb4c0f41da6f95f19e822c5 100644 (file)
@@ -82,3 +82,24 @@ class TestRefresh:
         assert self.call_nominatim('refresh', '--importance', '--wiki-data') == 0
 
         assert calls == ['import', 'update']
+
+    @pytest.mark.parametrize('params', [('--data-object', 'w234'),
+                                        ('--data-object', 'N23', '--data-object', 'N24'),
+                                        ('--data-area', 'R7723'),
+                                        ('--data-area', 'r7723', '--data-area', 'r2'),
+                                        ('--data-area', 'R9284425', '--data-object', 'n1234567894567')])
+    def test_refresh_objects(self, params, mock_func_factory):
+        func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
+
+        assert self.call_nominatim('refresh', *params) == 0
+
+        assert func_mock.called == len(params)/2
+
+
+    @pytest.mark.parametrize('func', ('--data-object', '--data-area'))
+    @pytest.mark.parametrize('param', ('234', 'a55', 'R 453', 'Rel'))
+    def test_refresh_objects_bad_param(self, func, param, mock_func_factory):
+        func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
+
+        self.call_nominatim('refresh', func, param) == 1
+        assert func_mock.called == 0
index cbe7f7bd7039fd12f8f7433b26a467def9cfbf64..ac52aa36091643923d1c6791038b78ddc8f8c8d9 100644 (file)
@@ -39,3 +39,47 @@ def test_recompute_importance(placex_table, table_factory, temp_db_conn, temp_db
                                AS $$ SELECT 0.1::float, 'foo'::text $$ LANGUAGE SQL""")
 
     refresh.recompute_importance(temp_db_conn)
+
+
+@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))
+def test_invalidate_osm_object_simple(placex_table, osm_type, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type=osm_type, osm_id=57283)
+
+    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn, recursive=False)
+    temp_db_conn.commit()
+
+    assert 2 == temp_db_cursor.scalar("""SELECT indexed_status FROM placex
+                                         WHERE osm_type = %s and osm_id = %s""",
+                                      (osm_type, 57283))
+
+
+def test_invalidate_osm_object_nonexisting_simple(placex_table, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type='W', osm_id=57283)
+
+    refresh.invalidate_osm_object('N', 57283, temp_db_conn, recursive=False)
+    temp_db_conn.commit()
+
+    assert 0 == temp_db_cursor.scalar("""SELECT count(*) FROM placex
+                                         WHERE indexed_status > 0""")
+
+
+@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))
+def test_invalidate_osm_object_recursive(placex_table, osm_type, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type=osm_type, osm_id=57283)
+
+    temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION place_force_update(placeid BIGINT)
+                              RETURNS BOOLEAN AS $$
+                              BEGIN
+                                UPDATE placex SET indexed_status = 522
+                                WHERE place_id = placeid;
+                                RETURN TRUE;
+                              END;
+                              $$
+                              LANGUAGE plpgsql;""")
+
+    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn)
+    temp_db_conn.commit()
+
+    assert 522 == temp_db_cursor.scalar("""SELECT indexed_status FROM placex
+                                           WHERE osm_type = %s and osm_id = %s""",
+                                        (osm_type, 57283))