Files
Nominatim/test/python/test_tools_exec_utils.py
Sarah Hoffmann cb06d1f4ca do not overwrite custom set module paths
Given that the module is now copied to the project directory
when no module path is set, we need the information that the
module path is empty. Therefore hand in the default module path
in a separate variable.
2021-02-02 18:31:25 +01:00

111 lines
3.5 KiB
Python

"""
Tests for tools.exec_utils module.
"""
from pathlib import Path
import subprocess
import tempfile
import pytest
import nominatim.tools.exec_utils as exec_utils
@pytest.fixture
def tmp_phplib_dir():
with tempfile.TemporaryDirectory() as phpdir:
(Path(phpdir) / 'admin').mkdir()
yield Path(phpdir)
@pytest.fixture
def nominatim_env(tmp_phplib_dir, def_config):
class _NominatimEnv:
config = def_config
phplib_dir = tmp_phplib_dir
data_dir = Path('data')
project_dir = Path('.')
module_dir = 'module'
osm2pgsql_path = 'osm2pgsql'
return _NominatimEnv
@pytest.fixture
def test_script(nominatim_env):
def _create_file(code):
with (nominatim_env.phplib_dir / 'admin' / 't.php').open(mode='w') as fd:
fd.write('<?php\n')
fd.write(code + '\n')
return 't.php'
return _create_file
@pytest.fixture(params=[0, 1, 15, 255])
def return_code(request):
return request.param
### run_legacy_script
def test_run_legacy_return_exit_code(nominatim_env, test_script, return_code):
fname = test_script('exit({});'.format(return_code))
assert return_code == exec_utils.run_legacy_script(fname,
nominatim_env=nominatim_env)
def test_run_legacy_return_throw_on_fail(nominatim_env, test_script):
fname = test_script('exit(11);')
with pytest.raises(subprocess.CalledProcessError):
exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env,
throw_on_fail=True)
def test_run_legacy_return_dont_throw_on_success(nominatim_env, test_script):
fname = test_script('exit(0);')
assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env,
throw_on_fail=True)
def test_run_legacy_use_given_module_path(nominatim_env, test_script):
fname = test_script("exit($_SERVER['NOMINATIM_DATABASE_MODULE_PATH'] == '' ? 0 : 23);")
assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env)
def test_run_legacy_do_not_overwrite_module_path(nominatim_env, test_script, monkeypatch):
monkeypatch.setenv('NOMINATIM_DATABASE_MODULE_PATH', 'other')
fname = test_script("exit($_SERVER['NOMINATIM_DATABASE_MODULE_PATH'] == 'other' ? 0 : 1);")
assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env)
### run_api_script
@pytest.fixture
def tmp_project_dir():
with tempfile.TemporaryDirectory() as tempd:
project_dir = Path(tempd)
webdir = project_dir / 'website'
webdir.mkdir()
with (webdir / 'test.php').open(mode='w') as fd:
fd.write("<?php\necho 'OK\n';")
yield project_dir
def test_run_api(tmp_project_dir):
assert 0 == exec_utils.run_api_script('test', tmp_project_dir)
def test_run_api_execution_error(tmp_project_dir):
assert 0 != exec_utils.run_api_script('badname', tmp_project_dir)
def test_run_api_with_extra_env(tmp_project_dir):
extra_env = dict(SCRIPT_FILENAME=str(tmp_project_dir / 'website' / 'test.php'))
assert 0 == exec_utils.run_api_script('badname', tmp_project_dir,
extra_env=extra_env)
### run_osm2pgsql
def test_run_osm2pgsql():
exec_utils.run_osm2pgsql(dict(osm2pgsql='echo', append=False, flatnode_file=None,
dsn='dbname=foobar', threads=1, osm2pgsql_cache=500,
osm2pgsql_style='./my.style',
import_file='foo.bar'))