def test_act_must_abort_hooks_after_exception(self): # ie. after a hook raises an exception, subsequent hooks must NOT be run # Create three plugins, and setup hook methods on it plugin1 = _make_mock_plugin("plugin1"); setattr(plugin1, "on_"+self.my_event.name, Mock()) plugin2 = _make_mock_plugin("plugin2"); setattr(plugin2, "on_"+self.my_event.name, Mock()) plugin3 = _make_mock_plugin("plugin3"); setattr(plugin3, "on_"+self.my_event.name, Mock()) # Create a parent mock and attach child mocks to help assert order of the calls # https://stackoverflow.com/questions/32463321/how-to-assert-method-call-order-with-python-mock parent_mock = Mock() parent_mock.attach_mock(plugin1.on_my_event, "plugin1_hook") parent_mock.attach_mock(plugin2.on_my_event, "plugin2_hook") parent_mock.attach_mock(plugin3.on_my_event, "plugin3_hook") self.sam_plugins.register(plugin1) self.sam_plugins.register(plugin2) self.sam_plugins.register(plugin3) # setup plugin2 to raise exception plugin2.on_my_event.side_effect = IOError # Call the act method with self.assertRaises(IOError): self.sam_plugins.act(self.my_event) # Since Plugin2 raised the exception, plugin3's hook must NEVER be called parent_mock.assert_has_calls([call.plugin1_hook(), call.plugin2_hook()])
def test_act_must_abort_hooks_after_exception(self): # ie. after a hook raises an exception, subsequent hooks must NOT be run # Create three plugins, and setup hook methods on it plugin1 = _make_mock_plugin("plugin1") setattr(plugin1, "on_" + self.my_event.name, Mock()) plugin2 = _make_mock_plugin("plugin2") setattr(plugin2, "on_" + self.my_event.name, Mock()) plugin3 = _make_mock_plugin("plugin3") setattr(plugin3, "on_" + self.my_event.name, Mock()) # Create a parent mock and attach child mocks to help assert order of the calls # https://stackoverflow.com/questions/32463321/how-to-assert-method-call-order-with-python-mock parent_mock = Mock() parent_mock.attach_mock(plugin1.on_my_event, "plugin1_hook") parent_mock.attach_mock(plugin2.on_my_event, "plugin2_hook") parent_mock.attach_mock(plugin3.on_my_event, "plugin3_hook") self.sam_plugins.register(plugin1) self.sam_plugins.register(plugin2) self.sam_plugins.register(plugin3) # setup plugin2 to raise exception plugin2.on_my_event.side_effect = IOError # Call the act method with self.assertRaises(IOError): self.sam_plugins.act(self.my_event) # Since Plugin2 raised the exception, plugin3's hook must NEVER be called parent_mock.assert_has_calls( [call.plugin1_hook(), call.plugin2_hook()])
def test_act_must_invoke_plugins_in_sequence(self): # Create three plugins, and setup hook methods on it plugin1 = _make_mock_plugin("plugin1") setattr(plugin1, "on_" + self.my_event.name, Mock()) plugin2 = _make_mock_plugin("plugin2") setattr(plugin2, "on_" + self.my_event.name, Mock()) plugin3 = _make_mock_plugin("plugin3") setattr(plugin3, "on_" + self.my_event.name, Mock()) # Create a parent mock and attach child mocks to help assert order of the calls # https://stackoverflow.com/questions/32463321/how-to-assert-method-call-order-with-python-mock parent_mock = Mock() parent_mock.attach_mock(plugin1.on_my_event, "plugin1_hook") parent_mock.attach_mock(plugin2.on_my_event, "plugin2_hook") parent_mock.attach_mock(plugin3.on_my_event, "plugin3_hook") self.sam_plugins.register(plugin1) self.sam_plugins.register(plugin2) self.sam_plugins.register(plugin3) # Call the act method self.sam_plugins.act(self.my_event) # Verify calls were made in the specific sequence parent_mock.assert_has_calls( [call.plugin1_hook(), call.plugin2_hook(), call.plugin3_hook()])
def test_act_must_invoke_plugins_in_sequence(self): # Create three plugins, and setup hook methods on it plugin1 = _make_mock_plugin("plugin1"); setattr(plugin1, "on_"+self.my_event.name, Mock()) plugin2 = _make_mock_plugin("plugin2"); setattr(plugin2, "on_"+self.my_event.name, Mock()) plugin3 = _make_mock_plugin("plugin3"); setattr(plugin3, "on_"+self.my_event.name, Mock()) # Create a parent mock and attach child mocks to help assert order of the calls # https://stackoverflow.com/questions/32463321/how-to-assert-method-call-order-with-python-mock parent_mock = Mock() parent_mock.attach_mock(plugin1.on_my_event, "plugin1_hook") parent_mock.attach_mock(plugin2.on_my_event, "plugin2_hook") parent_mock.attach_mock(plugin3.on_my_event, "plugin3_hook") self.sam_plugins.register(plugin1) self.sam_plugins.register(plugin2) self.sam_plugins.register(plugin3) # Call the act method self.sam_plugins.act(self.my_event) # Verify calls were made in the specific sequence parent_mock.assert_has_calls([call.plugin1_hook(), call.plugin2_hook(), call.plugin3_hook()])