123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- import sys
- import pytest
- from flexmock import flexmock
- from borgmatic.hooks import dispatch as module
- def hook_function(hook_config, config, thing, value):
- '''
- This test function gets mocked out below.
- '''
- pass
- def test_call_hook_invokes_module_function_with_arguments_and_returns_value():
- config = {'super_hook': flexmock(), 'other_hook': flexmock()}
- expected_return_value = flexmock()
- test_module = sys.modules[__name__]
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'third_hook'])
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.super_hook'
- ).and_return(test_module)
- flexmock(test_module).should_receive('hook_function').with_args(
- config['super_hook'], config, 55, value=66
- ).and_return(expected_return_value).once()
- return_value = module.call_hook('hook_function', config, 'super_hook', 55, value=66)
- assert return_value == expected_return_value
- def test_call_hook_probes_config_with_databases_suffix():
- config = {'super_hook_databases': flexmock(), 'other_hook': flexmock()}
- expected_return_value = flexmock()
- test_module = sys.modules[__name__]
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'third_hook'])
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.super_hook'
- ).and_return(test_module)
- flexmock(test_module).should_receive('hook_function').with_args(
- config['super_hook_databases'], config, 55, value=66
- ).and_return(expected_return_value).once()
- return_value = module.call_hook('hook_function', config, 'super_hook', 55, value=66)
- assert return_value == expected_return_value
- def test_call_hook_strips_databases_suffix_from_hook_name():
- config = {'super_hook_databases': flexmock(), 'other_hook_databases': flexmock()}
- expected_return_value = flexmock()
- test_module = sys.modules[__name__]
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'third_hook'])
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.super_hook'
- ).and_return(test_module)
- flexmock(test_module).should_receive('hook_function').with_args(
- config['super_hook_databases'], config, 55, value=66
- ).and_return(expected_return_value).once()
- return_value = module.call_hook('hook_function', config, 'super_hook_databases', 55, value=66)
- assert return_value == expected_return_value
- def test_call_hook_without_hook_config_invokes_module_function_with_arguments_and_returns_value():
- config = {'other_hook': flexmock()}
- expected_return_value = flexmock()
- test_module = sys.modules[__name__]
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'third_hook'])
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.super_hook'
- ).and_return(test_module)
- flexmock(test_module).should_receive('hook_function').with_args(
- None, config, 55, value=66
- ).and_return(expected_return_value).once()
- return_value = module.call_hook('hook_function', config, 'super_hook', 55, value=66)
- assert return_value == expected_return_value
- def test_call_hook_without_corresponding_module_raises():
- config = {'super_hook': flexmock(), 'other_hook': flexmock()}
- test_module = sys.modules[__name__]
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['some_hook'])
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.super_hook'
- ).and_return(test_module)
- flexmock(test_module).should_receive('hook_function').never()
- with pytest.raises(ValueError):
- module.call_hook('hook_function', config, 'super_hook', 55, value=66)
- def test_call_hook_skips_non_hook_modules():
- config = {'not_a_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.credential
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.data_source
- ).and_return(['other_hook'])
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['not_a_hook', 'third_hook'])
- not_a_hook_module = flexmock(IS_A_HOOK=False)
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring.not_a_hook'
- ).and_return(not_a_hook_module)
- return_value = module.call_hook('hook_function', config, 'not_a_hook', 55, value=66)
- assert return_value is None
- def test_call_hooks_calls_each_hook_and_collects_return_values():
- config = {'super_hook': flexmock(), 'other_hook': flexmock()}
- expected_return_values = {'super_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(
- expected_return_values['super_hook']
- ).and_return(expected_return_values['other_hook'])
- return_values = module.call_hooks('do_stuff', config, module.Hook_type.MONITORING, 55)
- assert return_values == expected_return_values
- def test_call_hooks_calls_skips_return_values_for_unconfigured_hooks():
- config = {'super_hook': flexmock()}
- expected_return_values = {'super_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(expected_return_values['super_hook'])
- return_values = module.call_hooks('do_stuff', config, module.Hook_type.MONITORING, 55)
- assert return_values == expected_return_values
- def test_call_hooks_calls_treats_null_hook_as_optionless():
- config = {'super_hook': flexmock(), 'other_hook': None}
- expected_return_values = {'super_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(
- expected_return_values['super_hook']
- ).and_return(expected_return_values['other_hook'])
- return_values = module.call_hooks('do_stuff', config, module.Hook_type.MONITORING, 55)
- assert return_values == expected_return_values
- def test_call_hooks_calls_looks_up_databases_suffix_in_config():
- config = {'super_hook_databases': flexmock(), 'other_hook': flexmock()}
- expected_return_values = {'super_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(
- expected_return_values['super_hook']
- ).and_return(expected_return_values['other_hook'])
- return_values = module.call_hooks('do_stuff', config, module.Hook_type.MONITORING, 55)
- assert return_values == expected_return_values
- def test_call_hooks_even_if_unconfigured_calls_each_hook_and_collects_return_values():
- config = {'super_hook': flexmock(), 'other_hook': flexmock()}
- expected_return_values = {'super_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(
- expected_return_values['super_hook']
- ).and_return(expected_return_values['other_hook'])
- return_values = module.call_hooks_even_if_unconfigured(
- 'do_stuff', config, module.Hook_type.MONITORING, 55
- )
- assert return_values == expected_return_values
- def test_call_hooks_even_if_unconfigured_calls_each_hook_configured_or_not_and_collects_return_values():
- config = {'other_hook': flexmock()}
- expected_return_values = {'super_hook': flexmock(), 'other_hook': flexmock()}
- flexmock(module.importlib).should_receive('import_module').with_args(
- 'borgmatic.hooks.monitoring'
- ).and_return(module.borgmatic.hooks.monitoring)
- flexmock(module).should_receive('get_submodule_names').with_args(
- module.borgmatic.hooks.monitoring
- ).and_return(['super_hook', 'other_hook'])
- flexmock(module).should_receive('call_hook').and_return(
- expected_return_values['super_hook']
- ).and_return(expected_return_values['other_hook'])
- return_values = module.call_hooks_even_if_unconfigured(
- 'do_stuff', config, module.Hook_type.MONITORING, 55
- )
- assert return_values == expected_return_values
|