def mockSignal(self, signal: Signal) -> typing.Iterator[mock.Mock]: # pylint: disable=invalid-name """Context manager to attach a mock to the given signal.""" # This function is only here to create an autospec. From the documentation: # # Notice that the function takes a sender argument, along with wildcard keyword arguments # (**kwargs); all signal handlers must take these arguments. # # https://docs.djangoproject.com/en/dev/topics/signals/#connecting-to-specific-signals def callback(sender: models.Model, **kwargs: typing.Any) -> None: # pragma: no cover # pylint: disable=unused-argument pass signal_mock = mock.create_autospec(callback, spec_set=True) signal.connect(signal_mock) try: yield signal_mock finally: signal.disconnect(signal_mock)
def test_email_not_sent_when_watcher_removed(self, notifications): dispatch_uid = "publicweb.models.decision_signal_handler" Signal.disconnect(signals.post_save, sender=Decision, dispatch_uid=dispatch_uid) decision = self.create_and_return_decision() data = { 'description': decision.description, 'status': decision.status, 'deadline': decision.deadline, 'people': decision.people, 'watch': True } form = DecisionForm(data, instance=decision) form.watch = False form.is_valid() form.save() Signal.connect( signals.post_save, sender=Decision, receiver=decision_signal_handler, dispatch_uid=dispatch_uid ) self.assertFalse(notifications.called)