diff options
author | mgaligniana <marcelogaligniana@gmail.com> | 2021-12-27 23:32:07 -0300 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-01-11 08:06:18 +0100 |
commit | fa235004dd1423b129befe847bbf207808ca07ad (patch) | |
tree | ef9f65f34fbd031007dc2986916ac3927a645698 /tests/signals | |
parent | f1905db6c0004a2b6c8b69c55a1f5f9da58ce2eb (diff) | |
download | django-fa235004dd1423b129befe847bbf207808ca07ad.tar.gz |
Fixed #13251 -- Made pre/post_delete signals dispatch the origin.
Diffstat (limited to 'tests/signals')
-rw-r--r-- | tests/signals/models.py | 5 | ||||
-rw-r--r-- | tests/signals/tests.py | 90 |
2 files changed, 86 insertions, 9 deletions
diff --git a/tests/signals/models.py b/tests/signals/models.py index ca30cdc51f..b758244749 100644 --- a/tests/signals/models.py +++ b/tests/signals/models.py @@ -30,3 +30,8 @@ class Book(models.Model): def __str__(self): return self.name + + +class Page(models.Model): + book = models.ForeignKey(Book, on_delete=models.CASCADE) + text = models.TextField() diff --git a/tests/signals/tests.py b/tests/signals/tests.py index c4c692ea3e..b89b7bd91c 100644 --- a/tests/signals/tests.py +++ b/tests/signals/tests.py @@ -7,7 +7,7 @@ from django.dispatch import receiver from django.test import SimpleTestCase, TestCase from django.test.utils import isolate_apps -from .models import Author, Book, Car, Person +from .models import Author, Book, Car, Page, Person class BaseSignalSetup: @@ -118,9 +118,9 @@ class SignalTests(BaseSignalSetup, TestCase): def test_delete_signals(self): data = [] - def pre_delete_handler(signal, sender, instance, **kwargs): + def pre_delete_handler(signal, sender, instance, origin, **kwargs): data.append( - (instance, sender, instance.id is None) + (instance, sender, instance.id is None, origin) ) # #8285: signals can be any callable @@ -128,9 +128,9 @@ class SignalTests(BaseSignalSetup, TestCase): def __init__(self, data): self.data = data - def __call__(self, signal, sender, instance, **kwargs): + def __call__(self, signal, sender, instance, origin, **kwargs): self.data.append( - (instance, sender, instance.id is None) + (instance, sender, instance.id is None, origin) ) post_delete_handler = PostDeleteHandler(data) @@ -140,8 +140,8 @@ class SignalTests(BaseSignalSetup, TestCase): p1 = Person.objects.create(first_name="John", last_name="Smith") p1.delete() self.assertEqual(data, [ - (p1, Person, False), - (p1, Person, False), + (p1, Person, False, p1), + (p1, Person, False, p1), ]) data[:] = [] @@ -152,8 +152,8 @@ class SignalTests(BaseSignalSetup, TestCase): p2.save() p2.delete() self.assertEqual(data, [ - (p2, Person, False), - (p2, Person, False), + (p2, Person, False, p2), + (p2, Person, False, p2), ]) data[:] = [] @@ -167,6 +167,78 @@ class SignalTests(BaseSignalSetup, TestCase): signals.pre_delete.disconnect(pre_delete_handler) signals.post_delete.disconnect(post_delete_handler) + def test_delete_signals_origin_model(self): + data = [] + + def pre_delete_handler(signal, sender, instance, origin, **kwargs): + data.append((sender, origin)) + + def post_delete_handler(signal, sender, instance, origin, **kwargs): + data.append((sender, origin)) + + person = Person.objects.create(first_name='John', last_name='Smith') + book = Book.objects.create(name='Rayuela') + Page.objects.create(text='Page 1', book=book) + Page.objects.create(text='Page 2', book=book) + + signals.pre_delete.connect(pre_delete_handler, weak=False) + signals.post_delete.connect(post_delete_handler, weak=False) + try: + # Instance deletion. + person.delete() + self.assertEqual(data, [(Person, person), (Person, person)]) + data[:] = [] + # Cascade deletion. + book.delete() + self.assertEqual(data, [ + (Page, book), + (Page, book), + (Book, book), + (Page, book), + (Page, book), + (Book, book), + ]) + finally: + signals.pre_delete.disconnect(pre_delete_handler) + signals.post_delete.disconnect(post_delete_handler) + + def test_delete_signals_origin_queryset(self): + data = [] + + def pre_delete_handler(signal, sender, instance, origin, **kwargs): + data.append((sender, origin)) + + def post_delete_handler(signal, sender, instance, origin, **kwargs): + data.append((sender, origin)) + + Person.objects.create(first_name='John', last_name='Smith') + book = Book.objects.create(name='Rayuela') + Page.objects.create(text='Page 1', book=book) + Page.objects.create(text='Page 2', book=book) + + signals.pre_delete.connect(pre_delete_handler, weak=False) + signals.post_delete.connect(post_delete_handler, weak=False) + try: + # Queryset deletion. + qs = Person.objects.all() + qs.delete() + self.assertEqual(data, [(Person, qs), (Person, qs)]) + data[:] = [] + # Cascade deletion. + qs = Book.objects.all() + qs.delete() + self.assertEqual(data, [ + (Page, qs), + (Page, qs), + (Book, qs), + (Page, qs), + (Page, qs), + (Book, qs), + ]) + finally: + signals.pre_delete.disconnect(pre_delete_handler) + signals.post_delete.disconnect(post_delete_handler) + def test_decorators(self): data = [] |