From dae643c040d4b2a10d854b73ca3cdc5afb51a907 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Thu, 3 Apr 2025 11:20:38 +0200 Subject: [PATCH] move database setup to generic conftest.py --- test/bdd/conftest.py | 56 ++++++++++++++++++++++++++++++++++- test/bdd/test_osm2pgsql.py | 60 +------------------------------------- 2 files changed, 56 insertions(+), 60 deletions(-) diff --git a/test/bdd/conftest.py b/test/bdd/conftest.py index b23e8740..8aec5782 100644 --- a/test/bdd/conftest.py +++ b/test/bdd/conftest.py @@ -11,6 +11,8 @@ import sys import json from pathlib import Path +import psycopg + # always test against the source SRC_DIR = (Path(__file__) / '..' / '..' / '..').resolve() sys.path.insert(0, str(SRC_DIR / 'src')) @@ -23,12 +25,13 @@ pytest.register_assert_rewrite('utils') from utils.api_runner import APIRunner from utils.api_result import APIResult -from utils.checks import ResultAttr, COMPARATOR_TERMS +from utils.checks import ResultAttr, COMPARATOR_TERMS, check_table_content, check_table_has_lines from utils.geometry_alias import ALIASES from utils.grid import Grid from utils.db import DBManager from nominatim_db.config import Configuration +from nominatim_db import cli def _strlist(inp): @@ -95,6 +98,38 @@ def template_db(pytestconfig): return template_db +@pytest.fixture +def def_config(pytestconfig): + dbname = pytestconfig.getini('nominatim_test_db') + + return Configuration(None, + environ={'NOMINATIM_DATABASE_DSN': f"pgsql:dbname={dbname}"}) + + +@pytest.fixture +def db(template_db, pytestconfig): + """ Set up an empty database for use with osm2pgsql. + """ + dbm = DBManager(purge=pytestconfig.option.NOMINATIM_PURGE) + + dbname = pytestconfig.getini('nominatim_test_db') + + dbm.create_db_from_template(dbname, template_db) + + yield dbname + + if not pytestconfig.option.NOMINATIM_KEEP_DB: + dbm.drop_db(dbname) + + +@pytest.fixture +def db_conn(def_config): + with psycopg.connect(def_config.get_libpq_dsn()) as conn: + info = psycopg.types.TypeInfo.fetch(conn, "hstore") + psycopg.types.hstore.register_hstore(info, conn) + yield conn + + @when(step_parse(r'reverse geocoding (?P[\d.-]*),(?P[\d.-]*)'), target_fixture='nominatim_result') def reverse_geocode_via_api(test_config_env, pytestconfig, datatable, lat, lon): @@ -278,3 +313,22 @@ def set_node_grid(datatable, step, origin): raise RuntimeError('Grid origin must be either coordinate or alias.') return Grid(datatable, step, origin) + + +@when('indexing') +def do_index(def_config): + """ Run Nominatim's indexing step. + """ + cli.nominatim(['index'], def_config.environ) + + +@then(step_parse(r'(?P\w+) contains(?P exactly)?')) +def check_place_content(db_conn, datatable, node_grid, table, exact): + check_table_content(db_conn, table, datatable, grid=node_grid, exact=bool(exact)) + + +@then(step_parse('(?P
placex?) has no entry for ' + r'(?P[NRW])(?P\d+)(?::(?P\S+))?'), + converters={'osm_id': int}) +def check_place_missing_lines(db_conn, table, osm_type, osm_id, osm_class): + check_table_has_lines(db_conn, table, osm_type, osm_id, osm_class) diff --git a/test/bdd/test_osm2pgsql.py b/test/bdd/test_osm2pgsql.py index 0575ce92..43262519 100644 --- a/test/bdd/test_osm2pgsql.py +++ b/test/bdd/test_osm2pgsql.py @@ -10,53 +10,14 @@ Collector for BDD osm2pgsql import style tests. import asyncio import random -import psycopg - import pytest -from pytest_bdd.parsers import re as step_parse -from pytest_bdd import scenarios, when, given, then +from pytest_bdd import scenarios, when, given from nominatim_db import cli -from nominatim_db.config import Configuration from nominatim_db.tools.exec_utils import run_osm2pgsql from nominatim_db.tools.database_import import load_data, create_table_triggers from nominatim_db.tools.replication import run_osm2pgsql_updates -from utils.db import DBManager -from utils.checks import check_table_content, check_table_has_lines - - -@pytest.fixture -def def_config(pytestconfig): - dbname = pytestconfig.getini('nominatim_test_db') - - return Configuration(None, - environ={'NOMINATIM_DATABASE_DSN': f"pgsql:dbname={dbname}"}) - - -@pytest.fixture -def db(template_db, pytestconfig): - """ Set up an empty database for use with osm2pgsql. - """ - dbm = DBManager(purge=pytestconfig.option.NOMINATIM_PURGE) - - dbname = pytestconfig.getini('nominatim_test_db') - - dbm.create_db_from_template(dbname, template_db) - - yield dbname - - if not pytestconfig.option.NOMINATIM_KEEP_DB: - dbm.drop_db(dbname) - - -@pytest.fixture -def db_conn(def_config): - with psycopg.connect(def_config.get_libpq_dsn()) as conn: - info = psycopg.types.TypeInfo.fetch(conn, "hstore") - psycopg.types.hstore.register_hstore(info, conn) - yield conn - @pytest.fixture def osm2pgsql_options(def_config): @@ -130,23 +91,4 @@ def update_from_osm_file(db_conn, def_config, osm2pgsql_options, opl_writer, doc run_osm2pgsql_updates(db_conn, osm2pgsql_options) -@when('indexing') -def do_index(def_config): - """ Run Nominatim's indexing step. - """ - cli.nominatim(['index'], def_config.environ) - - -@then(step_parse(r'(?P
\w+) contains(?P exactly)?')) -def check_place_content(db_conn, datatable, node_grid, table, exact): - check_table_content(db_conn, table, datatable, grid=node_grid, exact=bool(exact)) - - -@then(step_parse('(?P
placex?) has no entry for ' - r'(?P[NRW])(?P\d+)(?::(?P\S+))?'), - converters={'osm_id': int}) -def check_place_missing_lines(db_conn, table, osm_type, osm_id, osm_class): - check_table_has_lines(db_conn, table, osm_type, osm_id, osm_class) - - scenarios('features/osm2pgsql') -- 2.39.5