Skip to content

Commit 2141e7d

Browse files
committed
Fix a bug when settings were reset to default after an unsuccessful refresh
1 parent 4ec4039 commit 2141e7d

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

src/runtime_config/runtime_config.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def _check_inst_initialization(inst: RuntimeConfig, exception: Exception) -> Non
8383
if not inst._initialized and inst._require_complete_init:
8484
raise exception
8585

86-
extracted_settings = []
86+
extracted_settings = None
8787
try:
8888
extracted_settings = await self._source.get_settings()
8989
except ValidationError as exc:
@@ -93,11 +93,12 @@ def _check_inst_initialization(inst: RuntimeConfig, exception: Exception) -> Non
9393
logger.error('Fetching new settings from a remote source failed', exc_info=True)
9494
_check_inst_initialization(self, exc)
9595

96-
try:
97-
self._settings = await self._settings_merger.merge(extracted_settings=extracted_settings)
98-
except Exception as exc:
99-
logger.error('Merge settings error', exc_info=True)
100-
_check_inst_initialization(self, exc)
96+
if extracted_settings is not None:
97+
try:
98+
self._settings = await self._settings_merger.merge(extracted_settings=extracted_settings)
99+
except Exception as exc:
100+
logger.error('Merge settings error', exc_info=True)
101+
_check_inst_initialization(self, exc)
101102

102103
def get(self, setting_name: str, default: t.Any = None) -> t.Any:
103104
return self._settings.get(setting_name, default)

tests/test_runtime_config.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import os
23

34
import aiohttp
@@ -202,6 +203,28 @@ async def test_refresh__insert_new_settings_in_inner_dict__success(self, mocker:
202203
# assert
203204
assert inst._settings == expected_settings
204205

206+
async def test_refresh__remote_source_not_available__save_previous_setting(
207+
self, mocker: MockerFixture, init_settings, source_mock
208+
):
209+
# arrange
210+
mocker.patch.dict(_instance, clear=True)
211+
212+
source_mock.get_settings.return_value = [
213+
Setting(name='some_var', value=1, value_type=SettingValueType.int, disable=False)
214+
]
215+
inst = await RuntimeConfig.create(init_settings=init_settings, source=source_mock)
216+
setting_after_init = copy.deepcopy(inst._settings)
217+
218+
source_mock.get_settings.side_effect = Exception
219+
expected_settings = {'some_var': 1, **init_settings}
220+
221+
# act
222+
await inst.refresh()
223+
224+
# assert
225+
assert setting_after_init == expected_settings
226+
assert inst._settings == expected_settings
227+
205228
@pytest.mark.parametrize('exception', [ValidationError, Exception])
206229
async def test_refresh__failed_to_get_settings_from_server__config_is_initialized_with_default_settings(
207230
self, mocker: MockerFixture, init_settings, source_mock, exception

0 commit comments

Comments
 (0)