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 command line interface wrapper for refresk command.
12 import nominatim_db.tools.refresh
13 import nominatim_db.tools.postcodes
14 import nominatim_db.indexer.indexer
19 @pytest.fixture(autouse=True)
20 def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):
21 self.call_nominatim = cli_call
22 self.tokenizer_mock = cli_tokenizer_mock
24 @pytest.mark.parametrize("command,func", [
25 ('address-levels', 'load_address_levels_from_config'),
26 ('wiki-data', 'import_wikipedia_articles'),
27 ('importance', 'recompute_importance'),
29 def test_refresh_command(self, mock_func_factory, command, func):
30 mock_func_factory(nominatim_db.tools.refresh, 'create_functions')
31 func_mock = mock_func_factory(nominatim_db.tools.refresh, func)
33 assert self.call_nominatim('refresh', '--' + command) == 0
34 assert func_mock.called == 1
36 def test_refresh_word_count(self):
37 assert self.call_nominatim('refresh', '--word-count') == 0
38 assert self.tokenizer_mock.update_statistics_called
40 def test_refresh_word_tokens(self):
41 assert self.call_nominatim('refresh', '--word-tokens') == 0
42 assert self.tokenizer_mock.update_word_tokens_called
44 def test_refresh_postcodes(self, async_mock_func_factory, mock_func_factory,
45 place_postcode_table):
46 func_mock = mock_func_factory(nominatim_db.tools.postcodes, 'update_postcodes')
47 idx_mock = async_mock_func_factory(nominatim_db.indexer.indexer.Indexer, 'index_postcodes')
49 assert self.call_nominatim('refresh', '--postcodes') == 0
50 assert func_mock.called == 1
51 assert idx_mock.called == 1
53 def test_refresh_postcodes_no_place_table(self):
54 # Do nothing without the place table
55 assert self.call_nominatim('refresh', '--postcodes') == 0
57 def test_refresh_create_functions(self, mock_func_factory):
58 func_mock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')
60 assert self.call_nominatim('refresh', '--functions') == 0
61 assert func_mock.called == 1
62 assert self.tokenizer_mock.update_sql_functions_called
64 def test_refresh_wikidata_file_not_found(self, monkeypatch):
65 monkeypatch.setenv('NOMINATIM_WIKIPEDIA_DATA_PATH', 'gjoiergjeroi345Q')
67 assert self.call_nominatim('refresh', '--wiki-data') == 1
69 def test_refresh_secondary_importance_file_not_found(self):
70 assert self.call_nominatim('refresh', '--secondary-importance') == 1
72 def test_refresh_secondary_importance_new_table(self, mock_func_factory):
73 mocks = [mock_func_factory(nominatim_db.tools.refresh, 'import_secondary_importance'),
74 mock_func_factory(nominatim_db.tools.refresh, 'create_functions')]
76 assert self.call_nominatim('refresh', '--secondary-importance') == 0
77 assert mocks[0].called == 1
78 assert mocks[1].called == 1
80 def test_refresh_importance_computed_after_wiki_import(self, monkeypatch, mock_func_factory):
82 monkeypatch.setattr(nominatim_db.tools.refresh, 'import_wikipedia_articles',
83 lambda *args, **kwargs: calls.append('import') or 0)
84 monkeypatch.setattr(nominatim_db.tools.refresh, 'recompute_importance',
85 lambda *args, **kwargs: calls.append('update'))
86 func_mock = mock_func_factory(nominatim_db.tools.refresh, 'create_functions')
88 assert self.call_nominatim('refresh', '--importance', '--wiki-data') == 0
90 assert calls == ['import', 'update']
91 assert func_mock.called == 1
93 @pytest.mark.parametrize('params', [('--data-object', 'w234'),
94 ('--data-object', 'N23', '--data-object', 'N24'),
95 ('--data-area', 'R7723'),
96 ('--data-area', 'r7723', '--data-area', 'r2'),
97 ('--data-area', 'R9284425',
98 '--data-object', 'n1234567894567')])
99 def test_refresh_objects(self, params, mock_func_factory):
100 func_mock = mock_func_factory(nominatim_db.tools.refresh, 'invalidate_osm_object')
102 assert self.call_nominatim('refresh', *params) == 0
104 assert func_mock.called == len(params)/2
106 @pytest.mark.parametrize('func', ('--data-object', '--data-area'))
107 @pytest.mark.parametrize('param', ('234', 'a55', 'R 453', 'Rel'))
108 def test_refresh_objects_bad_param(self, func, param, mock_func_factory):
109 func_mock = mock_func_factory(nominatim_db.tools.refresh, 'invalidate_osm_object')
111 self.call_nominatim('refresh', func, param) == 1
112 assert func_mock.called == 0