summaryrefslogtreecommitdiff
path: root/tests/m2m_signals
diff options
context:
space:
mode:
authorAlain IVARS <alainivars@gmail.com>2015-03-22 10:55:55 +0100
committerBaptiste Mispelon <bmispelon@gmail.com>2015-03-22 13:21:08 +0100
commit82ec05fcc96121d7b23cc07c2c0ad3c0546bac35 (patch)
treef7bdf686771dd542efe9aa8cefa2e3e5886e0843 /tests/m2m_signals
parent02a2943e4cf95dea0294e8695cfe981f34ae6180 (diff)
downloaddjango-82ec05fcc96121d7b23cc07c2c0ad3c0546bac35.tar.gz
Refs #18586 -- Split up tests/m2m_signals
Diffstat (limited to 'tests/m2m_signals')
-rw-r--r--tests/m2m_signals/tests.py302
1 files changed, 168 insertions, 134 deletions
diff --git a/tests/m2m_signals/tests.py b/tests/m2m_signals/tests.py
index 514dec78c9..da4120e609 100644
--- a/tests/m2m_signals/tests.py
+++ b/tests/m2m_signals/tests.py
@@ -28,6 +28,7 @@ class ManyToManySignalsTest(TestCase):
self.vw = Car.objects.create(name='VW')
self.bmw = Car.objects.create(name='BMW')
self.toyota = Car.objects.create(name='Toyota')
+
self.wheelset = Part.objects.create(name='Wheelset')
self.doors = Part.objects.create(name='Doors')
self.engine = Part.objects.create(name='Engine')
@@ -54,25 +55,23 @@ class ManyToManySignalsTest(TestCase):
self.m2m_changed_signal_receiver, Person.friends.through
)
- def test_m2m_relations_add_remove_clear(self):
- expected_messages = []
-
- # Install a listener on one of the two m2m relations.
+ def _initialize_signal_car(self, add_default_parts_before_set_signal=False):
+ """ Install a listener on the two m2m relations. """
models.signals.m2m_changed.connect(
self.m2m_changed_signal_receiver, Car.optional_parts.through
)
-
- # Test the add, remove and clear methods on both sides of the
- # many-to-many relation
-
- # adding a default part to our car - no signal listener installed
- self.vw.default_parts.add(self.sunroof)
-
- # Now install a listener
+ if add_default_parts_before_set_signal:
+ # adding a default part to our car - no signal listener installed
+ self.vw.default_parts.add(self.sunroof)
models.signals.m2m_changed.connect(
self.m2m_changed_signal_receiver, Car.default_parts.through
)
+ def test_m2m_relations_add_remove_clear(self):
+ expected_messages = []
+
+ self._initialize_signal_car(add_default_parts_before_set_signal=True)
+
self.vw.default_parts.add(self.wheelset, self.doors, self.engine)
expected_messages.append({
'instance': self.vw,
@@ -108,24 +107,31 @@ class ManyToManySignalsTest(TestCase):
})
self.assertEqual(self.m2m_changed_messages, expected_messages)
+ def test_m2m_relations_signals_remove_relation(self):
+ self._initialize_signal_car()
# remove the engine from the self.vw and the airbag (which is not set
# but is returned)
self.vw.default_parts.remove(self.engine, self.airbag)
- expected_messages.append({
- 'instance': self.vw,
- 'action': 'pre_remove',
- 'reverse': False,
- 'model': Part,
- 'objects': [self.airbag, self.engine],
- })
- expected_messages.append({
- 'instance': self.vw,
- 'action': 'post_remove',
- 'reverse': False,
- 'model': Part,
- 'objects': [self.airbag, self.engine],
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.vw,
+ 'action': 'pre_remove',
+ 'reverse': False,
+ 'model': Part,
+ 'objects': [self.airbag, self.engine],
+ }, {
+ 'instance': self.vw,
+ 'action': 'post_remove',
+ 'reverse': False,
+ 'model': Part,
+ 'objects': [self.airbag, self.engine],
+ }
+ ])
+
+ def test_m2m_relations_signals_give_the_self_vw_some_optional_parts(self):
+ expected_messages = []
+
+ self._initialize_signal_car()
# give the self.vw some optional parts (second relation to same model)
self.vw.optional_parts.add(self.airbag, self.sunroof)
@@ -163,73 +169,86 @@ class ManyToManySignalsTest(TestCase):
})
self.assertEqual(self.m2m_changed_messages, expected_messages)
+ def test_m2m_relations_signals_reverse_relation_with_custom_related_name(self):
+ self._initialize_signal_car()
# remove airbag from the self.vw (reverse relation with custom
# related_name)
self.airbag.cars_optional.remove(self.vw)
- expected_messages.append({
- 'instance': self.airbag,
- 'action': 'pre_remove',
- 'reverse': True,
- 'model': Car,
- 'objects': [self.vw],
- })
- expected_messages.append({
- 'instance': self.airbag,
- 'action': 'post_remove',
- 'reverse': True,
- 'model': Car,
- 'objects': [self.vw],
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
-
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.airbag,
+ 'action': 'pre_remove',
+ 'reverse': True,
+ 'model': Car,
+ 'objects': [self.vw],
+ }, {
+ 'instance': self.airbag,
+ 'action': 'post_remove',
+ 'reverse': True,
+ 'model': Car,
+ 'objects': [self.vw],
+ }
+ ])
+
+ def test_m2m_relations_signals_clear_all_parts_of_the_self_vw(self):
+ self._initialize_signal_car()
# clear all parts of the self.vw
self.vw.default_parts.clear()
- expected_messages.append({
- 'instance': self.vw,
- 'action': 'pre_clear',
- 'reverse': False,
- 'model': Part,
- })
- expected_messages.append({
- 'instance': self.vw,
- 'action': 'post_clear',
- 'reverse': False,
- 'model': Part,
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
-
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.vw,
+ 'action': 'pre_clear',
+ 'reverse': False,
+ 'model': Part,
+ }, {
+ 'instance': self.vw,
+ 'action': 'post_clear',
+ 'reverse': False,
+ 'model': Part,
+ }
+ ])
+
+ def test_m2m_relations_signals_all_the_doors_off_of_cars(self):
+ self._initialize_signal_car()
# take all the doors off of cars
self.doors.car_set.clear()
- expected_messages.append({
- 'instance': self.doors,
- 'action': 'pre_clear',
- 'reverse': True,
- 'model': Car,
- })
- expected_messages.append({
- 'instance': self.doors,
- 'action': 'post_clear',
- 'reverse': True,
- 'model': Car,
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
-
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.doors,
+ 'action': 'pre_clear',
+ 'reverse': True,
+ 'model': Car,
+ }, {
+ 'instance': self.doors,
+ 'action': 'post_clear',
+ 'reverse': True,
+ 'model': Car,
+ }
+ ])
+
+ def test_m2m_relations_signals_reverse_relation(self):
+ self._initialize_signal_car()
# take all the airbags off of cars (clear reverse relation with custom
# related_name)
self.airbag.cars_optional.clear()
- expected_messages.append({
- 'instance': self.airbag,
- 'action': 'pre_clear',
- 'reverse': True,
- 'model': Car,
- })
- expected_messages.append({
- 'instance': self.airbag,
- 'action': 'post_clear',
- 'reverse': True,
- 'model': Car,
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.airbag,
+ 'action': 'pre_clear',
+ 'reverse': True,
+ 'model': Car,
+ }, {
+ 'instance': self.airbag,
+ 'action': 'post_clear',
+ 'reverse': True,
+ 'model': Car,
+ }
+ ])
+
+ def test_m2m_relations_signals_alternative_ways(self):
+ expected_messages = []
+
+ self._initialize_signal_car()
# alternative ways of setting relation:
self.vw.default_parts.create(name='Windows')
@@ -282,6 +301,11 @@ class ManyToManySignalsTest(TestCase):
})
self.assertEqual(self.m2m_changed_messages, expected_messages)
+ def test_m2m_relations_signals_clearing_removing(self):
+ expected_messages = []
+
+ self._initialize_signal_car(add_default_parts_before_set_signal=True)
+
# set by clearing.
self.vw.default_parts.set([self.wheelset, self.doors, self.engine], clear=True)
expected_messages.append({
@@ -330,6 +354,11 @@ class ManyToManySignalsTest(TestCase):
})
self.assertEqual(self.m2m_changed_messages, expected_messages)
+ def test_m2m_relations_signals_when_inheritance(self):
+ expected_messages = []
+
+ self._initialize_signal_car(add_default_parts_before_set_signal=True)
+
# Check that signals still work when model inheritance is involved
c4 = SportsCar.objects.create(name='Bugatti', price='1000000')
c4b = Car.objects.get(name='Bugatti')
@@ -367,9 +396,8 @@ class ManyToManySignalsTest(TestCase):
})
self.assertEqual(self.m2m_changed_messages, expected_messages)
- def test_m2m_relations_with_self(self):
- expected_messages = []
-
+ def _initialize_signal_person(self):
+ # Install a listener on the two m2m relations.
models.signals.m2m_changed.connect(
self.m2m_changed_signal_receiver, Person.fans.through
)
@@ -377,53 +405,59 @@ class ManyToManySignalsTest(TestCase):
self.m2m_changed_signal_receiver, Person.friends.through
)
+ def test_m2m_relations_with_self_add_friends(self):
+ self._initialize_signal_person()
self.alice.friends = [self.bob, self.chuck]
- expected_messages.append({
- 'instance': self.alice,
- 'action': 'pre_add',
- 'reverse': False,
- 'model': Person,
- 'objects': [self.bob, self.chuck],
- })
- expected_messages.append({
- 'instance': self.alice,
- 'action': 'post_add',
- 'reverse': False,
- 'model': Person,
- 'objects': [self.bob, self.chuck],
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
-
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.alice,
+ 'action': 'pre_add',
+ 'reverse': False,
+ 'model': Person,
+ 'objects': [self.bob, self.chuck],
+ }, {
+ 'instance': self.alice,
+ 'action': 'post_add',
+ 'reverse': False,
+ 'model': Person,
+ 'objects': [self.bob, self.chuck],
+ }
+ ])
+
+ def test_m2m_relations_with_self_add_fan(self):
+ self._initialize_signal_person()
self.alice.fans = [self.daisy]
- expected_messages.append({
- 'instance': self.alice,
- 'action': 'pre_add',
- 'reverse': False,
- 'model': Person,
- 'objects': [self.daisy],
- })
- expected_messages.append({
- 'instance': self.alice,
- 'action': 'post_add',
- 'reverse': False,
- 'model': Person,
- 'objects': [self.daisy],
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
-
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.alice,
+ 'action': 'pre_add',
+ 'reverse': False,
+ 'model': Person,
+ 'objects': [self.daisy],
+ }, {
+ 'instance': self.alice,
+ 'action': 'post_add',
+ 'reverse': False,
+ 'model': Person,
+ 'objects': [self.daisy],
+ }
+ ])
+
+ def test_m2m_relations_with_self_add_idols(self):
+ self._initialize_signal_person()
self.chuck.idols = [self.alice, self.bob]
- expected_messages.append({
- 'instance': self.chuck,
- 'action': 'pre_add',
- 'reverse': True,
- 'model': Person,
- 'objects': [self.alice, self.bob],
- })
- expected_messages.append({
- 'instance': self.chuck,
- 'action': 'post_add',
- 'reverse': True,
- 'model': Person,
- 'objects': [self.alice, self.bob],
- })
- self.assertEqual(self.m2m_changed_messages, expected_messages)
+ self.assertEqual(self.m2m_changed_messages, [
+ {
+ 'instance': self.chuck,
+ 'action': 'pre_add',
+ 'reverse': True,
+ 'model': Person,
+ 'objects': [self.alice, self.bob],
+ }, {
+ 'instance': self.chuck,
+ 'action': 'post_add',
+ 'reverse': True,
+ 'model': Person,
+ 'objects': [self.alice, self.bob],
+ }
+ ])