1 # SPDX-License-Identifier: GPL-2.0-only
 
   3 # This file is part of Nominatim. (https://nominatim.org)
 
   5 # Copyright (C) 2022 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.tools.refresh
 
  13 import nominatim.tools.postcodes
 
  14 import nominatim.indexer.indexer
 
  18     @pytest.fixture(autouse=True)
 
  19     def setup_cli_call(self, cli_call, temp_db, cli_tokenizer_mock):
 
  20         self.call_nominatim = cli_call
 
  21         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'),
 
  28                              ('website', 'setup_website'),
 
  30     def test_refresh_command(self, mock_func_factory, command, func):
 
  31         func_mock = mock_func_factory(nominatim.tools.refresh, func)
 
  33         assert self.call_nominatim('refresh', '--' + command) == 0
 
  34         assert func_mock.called == 1
 
  37     def test_refresh_word_count(self):
 
  38         assert self.call_nominatim('refresh', '--word-count') == 0
 
  39         assert self.tokenizer_mock.update_statistics_called
 
  42     def test_refresh_word_tokens(self):
 
  43         assert self.call_nominatim('refresh', '--word-tokens') == 0
 
  44         assert self.tokenizer_mock.update_word_tokens_called
 
  47     def test_refresh_postcodes(self, mock_func_factory, place_table):
 
  48         func_mock = mock_func_factory(nominatim.tools.postcodes, 'update_postcodes')
 
  49         idx_mock = mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_postcodes')
 
  51         assert self.call_nominatim('refresh', '--postcodes') == 0
 
  52         assert func_mock.called == 1
 
  53         assert idx_mock.called == 1
 
  56     def test_refresh_postcodes_no_place_table(self):
 
  57         # Do nothing without the place table
 
  58         assert self.call_nominatim('refresh', '--postcodes') == 0
 
  61     def test_refresh_create_functions(self, mock_func_factory):
 
  62         func_mock = mock_func_factory(nominatim.tools.refresh, 'create_functions')
 
  64         assert self.call_nominatim('refresh', '--functions') == 0
 
  65         assert func_mock.called == 1
 
  66         assert self.tokenizer_mock.update_sql_functions_called
 
  69     def test_refresh_wikidata_file_not_found(self, monkeypatch):
 
  70         monkeypatch.setenv('NOMINATIM_WIKIPEDIA_DATA_PATH', 'gjoiergjeroi345Q')
 
  72         assert self.call_nominatim('refresh', '--wiki-data') == 1
 
  75     def test_refresh_importance_computed_after_wiki_import(self, monkeypatch):
 
  77         monkeypatch.setattr(nominatim.tools.refresh, 'import_wikipedia_articles',
 
  78                             lambda *args, **kwargs: calls.append('import') or 0)
 
  79         monkeypatch.setattr(nominatim.tools.refresh, 'recompute_importance',
 
  80                             lambda *args, **kwargs: calls.append('update'))
 
  82         assert self.call_nominatim('refresh', '--importance', '--wiki-data') == 0
 
  84         assert calls == ['import', 'update']
 
  86     @pytest.mark.parametrize('params', [('--data-object', 'w234'),
 
  87                                         ('--data-object', 'N23', '--data-object', 'N24'),
 
  88                                         ('--data-area', 'R7723'),
 
  89                                         ('--data-area', 'r7723', '--data-area', 'r2'),
 
  90                                         ('--data-area', 'R9284425', '--data-object', 'n1234567894567')])
 
  91     def test_refresh_objects(self, params, mock_func_factory):
 
  92         func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
 
  94         assert self.call_nominatim('refresh', *params) == 0
 
  96         assert func_mock.called == len(params)/2
 
  99     @pytest.mark.parametrize('func', ('--data-object', '--data-area'))
 
 100     @pytest.mark.parametrize('param', ('234', 'a55', 'R 453', 'Rel'))
 
 101     def test_refresh_objects_bad_param(self, func, param, mock_func_factory):
 
 102         func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
 
 104         self.call_nominatim('refresh', func, param) == 1
 
 105         assert func_mock.called == 0