summaryrefslogtreecommitdiff
path: root/tests/signals
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2013-11-04 23:11:51 -0500
committerSimon Charette <charette.s@gmail.com>2013-11-24 17:51:22 -0500
commiteb38257e5199ca06b8b32f82dd50f64fd6b0d98d (patch)
tree218b5face70be2baaffaabd3e5dac009a227727e /tests/signals
parent03bc0a8ac5b465a9a1ec88dedb0a2f4bd91dd547 (diff)
downloaddjango-eb38257e5199ca06b8b32f82dd50f64fd6b0d98d.tar.gz
Fixed #21391 -- Allow model signals to lazily reference their senders.
Diffstat (limited to 'tests/signals')
-rw-r--r--tests/signals/tests.py51
1 files changed, 49 insertions, 2 deletions
diff --git a/tests/signals/tests.py b/tests/signals/tests.py
index 4be8d9b65d..c5c5b9c5e7 100644
--- a/tests/signals/tests.py
+++ b/tests/signals/tests.py
@@ -1,5 +1,6 @@
from __future__ import unicode_literals
+from django.db import models
from django.db.models import signals
from django.dispatch import receiver
from django.test import TestCase
@@ -8,8 +9,7 @@ from django.utils import six
from .models import Author, Book, Car, Person
-class SignalTests(TestCase):
-
+class BaseSignalTest(TestCase):
def setUp(self):
# Save up the number of connected signals so that we can check at the
# end that all the signals we register get properly unregistered (#9989)
@@ -30,6 +30,8 @@ class SignalTests(TestCase):
)
self.assertEqual(self.pre_signals, post_signals)
+
+class SignalTests(BaseSignalTest):
def test_save_signals(self):
data = []
@@ -239,3 +241,48 @@ class SignalTests(TestCase):
self.assertTrue(a._run)
self.assertTrue(b._run)
self.assertEqual(signals.post_save.receivers, [])
+
+
+class LazyModelRefTest(BaseSignalTest):
+ def setUp(self):
+ super(LazyModelRefTest, self).setUp()
+ self.received = []
+
+ def receiver(self, **kwargs):
+ self.received.append(kwargs)
+
+ def test_invalid_sender_model_name(self):
+ with self.assertRaisesMessage(ValueError,
+ "Specified sender must either be a model or a "
+ "model name of the 'app_label.ModelName' form."):
+ signals.post_init.connect(self.receiver, sender='invalid')
+
+ def test_already_loaded_model(self):
+ signals.post_init.connect(
+ self.receiver, sender='signals.Book', weak=False
+ )
+ try:
+ instance = Book()
+ self.assertEqual(self.received, [{
+ 'signal': signals.post_init,
+ 'sender': Book,
+ 'instance': instance
+ }])
+ finally:
+ signals.post_init.disconnect(self.receiver, sender=Book)
+
+ def test_not_loaded_model(self):
+ signals.post_init.connect(
+ self.receiver, sender='signals.Created', weak=False
+ )
+
+ try:
+ class Created(models.Model):
+ pass
+
+ instance = Created()
+ self.assertEqual(self.received, [{
+ 'signal': signals.post_init, 'sender': Created, 'instance': instance
+ }])
+ finally:
+ signals.post_init.disconnect(self.receiver, sender=Created)