|
1 | 1 | import pytest |
2 | 2 |
|
3 | | -from configmanager import Config, NotFound, Section |
| 3 | +from configmanager import Config, NotFound, Section, Item |
4 | 4 | from configmanager.utils import not_set |
5 | 5 |
|
6 | 6 |
|
@@ -255,6 +255,68 @@ def item_value_changed(old_value=None, new_value=None, item=None, **kwargs): |
255 | 255 | assert calls[-1] == (config.uploads.db.user, 'Administrator', 'NEW VALUE') |
256 | 256 |
|
257 | 257 |
|
| 258 | +def test_item_value_changed_reports_not_set_as_old_value_if_there_was_no_value_before(): |
| 259 | + config = Config({'a': 'aaa'}) |
| 260 | + calls = [] |
| 261 | + |
| 262 | + def first(old_value, new_value): |
| 263 | + assert old_value is not_set |
| 264 | + assert new_value == 'bbb' |
| 265 | + calls.append(1) |
| 266 | + |
| 267 | + def second(old_value, new_value): |
| 268 | + assert old_value == 'bbb' |
| 269 | + assert new_value == 'aaa' |
| 270 | + calls.append(2) |
| 271 | + |
| 272 | + config.hooks.register_hook('item_value_changed', first) |
| 273 | + config.a.value = 'bbb' |
| 274 | + config.hooks.unregister_hook('item_value_changed', first) |
| 275 | + |
| 276 | + config.hooks.register_hook('item_value_changed', second) |
| 277 | + config.a.value = 'aaa' |
| 278 | + config.hooks.unregister_hook('item_value_changed', second) |
| 279 | + |
| 280 | + assert calls == [1, 2] |
| 281 | + |
| 282 | + |
| 283 | +def test_item_value_changed_hook_called_on_item_reset(): |
| 284 | + config = Config({'a': 'aaa', 'b': 'bbb', 'c': Item()}) |
| 285 | + calls = [] |
| 286 | + |
| 287 | + @config.hooks.item_value_changed |
| 288 | + def item_value_changed(item, old_value, new_value): |
| 289 | + calls.append(item.name) |
| 290 | + |
| 291 | + assert len(calls) == 0 |
| 292 | + |
| 293 | + config.reset() |
| 294 | + assert len(calls) == 0 |
| 295 | + |
| 296 | + # Setting same value as default value triggers the event |
| 297 | + config.a.value = 'aaa' |
| 298 | + assert calls == ['a'] |
| 299 | + |
| 300 | + # Setting same value as the custom value before triggers the event |
| 301 | + config.a.value = 'aaa' |
| 302 | + assert calls == ['a', 'a'] |
| 303 | + |
| 304 | + # Actual reset |
| 305 | + config.reset() |
| 306 | + assert calls == ['a', 'a', 'a'] |
| 307 | + |
| 308 | + |
| 309 | +def test_item_value_changed_hook_not_called_when_resetting_a_not_set(): |
| 310 | + config = Config({'a': Item()}) |
| 311 | + |
| 312 | + @config.hooks.item_value_changed |
| 313 | + def item_value_changed(item, old_value, new_value): |
| 314 | + raise AssertionError('This should not have been called') |
| 315 | + |
| 316 | + config.reset() |
| 317 | + config.a.value = not_set |
| 318 | + |
| 319 | + |
258 | 320 | def test_hooks_arent_handled_if_hooks_enabled_setting_is_set_to_falsey_value(): |
259 | 321 | config = Config({ |
260 | 322 | 'uploads': { |
|
0 commit comments