X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/adeebec32a5e75318eb8714a38087055e3b2e757..67462e095319038fa53636decb69dcf40f0c6dee:/test/python/conftest.py diff --git a/test/python/conftest.py b/test/python/conftest.py index 40526295..3ced3205 100644 --- a/test/python/conftest.py +++ b/test/python/conftest.py @@ -1,24 +1,25 @@ -# 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. import itertools import sys from pathlib import Path -import psycopg2 +import psycopg +from psycopg import sql as pysql import pytest # always test against the source SRC_DIR = (Path(__file__) / '..' / '..' / '..').resolve() -sys.path.insert(0, str(SRC_DIR)) +sys.path.insert(0, str(SRC_DIR / 'src')) -from nominatim.config import Configuration -from nominatim.db import connection -from nominatim.db.sql_preprocessor import SQLPreprocessor -import nominatim.tokenizer.factory +from nominatim_db.config import Configuration +from nominatim_db.db import connection +from nominatim_db.db.sql_preprocessor import SQLPreprocessor +import nominatim_db.tokenizer.factory import dummy_tokenizer import mocks @@ -36,26 +37,23 @@ def temp_db(monkeypatch): exported into NOMINATIM_DATABASE_DSN. """ name = 'test_nominatim_python_unittest' - conn = psycopg2.connect(database='postgres') - conn.set_isolation_level(0) - with conn.cursor() as cur: - cur.execute('DROP DATABASE IF EXISTS {}'.format(name)) - cur.execute('CREATE DATABASE {}'.format(name)) - - conn.close() + with psycopg.connect(dbname='postgres', autocommit=True) as conn: + with conn.cursor() as cur: + cur.execute(pysql.SQL('DROP DATABASE IF EXISTS') + pysql.Identifier(name)) + cur.execute(pysql.SQL('CREATE DATABASE') + pysql.Identifier(name)) monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 'dbname=' + name) - yield name - - conn = psycopg2.connect(database='postgres') + with psycopg.connect(dbname=name) as conn: + with conn.cursor() as cur: + cur.execute('CREATE EXTENSION hstore') - conn.set_isolation_level(0) - with conn.cursor() as cur: - cur.execute('DROP DATABASE IF EXISTS {}'.format(name)) + yield name - conn.close() + with psycopg.connect(dbname='postgres', autocommit=True) as conn: + with conn.cursor() as cur: + cur.execute('DROP DATABASE IF EXISTS {}'.format(name)) @pytest.fixture @@ -65,11 +63,9 @@ def dsn(temp_db): @pytest.fixture def temp_db_with_extensions(temp_db): - conn = psycopg2.connect(database=temp_db) - with conn.cursor() as cur: - cur.execute('CREATE EXTENSION hstore; CREATE EXTENSION postgis;') - conn.commit() - conn.close() + with psycopg.connect(dbname=temp_db) as conn: + with conn.cursor() as cur: + cur.execute('CREATE EXTENSION postgis') return temp_db @@ -77,7 +73,8 @@ def temp_db_with_extensions(temp_db): def temp_db_conn(temp_db): """ Connection to the test database. """ - with connection.connect('dbname=' + temp_db) as conn: + with connection.connect('', autocommit=True, dbname=temp_db) as conn: + connection.register_hstore(conn) yield conn @@ -86,45 +83,42 @@ def temp_db_cursor(temp_db): """ Connection and cursor towards the test database. The connection will be in auto-commit mode. """ - conn = psycopg2.connect('dbname=' + temp_db) - conn.set_isolation_level(0) - with conn.cursor(cursor_factory=CursorForTesting) as cur: - yield cur - conn.close() + with psycopg.connect(dbname=temp_db, autocommit=True, cursor_factory=CursorForTesting) as conn: + connection.register_hstore(conn) + with conn.cursor() as cur: + yield cur @pytest.fixture -def table_factory(temp_db_cursor): +def table_factory(temp_db_conn): """ A fixture that creates new SQL tables, potentially filled with content. """ def mk_table(name, definition='id INT', content=None): - temp_db_cursor.execute('CREATE TABLE {} ({})'.format(name, definition)) - if content is not None: - temp_db_cursor.execute_values("INSERT INTO {} VALUES %s".format(name), content) + with psycopg.ClientCursor(temp_db_conn) as cur: + cur.execute('CREATE TABLE {} ({})'.format(name, definition)) + if content: + sql = pysql.SQL("INSERT INTO {} VALUES ({})")\ + .format(pysql.Identifier(name), + pysql.SQL(',').join([pysql.Placeholder() for _ in range(len(content[0]))])) + cur.executemany(sql , content) return mk_table @pytest.fixture -def def_config(src_dir): - cfg = Configuration(None, src_dir / 'settings') - cfg.set_libdirs(module='.', osm2pgsql='.', - php=src_dir / 'lib-php', - sql=src_dir / 'lib-sql', - data=src_dir / 'data') +def def_config(): + cfg = Configuration(None) + cfg.set_libdirs(module='.', osm2pgsql='.') return cfg @pytest.fixture -def project_env(src_dir, tmp_path): +def project_env(tmp_path): projdir = tmp_path / 'project' projdir.mkdir() - cfg = Configuration(projdir, src_dir / 'settings') - cfg.set_libdirs(module='.', osm2pgsql='.', - php=src_dir / 'lib-php', - sql=src_dir / 'lib-sql', - data=src_dir / 'data') + cfg = Configuration(projdir) + cfg.set_libdirs(module='.', osm2pgsql='.') return cfg @@ -174,7 +168,6 @@ def place_row(place_table, temp_db_cursor): """ A factory for rows in the place table. The table is created as a prerequisite to the fixture. """ - psycopg2.extras.register_hstore(temp_db_cursor) idseq = itertools.count(1001) def _insert(osm_type='N', osm_id=None, cls='amenity', typ='cafe', names=None, admin_level=None, address=None, extratags=None, geom=None): @@ -214,9 +207,8 @@ def osmline_table(temp_db_with_extensions, table_factory): @pytest.fixture def sql_preprocessor_cfg(tmp_path, table_factory, temp_db_with_extensions): table_factory('country_name', 'partition INT', ((0, ), (1, ), (2, ))) - cfg = Configuration(None, SRC_DIR.resolve() / 'settings') - cfg.set_libdirs(module='.', osm2pgsql='.', php=SRC_DIR / 'lib-php', - sql=tmp_path, data=SRC_DIR / 'data') + cfg = Configuration(None) + cfg.set_libdirs(module='.', osm2pgsql='.', sql=tmp_path) return cfg @@ -236,7 +228,8 @@ def tokenizer_mock(monkeypatch, property_table): def _import_dummy(*args, **kwargs): return dummy_tokenizer - monkeypatch.setattr(nominatim.tokenizer.factory, "_import_tokenizer", _import_dummy) + monkeypatch.setattr(nominatim_db.tokenizer.factory, + "_import_tokenizer", _import_dummy) property_table.set('tokenizer', 'dummy') def _create_tokenizer():