X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/db1aa4d02eeb4f878b3f9b4883cd21e8ba51ca0d..0af8dac3d35a94afe0b6ad775f3226d8d147501d:/test/bdd/steps/steps_api_queries.py diff --git a/test/bdd/steps/steps_api_queries.py b/test/bdd/steps/steps_api_queries.py index 9f865ab7..4d15381d 100644 --- a/test/bdd/steps/steps_api_queries.py +++ b/test/bdd/steps/steps_api_queries.py @@ -1,13 +1,10 @@ -# 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. """ Steps that run queries against the API. - - Queries may either be run directly via PHP using the query script - or via the HTTP interface using php-cgi. """ from pathlib import Path import json @@ -15,6 +12,7 @@ import os import re import logging import asyncio +import xml.etree.ElementTree as ET from urllib.parse import urlencode from utils import run_script @@ -24,29 +22,6 @@ from table_compare import NominatimID LOG = logging.getLogger(__name__) -BASE_SERVER_ENV = { - 'HTTP_HOST' : 'localhost', - 'HTTP_USER_AGENT' : 'Mozilla/5.0 (X11; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0', - 'HTTP_ACCEPT' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', - 'HTTP_ACCEPT_ENCODING' : 'gzip, deflate', - 'HTTP_CONNECTION' : 'keep-alive', - 'SERVER_SIGNATURE' : '
Nominatim BDD Tests', - 'SERVER_SOFTWARE' : 'Nominatim test', - 'SERVER_NAME' : 'localhost', - 'SERVER_ADDR' : '127.0.1.1', - 'SERVER_PORT' : '80', - 'REMOTE_ADDR' : '127.0.0.1', - 'DOCUMENT_ROOT' : '/var/www', - 'REQUEST_SCHEME' : 'http', - 'CONTEXT_PREFIX' : '/', - 'SERVER_ADMIN' : 'webmaster@localhost', - 'REMOTE_PORT' : '49319', - 'GATEWAY_INTERFACE' : 'CGI/1.1', - 'SERVER_PROTOCOL' : 'HTTP/1.1', - 'REQUEST_METHOD' : 'GET', - 'REDIRECT_STATUS' : 'CGI' -} - def make_todo_list(context, result_id): if result_id is None: @@ -73,8 +48,12 @@ def compare(operator, op1, op2): def send_api_query(endpoint, params, fmt, context): - if fmt is not None and fmt.strip() != 'debug': - params['format'] = fmt.strip() + if fmt is not None: + if fmt.strip() == 'debug': + params['debug'] = '1' + else: + params['format'] = fmt.strip() + if context.table: if context.table.headings[0] == 'param': for line in context.table: @@ -83,68 +62,19 @@ def send_api_query(endpoint, params, fmt, context): for h in context.table.headings: params[h] = context.table[0][h] - if context.nominatim.api_engine is None: - return send_api_query_php(endpoint, params, context) - return asyncio.run(context.nominatim.api_engine(endpoint, params, Path(context.nominatim.website_dir.name), context.nominatim.test_env, getattr(context, 'http_headers', {}))) - -def send_api_query_php(endpoint, params, context): - env = dict(BASE_SERVER_ENV) - env['QUERY_STRING'] = urlencode(params) - - env['SCRIPT_NAME'] = f'/{endpoint}.php' - env['REQUEST_URI'] = f"{env['SCRIPT_NAME']}?{env['QUERY_STRING']}" - env['CONTEXT_DOCUMENT_ROOT'] = os.path.join(context.nominatim.website_dir.name, 'website') - env['SCRIPT_FILENAME'] = os.path.join(env['CONTEXT_DOCUMENT_ROOT'], - f'{endpoint}.php') - - LOG.debug("Environment:" + json.dumps(env, sort_keys=True, indent=2)) - - if hasattr(context, 'http_headers'): - env.update(context.http_headers) - - cmd = ['/usr/bin/env', 'php-cgi', '-f'] - if context.nominatim.code_coverage_path: - env['XDEBUG_MODE'] = 'coverage' - env['COV_SCRIPT_FILENAME'] = env['SCRIPT_FILENAME'] - env['COV_PHP_DIR'] = context.nominatim.src_dir - env['COV_TEST_NAME'] = f"{context.scenario.filename}:{context.scenario.line}" - env['SCRIPT_FILENAME'] = \ - os.path.join(os.path.split(__file__)[0], 'cgi-with-coverage.php') - cmd.append(env['SCRIPT_FILENAME']) - env['PHP_CODE_COVERAGE_FILE'] = context.nominatim.next_code_coverage_file() - else: - cmd.append(env['SCRIPT_FILENAME']) - - for k,v in params.items(): - cmd.append(f"{k}={v}") - - outp, err = run_script(cmd, cwd=context.nominatim.website_dir.name, env=env) - - assert len(err) == 0, f"Unexpected PHP error: {err}" - - if outp.startswith('Status: '): - status = int(outp[8:11]) - else: - status = 200 - - content_start = outp.find('\r\n\r\n') - - return outp[content_start + 4:], status - @given(u'the HTTP header') def add_http_header(context): if not hasattr(context, 'http_headers'): context.http_headers = {} for h in context.table.headings: - envvar = 'HTTP_' + h.upper().replace('-', '_') - context.http_headers[envvar] = context.table[0][h] + context.http_headers[h] = context.table[0][h] @when(u'sending (?P