diff options
author | Simon Charette <charette.s@gmail.com> | 2013-11-04 23:11:51 -0500 |
---|---|---|
committer | Simon Charette <charette.s@gmail.com> | 2013-11-24 17:51:22 -0500 |
commit | eb38257e5199ca06b8b32f82dd50f64fd6b0d98d (patch) | |
tree | 218b5face70be2baaffaabd3e5dac009a227727e /tests/signals | |
parent | 03bc0a8ac5b465a9a1ec88dedb0a2f4bd91dd547 (diff) | |
download | django-eb38257e5199ca06b8b32f82dd50f64fd6b0d98d.tar.gz |
Fixed #21391 -- Allow model signals to lazily reference their senders.
Diffstat (limited to 'tests/signals')
-rw-r--r-- | tests/signals/tests.py | 51 |
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) |