]> git.openstreetmap.org Git - nominatim.git/blob - test/python/test_config.py
cd828e142300d3c048b6625afecf75448beb4208
[nominatim.git] / test / python / test_config.py
1 """
2 Test for loading dotenv configuration.
3 """
4 from pathlib import Path
5
6 import pytest
7
8 from nominatim.config import Configuration
9 from nominatim.errors import UsageError
10
11 @pytest.fixture
12 def make_config(src_dir):
13     """ Create a configuration object from the given project directory.
14     """
15     def _mk_config(project_dir=None):
16         return Configuration(project_dir, src_dir / 'settings')
17
18     return _mk_config
19
20
21 def test_no_project_dir(make_config):
22     config = make_config()
23
24     assert config.DATABASE_WEBUSER == 'www-data'
25
26
27 @pytest.mark.parametrize("val", ('apache', '"apache"'))
28 def test_prefer_project_setting_over_default(make_config, val, tmp_path):
29     envfile = tmp_path / '.env'
30     envfile.write_text('NOMINATIM_DATABASE_WEBUSER={}\n'.format(val))
31
32     config = make_config(tmp_path)
33
34     assert config.DATABASE_WEBUSER == 'apache'
35
36
37 def test_prefer_os_environ_over_project_setting(make_config, monkeypatch, tmp_path):
38     envfile = tmp_path / '.env'
39     envfile.write_text('NOMINATIM_DATABASE_WEBUSER=apache\n')
40
41     monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody')
42
43     config = make_config(tmp_path)
44
45     assert config.DATABASE_WEBUSER == 'nobody'
46
47
48 def test_get_os_env_add_defaults(make_config, monkeypatch):
49     config = make_config()
50
51     monkeypatch.delenv('NOMINATIM_DATABASE_WEBUSER', raising=False)
52
53     assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'www-data'
54
55
56 def test_get_os_env_prefer_os_environ(make_config, monkeypatch):
57     config = make_config()
58
59     monkeypatch.setenv('NOMINATIM_DATABASE_WEBUSER', 'nobody')
60
61     assert config.get_os_env()['NOMINATIM_DATABASE_WEBUSER'] == 'nobody'
62
63
64 def test_get_libpq_dsn_convert_default(make_config):
65     config = make_config()
66
67     assert config.get_libpq_dsn() == 'dbname=nominatim'
68
69
70 def test_get_libpq_dsn_convert_php(make_config, monkeypatch):
71     config = make_config()
72
73     monkeypatch.setenv('NOMINATIM_DATABASE_DSN',
74                        'pgsql:dbname=gis;password=foo;host=localhost')
75
76     assert config.get_libpq_dsn() == 'dbname=gis password=foo host=localhost'
77
78
79 @pytest.mark.parametrize("val,expect", [('foo bar', "'foo bar'"),
80                                         ("xy'z", "xy\\'z"),
81                                        ])
82 def test_get_libpq_dsn_convert_php_special_chars(make_config, monkeypatch, val, expect):
83     config = make_config()
84
85     monkeypatch.setenv('NOMINATIM_DATABASE_DSN',
86                        'pgsql:dbname=gis;password={}'.format(val))
87
88     assert config.get_libpq_dsn() == "dbname=gis password={}".format(expect)
89
90
91 def test_get_libpq_dsn_convert_libpq(make_config, monkeypatch):
92     config = make_config()
93
94     monkeypatch.setenv('NOMINATIM_DATABASE_DSN', 
95                        'host=localhost dbname=gis password=foo')
96
97     assert config.get_libpq_dsn() == 'host=localhost dbname=gis password=foo'
98
99
100 @pytest.mark.parametrize("value,result",
101                          [(x, True) for x in ('1', 'true', 'True', 'yes', 'YES')] +
102                          [(x, False) for x in ('0', 'false', 'no', 'NO', 'x')])
103 def test_get_bool(make_config, monkeypatch, value, result):
104     config = make_config()
105
106     monkeypatch.setenv('NOMINATIM_FOOBAR', value)
107
108     assert config.get_bool('FOOBAR') == result
109
110 def test_get_bool_empty(make_config):
111     config = make_config()
112
113     assert config.DATABASE_MODULE_PATH == ''
114     assert config.get_bool('DATABASE_MODULE_PATH') == False
115
116
117 @pytest.mark.parametrize("value,result", [('0', 0), ('1', 1),
118                                           ('85762513444', 85762513444)])
119 def test_get_int_success(make_config, monkeypatch, value, result):
120     config = make_config()
121
122     monkeypatch.setenv('NOMINATIM_FOOBAR', value)
123
124     assert config.get_int('FOOBAR') == result
125
126
127 @pytest.mark.parametrize("value", ['1b', 'fg', '0x23'])
128 def test_get_int_bad_values(make_config, monkeypatch, value):
129     config = make_config()
130
131     monkeypatch.setenv('NOMINATIM_FOOBAR', value)
132
133     with pytest.raises(UsageError):
134         config.get_int('FOOBAR')
135
136
137 def test_get_int_empty(make_config):
138     config = make_config()
139
140     assert config.DATABASE_MODULE_PATH == ''
141
142     with pytest.raises(UsageError):
143         config.get_int('DATABASE_MODULE_PATH')
144
145
146 def test_get_import_style_intern(make_config, monkeypatch):
147     config = make_config()
148
149     monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', 'street')
150
151     expected = DEFCFG_DIR / 'import-street.style'
152
153     assert config.get_import_style_file() == expected
154
155
156 @pytest.mark.parametrize("value", ['custom', '/foo/bar.stye'])
157 def test_get_import_style_intern(make_config, monkeypatch, value):
158     config = make_config()
159
160     monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', value)
161
162     assert str(config.get_import_style_file()) == value