Skip to content

Commit

Permalink
Fixed mute_signals restoring signals receiver order.
Browse files Browse the repository at this point in the history
  • Loading branch information
sarahboyce committed Sep 19, 2023
1 parent 63c2df4 commit 0af7254
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
2 changes: 1 addition & 1 deletion factory/django.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ def __exit__(self, exc_type, exc_value, traceback):
logger.debug('mute_signals: Restoring signal handlers %r',
receivers)

signal.receivers += receivers
signal.receivers = receivers + signal.receivers
with signal.lock:
# Django uses some caching for its signals.
# Since we're bypassing signal.connect and signal.disconnect,
Expand Down
16 changes: 16 additions & 0 deletions tests/test_django.py
Original file line number Diff line number Diff line change
Expand Up @@ -941,6 +941,22 @@ def test_receiver_created_during_model_instantiation_is_not_lost(self):

self.assertTrue(self.handlers.created_during_instantiation.called)

def test_signal_receiver_order_restored_after_mute_signals(self):
def must_be_first(*args, **kwargs):
self.handlers.do_stuff(1)

def must_be_second(*args, **kwargs):
self.handlers.do_stuff(2)

signals.post_save.connect(must_be_first)
with factory.django.mute_signals(signals.post_save):
WithSignalsFactory(post_save_signal_receiver=must_be_second)
self.handlers.do_stuff.assert_has_calls([mock.call(2)])

self.handlers.reset_mock()
WithSignalsFactory(post_save_signal_receiver=must_be_second)
self.handlers.do_stuff.assert_has_calls([mock.call(1), mock.call(2)])

def test_signal_cache(self):
with factory.django.mute_signals(signals.pre_save, signals.post_save):
signals.post_save.connect(self.handlers.mute_block_receiver)
Expand Down

0 comments on commit 0af7254

Please sign in to comment.