def test_callback_returning_something_cancels_parent_section_hook_handling(): config = Config({'uploads': { 'db': { 'user': '******', } }}) calls = [] @config.hooks.item_added_to_section def root_handler(**kwargs): calls.append('root') @config.uploads.hooks.item_added_to_section def uploads_handler(**kwargs): calls.append('uploads') @config.uploads.db.hooks.item_added_to_section def db_handler(**kwargs): calls.append('db') assert calls == [] config.uploads.db.add_item('password', config.create_item(name='password')) assert calls == ['db', 'uploads', 'root'] @config.uploads.hooks.item_added_to_section def another_uploads_handler(**kwargs): calls.append('uploads2') return True # Root hooks are not handled because uploads2 returned something config.uploads.db.add_item('host', config.create_item(name='host')) assert len(calls) == 6 assert calls[-3:] == ['db', 'uploads', 'uploads2'] # Root hook is handled because the event happens on root level config.add_item('greeting', config.create_item(name='greeting')) assert len(calls) == 7 assert calls[-1:] == ['root']
def test_item_added_to_section_hook(): calls = [] config = Config({'uploads': { 'db': { 'user': '******', } }}) @config.hooks.item_added_to_section def item_added_to_section(*args, **kwargs): calls.append( ('first', args, sub_dict(kwargs, ('section', 'subject', 'alias')))) @config.hooks.item_added_to_section def item_added_to_section2(*args, **kwargs): calls.append( ('second', args, sub_dict(kwargs, ('section', 'subject', 'alias')))) assert calls == [] # Adding a section to a section is unrelated config.add_section('downloads', config.create_section()) assert calls == [] password = config.create_item(name='password') threads = config.create_item(name='threads', default=5) assert calls == [] config.uploads.db.add_item(password.name, password) # Note that the item added to Config is actually a different instance to the one that was passed to add_item. # This is because we do deepcopy in add_item. assert calls == [ ('first', (), { 'section': config.uploads.db, 'subject': config.uploads.db.password, 'alias': 'password' }), ('second', (), { 'section': config.uploads.db, 'subject': config.uploads.db.password, 'alias': 'password' }), ] config.uploads.add_item('threads_alias', threads) assert len(calls) == 4 assert calls[2:] == [ ('first', (), { 'section': config.uploads, 'subject': config.uploads.threads, 'alias': 'threads_alias' }), ('second', (), { 'section': config.uploads, 'subject': config.uploads.threads, 'alias': 'threads_alias' }), ]