]> git.openstreetmap.org Git - nominatim.git/blob - test/python/test_tools_exec_utils.py
Merge pull request #2147 from lonvia/tests-for-python-code
[nominatim.git] / test / python / test_tools_exec_utils.py
1 """
2 Tests for tools.exec_utils module.
3 """
4 from pathlib import Path
5 import subprocess
6 import tempfile
7
8 import pytest
9
10 from nominatim.config import Configuration
11 import nominatim.tools.exec_utils as exec_utils
12
13 @pytest.fixture
14 def tmp_phplib_dir():
15     with tempfile.TemporaryDirectory() as phpdir:
16         (Path(phpdir) / 'admin').mkdir()
17
18         yield Path(phpdir)
19
20 @pytest.fixture
21 def nominatim_env(tmp_phplib_dir):
22     class _NominatimEnv:
23         config = Configuration(None, Path(__file__) / '..' / '..' / '..' / 'settings')
24         phplib_dir = tmp_phplib_dir
25         data_dir = Path('data')
26         project_dir = Path('.')
27         module_dir = 'module'
28         osm2pgsql_path = 'osm2pgsql'
29
30     return _NominatimEnv
31
32 @pytest.fixture
33 def test_script(nominatim_env):
34     def _create_file(code):
35         with (nominatim_env.phplib_dir / 'admin' / 't.php').open(mode='w') as fd:
36             fd.write('<?php\n')
37             fd.write(code + '\n')
38
39         return 't.php'
40
41     return _create_file
42
43 @pytest.fixture(params=[0, 1, 15, 255])
44 def return_code(request):
45     return request.param
46
47 ### run_legacy_script
48
49 def test_run_legacy_return_exit_code(nominatim_env, test_script, return_code):
50     fname = test_script('exit({});'.format(return_code))
51     assert return_code == exec_utils.run_legacy_script(fname,
52                                                        nominatim_env=nominatim_env)
53
54
55 def test_run_legacy_return_throw_on_fail(nominatim_env, test_script):
56     fname = test_script('exit(11);')
57     with pytest.raises(subprocess.CalledProcessError):
58         exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env,
59                                      throw_on_fail=True)
60
61
62 def test_run_legacy_return_dont_throw_on_success(nominatim_env, test_script):
63     fname = test_script('exit(0);')
64     assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env,
65                                              throw_on_fail=True)
66
67 def test_run_legacy_use_given__module_path(nominatim_env, test_script):
68     fname = test_script("exit($_SERVER['NOMINATIM_DATABASE_MODULE_PATH'] == 'module' ? 0 : 23);")
69
70     assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env)
71
72
73 def test_run_legacy_do_not_overwrite_module_path(nominatim_env, test_script, monkeypatch):
74     monkeypatch.setenv('NOMINATIM_DATABASE_MODULE_PATH', 'other')
75     fname = test_script("exit($_SERVER['NOMINATIM_DATABASE_MODULE_PATH'] == 'other' ? 0 : 1);")
76
77     assert 0 == exec_utils.run_legacy_script(fname, nominatim_env=nominatim_env)
78
79 ### run_api_script
80
81 @pytest.fixture
82 def tmp_project_dir():
83     with tempfile.TemporaryDirectory() as tempd:
84         project_dir = Path(tempd)
85         webdir = project_dir / 'website'
86         webdir.mkdir()
87
88         with (webdir / 'test.php').open(mode='w') as fd:
89             fd.write("<?php\necho 'OK\n';")
90
91         yield project_dir
92
93 def test_run_api(tmp_project_dir):
94     assert 0 == exec_utils.run_api_script('test', tmp_project_dir)
95
96 def test_run_api_execution_error(tmp_project_dir):
97     assert 0 != exec_utils.run_api_script('badname', tmp_project_dir)
98
99 def test_run_api_with_extra_env(tmp_project_dir):
100     extra_env = dict(SCRIPT_FILENAME=str(tmp_project_dir / 'website' / 'test.php'))
101     assert 0 == exec_utils.run_api_script('badname', tmp_project_dir,
102                                           extra_env=extra_env)