Skip to content

Instantly share code, notes, and snippets.

@raphaelfruneaux
Created April 26, 2021 19:10
Show Gist options
  • Save raphaelfruneaux/58003f897525864dec6bba606dada1d0 to your computer and use it in GitHub Desktop.
Save raphaelfruneaux/58003f897525864dec6bba606dada1d0 to your computer and use it in GitHub Desktop.
Mute signals
import pytest
from django.db.models.signals import (
m2m_changed,
post_delete,
post_save,
pre_delete,
pre_save,
)
@pytest.fixture(autouse=True)
def mute_signals(request):
if "enable_signals" in request.keywords:
return
signals = [pre_save, post_save, pre_delete, post_delete, m2m_changed]
restore = {}
for signal in signals:
restore[signal] = signal.receivers
signal.receivers = []
def restore_signals():
for signal, receivers in restore.items():
signal.receivers = receivers
request.addfinalizer(restore_signals)
import inspect
import sys
from .config import settings
def get_model_classes():
model_classes = {}
for module in settings.INSTALLED_MODELS:
for name, klass in inspect.getmembers(
sys.modules[module], inspect.isclass
):
if issubclass(klass, Model):
model_classes[name] = klass
return model_classes
@pytest.fixture(autouse=True)
def mute_signals(request):
if "enable_signals" in request.keywords:
return
model_classes = get_model_classes()
restore = {}
for _, klass in model_classes.items():
restore[klass] = klass._listeners
klass._listeners = {}
def restore_signals():
for klass, listeners in restore.items():
klass._listeners = listeners
request.addfinalizer(restore_signals)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment