summaryrefslogtreecommitdiff
path: root/tests/m2m_signals
diff options
context:
space:
mode:
authorCarlton Gibson <carlton.gibson@noumenal.es>2019-09-18 15:34:16 +0200
committerCarlton Gibson <carlton@noumenal.es>2019-09-19 11:34:59 +0200
commitbed4a1527b4f1f38c8b4f820de5591a52e62711d (patch)
tree455383dabd166733c62256e9513f56a94655a719 /tests/m2m_signals
parent5cb3ed187b283059589cb442c56a66a795800cac (diff)
downloaddjango-bed4a1527b4f1f38c8b4f820de5591a52e62711d.tar.gz
Refs #27462 -- Added tests of pk_set in m2m_changed signal receivers for repeated add/remove calls.
Diffstat (limited to 'tests/m2m_signals')
-rw-r--r--tests/m2m_signals/tests.py28
1 files changed, 28 insertions, 0 deletions
diff --git a/tests/m2m_signals/tests.py b/tests/m2m_signals/tests.py
index 1e063e8a56..ce1dd30f05 100644
--- a/tests/m2m_signals/tests.py
+++ b/tests/m2m_signals/tests.py
@@ -69,6 +69,34 @@ class ManyToManySignalsTest(TestCase):
self.m2m_changed_signal_receiver, Car.default_parts.through
)
+ def test_pk_set_on_repeated_add_remove(self):
+ """
+ m2m_changed is always fired, even for repeated calls to the same
+ method, but the behavior of pk_sets differs by action.
+
+ - For signals related to `add()`, only PKs that will actually be
+ inserted are sent.
+ - For `remove()` all PKs are sent, even if they will not affect the DB.
+ """
+ pk_sets_sent = []
+
+ def handler(signal, sender, **kwargs):
+ if kwargs['action'] in ['pre_add', 'pre_remove']:
+ pk_sets_sent.append(kwargs['pk_set'])
+
+ models.signals.m2m_changed.connect(handler, Car.default_parts.through)
+
+ self.vw.default_parts.add(self.wheelset)
+ self.vw.default_parts.add(self.wheelset)
+
+ self.vw.default_parts.remove(self.wheelset)
+ self.vw.default_parts.remove(self.wheelset)
+
+ expected_pk_sets = [{1}, set(), {1}, {1}]
+ self.assertEqual(pk_sets_sent, expected_pk_sets)
+
+ models.signals.m2m_changed.disconnect(handler, Car.default_parts.through)
+
def test_m2m_relations_add_remove_clear(self):
expected_messages = []