- placex_table, getorcreate_amenity_funcs,
- getorcreate_amenityoperator_funcs, special_phrases_importer):
- pairs = {('class1', 'type1'), ('class2', 'type2')}
-
- special_phrases_importer._create_place_classtype_table_and_indexes(pairs)
-
-def test_process_xml_content(special_phrases_importer, getorcreate_amenity_funcs,
- getorcreate_amenityoperator_funcs):
- special_phrases_importer._process_xml_content(get_test_xml_wiki_content(), 'en')
-
-def mock_get_wiki_content(lang):
- return get_test_xml_wiki_content()
-
-def test_import_from_wiki(monkeypatch, special_phrases_importer, placex_table,
- getorcreate_amenity_funcs, getorcreate_amenityoperator_funcs):
- #mocker.patch.object(special_phrases_importer, '_get_wiki_content', new=mock_get_wiki_content)
- monkeypatch.setattr('nominatim.tools.special_phrases.SpecialPhrasesImporter._get_wiki_content', mock_get_wiki_content)
- special_phrases_importer.import_from_wiki(['en'])
-
-def get_test_xml_wiki_content():
- xml_test_content_path = (TEST_BASE_DIR / 'testdata' / 'special_phrases_test_content.txt').resolve()
- with open(xml_test_content_path) as xml_content_reader:
- return xml_content_reader.read()
-
-@pytest.fixture
-def special_phrases_importer(temp_db_conn, def_config, tmp_phplib_dir):
- return SpecialPhrasesImporter(def_config, tmp_phplib_dir, temp_db_conn)
+ temp_db_conn, def_config, placex_table,
+ sp_importer):
+ """
+ Test that _create_place_classtype_table_and_indexes()
+ create the right place_classtype tables and place_id indexes
+ and centroid indexes and grant access to the web user
+ for the given set of pairs.
+ """
+ pairs = set([('class1', 'type1'), ('class2', 'type2')])
+
+ sp_importer._create_place_classtype_table_and_indexes(pairs)
+
+ for pair in pairs:
+ assert check_table_exist(temp_db_conn, pair[0], pair[1])
+ assert check_placeid_and_centroid_indexes(temp_db_conn, pair[0], pair[1])
+ assert check_grant_access(temp_db_conn, def_config.DATABASE_WEBUSER, pair[0], pair[1])
+
+def test_remove_non_existent_tables_from_db(sp_importer, default_phrases,
+ temp_db_conn):
+ """
+ Check for the remove_non_existent_phrases_from_db() method.
+
+ It should removed entries from the word table which are contained
+ in the words_phrases_to_delete set and not those also contained
+ in the words_phrases_still_exist set.
+
+ place_classtype tables contained in table_phrases_to_delete should
+ be deleted.
+ """
+ sp_importer.table_phrases_to_delete = {
+ 'place_classtype_testclasstypetable_to_delete'
+ }
+
+ query_tables = """
+ SELECT table_name
+ FROM information_schema.tables
+ WHERE table_schema='public'
+ AND table_name like 'place_classtype_%';
+ """
+
+ sp_importer._remove_non_existent_tables_from_db()
+
+ # Changes are not committed yet. Use temp_db_conn for checking results.
+ with temp_db_conn.cursor(cursor_factory=CursorForTesting) as cur:
+ assert cur.row_set(query_tables) \
+ == {('place_classtype_testclasstypetable_to_keep', )}
+
+
+@pytest.mark.parametrize("should_replace", [(True), (False)])
+def test_import_phrases(monkeypatch, temp_db_conn, def_config, sp_importer,
+ placex_table, table_factory, tokenizer_mock,
+ xml_wiki_content, should_replace):
+ """
+ Check that the main import_phrases() method is well executed.
+ It should create the place_classtype table, the place_id and centroid indexes,
+ grand access to the web user and executing the SQL functions for amenities.
+ It should also update the database well by deleting or preserving existing entries
+ of the database.
+ """
+ #Add some data to the database before execution in order to test
+ #what is deleted and what is preserved.
+ table_factory('place_classtype_amenity_animal_shelter')
+ table_factory('place_classtype_wrongclass_wrongtype')
+
+ monkeypatch.setattr('nominatim.tools.special_phrases.sp_wiki_loader.SPWikiLoader._get_wiki_content',
+ lambda self, lang: xml_wiki_content)
+
+ tokenizer = tokenizer_mock()
+ sp_importer.import_phrases(tokenizer, should_replace)
+
+ assert len(tokenizer.analyser_cache['special_phrases']) == 18
+
+ class_test = 'aerialway'
+ type_test = 'zip_line'
+
+ assert check_table_exist(temp_db_conn, class_test, type_test)
+ assert check_placeid_and_centroid_indexes(temp_db_conn, class_test, type_test)
+ assert check_grant_access(temp_db_conn, def_config.DATABASE_WEBUSER, class_test, type_test)
+ assert check_table_exist(temp_db_conn, 'amenity', 'animal_shelter')
+ if should_replace:
+ assert not check_table_exist(temp_db_conn, 'wrong_class', 'wrong_type')
+
+ assert temp_db_conn.table_exists('place_classtype_amenity_animal_shelter')
+ if should_replace:
+ assert not temp_db_conn.table_exists('place_classtype_wrongclass_wrongtype')
+
+def check_table_exist(temp_db_conn, phrase_class, phrase_type):
+ """
+ Verify that the place_classtype table exists for the given
+ phrase_class and phrase_type.
+ """
+ return temp_db_conn.table_exists('place_classtype_{}_{}'.format(phrase_class, phrase_type))
+
+
+def check_grant_access(temp_db_conn, user, phrase_class, phrase_type):
+ """
+ Check that the web user has been granted right access to the
+ place_classtype table of the given phrase_class and phrase_type.
+ """
+ table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)