X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/adeebec32a5e75318eb8714a38087055e3b2e757..0770eaa5d04200aec75653b1ec495ba1a214eaab:/test/python/tools/test_postcodes.py diff --git a/test/python/tools/test_postcodes.py b/test/python/tools/test_postcodes.py index bdfe3094..f035bb19 100644 --- a/test/python/tools/test_postcodes.py +++ b/test/python/tools/test_postcodes.py @@ -1,8 +1,8 @@ -# SPDX-License-Identifier: GPL-2.0-only +# SPDX-License-Identifier: GPL-3.0-or-later # # This file is part of Nominatim. (https://nominatim.org) # -# Copyright (C) 2022 by the Nominatim developer community. +# Copyright (C) 2024 by the Nominatim developer community. # For a full list of authors see the git log. """ Tests for functions to maintain the artificial postcode table. @@ -11,7 +11,8 @@ import subprocess import pytest -from nominatim.tools import postcodes +from nominatim_db.tools import postcodes +from nominatim_db.data import country_info import dummy_tokenizer class MockPostcodeTable: @@ -46,7 +47,7 @@ class MockPostcodeTable: country_code, postcode, geometry) VALUES (nextval('seq_place'), 1, %s, %s, - 'SRID=4326;POINT(%s %s)')""", + ST_SetSRID(ST_MakePoint(%s, %s), 4326))""", (country, postcode, x, y)) self.conn.commit() @@ -64,11 +65,26 @@ class MockPostcodeTable: def tokenizer(): return dummy_tokenizer.DummyTokenizer(None, None) + @pytest.fixture -def postcode_table(temp_db_conn, placex_table): +def postcode_table(def_config, temp_db_conn, placex_table): + country_info.setup_country_config(def_config) return MockPostcodeTable(temp_db_conn) +@pytest.fixture +def insert_implicit_postcode(placex_table, place_row): + """ + Inserts data into the placex and place table + which can then be used to compute one postcode. + """ + def _insert_implicit_postcode(osm_id, country, geometry, address): + placex_table.add(osm_id=osm_id, country=country, geom=geometry) + place_row(osm_id=osm_id, geom='SRID=4326;'+geometry, address=address) + + return _insert_implicit_postcode + + def test_postcodes_empty(dsn, postcode_table, place_table, tmp_path, tokenizer): postcodes.update_postcodes(dsn, tmp_path, tokenizer) @@ -193,27 +209,30 @@ def test_can_compute(dsn, table_factory): table_factory('place') assert postcodes.can_compute(dsn) + def test_no_placex_entry(dsn, tmp_path, temp_db_cursor, place_row, postcode_table, tokenizer): #Rewrite the get_country_code function to verify its execution. temp_db_cursor.execute(""" CREATE OR REPLACE FUNCTION get_country_code(place geometry) RETURNS TEXT AS $$ BEGIN - RETURN 'fr'; + RETURN 'yy'; END; $$ LANGUAGE plpgsql; """) place_row(geom='SRID=4326;POINT(10 12)', address=dict(postcode='AB 4511')) postcodes.update_postcodes(dsn, tmp_path, tokenizer) - assert postcode_table.row_set == {('fr', 'AB 4511', 10, 12)} + assert postcode_table.row_set == {('yy', 'AB 4511', 10, 12)} -@pytest.fixture -def insert_implicit_postcode(placex_table, place_row): - """ - Inserts data into the placex and place table - which can then be used to compute one postcode. - """ - def _insert_implicit_postcode(osm_id, country, geometry, address): - placex_table.add(osm_id=osm_id, country=country, geom=geometry) - place_row(osm_id=osm_id, geom='SRID=4326;'+geometry, address=address) - return _insert_implicit_postcode +def test_discard_badly_formatted_postcodes(dsn, tmp_path, temp_db_cursor, place_row, postcode_table, tokenizer): + #Rewrite the get_country_code function to verify its execution. + temp_db_cursor.execute(""" + CREATE OR REPLACE FUNCTION get_country_code(place geometry) + RETURNS TEXT AS $$ BEGIN + RETURN 'fr'; + END; $$ LANGUAGE plpgsql; + """) + place_row(geom='SRID=4326;POINT(10 12)', address=dict(postcode='AB 4511')) + postcodes.update_postcodes(dsn, tmp_path, tokenizer) + + assert not postcode_table.row_set