+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2024 by the Nominatim developer community.
+# For a full list of authors see the git log.
"""
Test for loading dotenv configuration.
"""
from pathlib import Path
import pytest
-from nominatim.config import Configuration
-from nominatim.errors import UsageError
+from nominatim_db.config import Configuration, flatten_config_list
+from nominatim_db.errors import UsageError
@pytest.fixture
-def make_config(src_dir):
+def make_config():
""" Create a configuration object from the given project directory.
"""
def _mk_config(project_dir=None):
- return Configuration(project_dir, src_dir / 'settings')
+ return Configuration(project_dir)
return _mk_config
@pytest.fixture
-def make_config_path(src_dir, tmp_path):
+def make_config_path(tmp_path):
""" Create a configuration object with project and config directories
in a temporary directory.
"""
def _mk_config():
(tmp_path / 'project').mkdir()
(tmp_path / 'config').mkdir()
- conf = Configuration(tmp_path / 'project', src_dir / 'settings')
+ conf = Configuration(tmp_path / 'project')
conf.config_dir = tmp_path / 'config'
return conf
def test_get_bool_empty(make_config):
config = make_config()
- assert config.DATABASE_MODULE_PATH == ''
- assert not config.get_bool('DATABASE_MODULE_PATH')
+ assert config.TOKENIZER_CONFIG == ''
+ assert not config.get_bool('TOKENIZER_CONFIG')
@pytest.mark.parametrize("value,result", [('0', 0), ('1', 1),
def test_get_int_empty(make_config):
config = make_config()
- assert config.DATABASE_MODULE_PATH == ''
+ assert config.TOKENIZER_CONFIG == ''
with pytest.raises(UsageError):
- config.get_int('DATABASE_MODULE_PATH')
+ config.get_int('TOKENIZER_CONFIG')
+
+
+@pytest.mark.parametrize("value,outlist", [('sd', ['sd']),
+ ('dd,rr', ['dd', 'rr']),
+ (' a , b ', ['a', 'b'])])
+def test_get_str_list_success(make_config, monkeypatch, value, outlist):
+ config = make_config()
+
+ monkeypatch.setenv('NOMINATIM_MYLIST', value)
+
+ assert config.get_str_list('MYLIST') == outlist
+
+
+def test_get_str_list_empty(make_config):
+ config = make_config()
+
+ assert config.get_str_list('LANGUAGES') is None
def test_get_path_empty(make_config):
config = make_config()
- assert config.DATABASE_MODULE_PATH == ''
- assert not config.get_path('DATABASE_MODULE_PATH')
+ assert config.TOKENIZER_CONFIG == ''
+ assert not config.get_path('TOKENIZER_CONFIG')
def test_get_path_absolute(make_config, monkeypatch):
monkeypatch.setenv('NOMINATIM_IMPORT_STYLE', 'street')
- expected = src_dir / 'settings' / 'import-street.style'
+ expected = src_dir / 'settings' / 'import-street.lua'
assert config.get_import_style_file() == expected
rules = config.load_sub_configuration('test.yaml', config='MY_CONFIG')
+def test_load_subconf_json(make_config_path):
+ config = make_config_path()
+
+ (config.project_dir / 'test.json').write_text('{"cow": "muh", "cat": "miau"}')
+
+ rules = config.load_sub_configuration('test.json')
+
+ assert rules == dict(cow='muh', cat='miau')
+
def test_load_subconf_not_found(make_config_path):
config = make_config_path()
with pytest.raises(UsageError, match='Config file not found.'):
- rules = config.load_sub_configuration('test.yaml')
+ config.load_sub_configuration('test.yaml')
+
+
+def test_load_subconf_env_unknown_format(make_config_path):
+ config = make_config_path()
+
+ (config.project_dir / 'test.xml').write_text('<html></html>')
+
+ with pytest.raises(UsageError, match='unknown format'):
+ config.load_sub_configuration('test.xml')
def test_load_subconf_include_absolute(make_config_path, tmp_path):
rules = config.load_sub_configuration('test.yaml')
assert rules == dict(base=[['the end'], 'upper'])
+
+
+@pytest.mark.parametrize("content", [[], None])
+def test_flatten_config_list_empty(content):
+ assert flatten_config_list(content) == []
+
+
+@pytest.mark.parametrize("content", [{'foo': 'bar'}, 'hello world', 3])
+def test_flatten_config_list_no_list(content):
+ with pytest.raises(UsageError):
+ flatten_config_list(content)
+
+
+def test_flatten_config_list_allready_flat():
+ assert flatten_config_list([1, 2, 456]) == [1, 2, 456]
+
+
+def test_flatten_config_list_nested():
+ content = [
+ 34,
+ [{'first': '1st', 'second': '2nd'}, {}],
+ [[2, 3], [45, [56, 78], 66]],
+ 'end'
+ ]
+ assert flatten_config_list(content) == \
+ [34, {'first': '1st', 'second': '2nd'}, {},
+ 2, 3, 45, 56, 78, 66, 'end']