2 changed files with 126 additions and 4 deletions
@ -0,0 +1,118 @@ |
|||
#!/usr/bin/env python3 |
|||
# -*- coding: utf-8 -*- |
|||
|
|||
import pytest |
|||
import src.boot as boot |
|||
from unittest.mock import patch |
|||
|
|||
|
|||
@pytest.fixture(autouse=True) |
|||
def init_opts(): |
|||
boot.init_opts() |
|||
yield |
|||
|
|||
|
|||
@patch('src.boot.load_from_config') |
|||
@patch('src.boot.load_from_args') |
|||
@patch('src.boot.load_from_env') |
|||
def test_config_priority(mock_env, mock_arg, mock_cfg) -> None: |
|||
""" |
|||
Test configure file loading priority order. |
|||
""" |
|||
mock_env.return_value = {} |
|||
mock_arg.return_value = {} |
|||
boot.load_opts() |
|||
mock_cfg.assert_called_with('config.yml') # default value |
|||
|
|||
mock_env.return_value = {'config': 'env_config.yml'} |
|||
mock_arg.return_value = {} |
|||
boot.load_opts() |
|||
mock_cfg.assert_called_with('env_config.yml') # select from env |
|||
|
|||
mock_env.return_value = {'config': 'env_config.yml'} |
|||
mock_arg.return_value = {'config': 'arg_config.yml'} |
|||
boot.load_opts() |
|||
mock_cfg.assert_called_with('arg_config.yml') # higher priority than env |
|||
|
|||
|
|||
@patch('src.boot.load_from_config') |
|||
@patch('src.boot.load_from_args') |
|||
@patch('src.boot.load_from_env') |
|||
def test_merge_priority(mock_env, mock_arg, mock_cfg) -> None: |
|||
""" |
|||
Test the merge priority order among env, cli and config options. |
|||
""" |
|||
low_opts = { |
|||
'config': 'LOW', |
|||
'motd': 'LOW', |
|||
'port': 12345, |
|||
'max_username': 12345, |
|||
'persistent': False, |
|||
'enable_tls': True, |
|||
'permanent_rooms': ['LOW_1', 'LOW_2'], |
|||
} |
|||
high_opts = { |
|||
'config': 'HIGH', |
|||
'salt': 'HIGH', |
|||
'port': 23456, |
|||
'max_chat_message': 23456, |
|||
'persistent': True, |
|||
'enable_stats': True, |
|||
'permanent_rooms': ['HIGH_1', 'HIGH_2'], |
|||
} |
|||
expected_opts = { |
|||
'config': 'HIGH', |
|||
'motd': 'LOW', |
|||
'salt': 'HIGH', |
|||
'port': 23456, |
|||
'max_username': 12345, |
|||
'max_chat_message': 23456, |
|||
'persistent': True, |
|||
'enable_tls': True, |
|||
'enable_stats': True, |
|||
'permanent_rooms': ['HIGH_1', 'HIGH_2'], |
|||
} |
|||
|
|||
mock_env.return_value = low_opts |
|||
mock_cfg.return_value = high_opts |
|||
mock_arg.return_value = {} |
|||
assert boot.load_opts() == expected_opts # env < cfg |
|||
|
|||
mock_env.return_value = low_opts |
|||
mock_cfg.return_value = {} |
|||
mock_arg.return_value = high_opts |
|||
assert boot.load_opts() == expected_opts # env < arg |
|||
|
|||
mock_env.return_value = {} |
|||
mock_cfg.return_value = low_opts |
|||
mock_arg.return_value = high_opts |
|||
assert boot.load_opts() == expected_opts # cfg < arg |
|||
|
|||
|
|||
@patch('src.boot.load_from_config') |
|||
@patch('src.boot.load_from_args') |
|||
@patch('src.boot.load_from_env') |
|||
def test_bool_options(mock_env, mock_arg, mock_cfg) -> None: |
|||
""" |
|||
Test bool options handling and non-bool retention. |
|||
""" |
|||
mock_env.return_value = {} |
|||
mock_cfg.return_value = {} |
|||
|
|||
bool_opts = [ |
|||
'random_salt', |
|||
'isolate_rooms', |
|||
'disable_chat', |
|||
'disable_ready', |
|||
'enable_stats', |
|||
'enable_tls', |
|||
'persistent', |
|||
] |
|||
mock_arg.return_value = {x: True for x in bool_opts} |
|||
assert boot.load_opts() == mock_arg.return_value # bool options kept on True |
|||
|
|||
mock_arg.return_value = {x: False for x in bool_opts} |
|||
assert boot.load_opts() == {} # bool options ignored on False |
|||
|
|||
mock_arg.return_value = {'port': 0, 'salt': '', 'permanent_rooms': []} |
|||
assert boot.load_opts() == mock_arg.return_value # non-bool options should be kept |
Loading…
Reference in new issue