summaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-09-18 15:24:40 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-09-18 15:24:40 -0400
commit9ae4db27b993fbd4666907cd11c2de3a41aee02f (patch)
treef31b5e80f0c17ec53cbf755e6e56e57721f153d6 /test/base
parentf82f6d55dc05daf2ba0881ded98f5715b70ae3e3 (diff)
downloadsqlalchemy-9ae4db27b993fbd4666907cd11c2de3a41aee02f.tar.gz
- Fixed bug that affected many classes of event, particularly
ORM events but also engine events, where the usual logic of "de duplicating" a redundant call to :func:`.event.listen` with the same arguments would fail, for those events where the listener function is wrapped. An assertion would be hit within registry.py. This assertion has now been integrated into the deduplication check, with the added bonus of a simpler means of checking deduplication across the board. fixes #3199
Diffstat (limited to 'test/base')
-rw-r--r--test/base/test_events.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/test/base/test_events.py b/test/base/test_events.py
index 30b728cd3..913e1d3f5 100644
--- a/test/base/test_events.py
+++ b/test/base/test_events.py
@@ -996,6 +996,25 @@ class RemovalTest(fixtures.TestBase):
dispatch = event.dispatcher(TargetEvents)
return Target
+ def _wrapped_fixture(self):
+ class TargetEvents(event.Events):
+ @classmethod
+ def _listen(cls, event_key):
+ fn = event_key.fn
+
+ def adapt(value):
+ fn("adapted " + value)
+ event_key = event_key.with_wrapper(adapt)
+
+ event_key.base_listen()
+
+ def event_one(self, value):
+ pass
+
+ class Target(object):
+ dispatch = event.dispatcher(TargetEvents)
+ return Target
+
def test_clslevel(self):
Target = self._fixture()
@@ -1194,3 +1213,43 @@ class RemovalTest(fixtures.TestBase):
"deque mutated during iteration",
t1.dispatch.event_one
)
+
+ def test_double_event_nonwrapped(self):
+ Target = self._fixture()
+
+ listen_one = Mock()
+ t1 = Target()
+ event.listen(t1, "event_one", listen_one)
+ event.listen(t1, "event_one", listen_one)
+
+ t1.dispatch.event_one("t1")
+
+ # doubles are eliminated
+ eq_(listen_one.mock_calls, [call("t1")])
+
+ # only one remove needed
+ event.remove(t1, "event_one", listen_one)
+ t1.dispatch.event_one("t2")
+
+ eq_(listen_one.mock_calls, [call("t1")])
+
+ def test_double_event_wrapped(self):
+ # this is issue #3199
+ Target = self._wrapped_fixture()
+
+ listen_one = Mock()
+ t1 = Target()
+
+ event.listen(t1, "event_one", listen_one)
+ event.listen(t1, "event_one", listen_one)
+
+ t1.dispatch.event_one("t1")
+
+ # doubles are eliminated
+ eq_(listen_one.mock_calls, [call("adapted t1")])
+
+ # only one remove needed
+ event.remove(t1, "event_one", listen_one)
+ t1.dispatch.event_one("t2")
+
+ eq_(listen_one.mock_calls, [call("adapted t1")])