diff options
Diffstat (limited to 'test/base/test_events.py')
| -rw-r--r-- | test/base/test_events.py | 126 |
1 files changed, 77 insertions, 49 deletions
diff --git a/test/base/test_events.py b/test/base/test_events.py index a4ed1000b..19f68e9a3 100644 --- a/test/base/test_events.py +++ b/test/base/test_events.py @@ -15,7 +15,19 @@ from sqlalchemy.testing.mock import Mock from sqlalchemy.testing.util import gc_collect -class EventsTest(fixtures.TestBase): +class TearDownLocalEventsFixture(object): + def tearDown(self): + classes = set() + for entry in event.base._registrars.values(): + for evt_cls in entry: + if evt_cls.__module__ == __name__: + classes.add(evt_cls) + + for evt_cls in classes: + event.base._remove_dispatcher(evt_cls) + + +class EventsTest(TearDownLocalEventsFixture, fixtures.TestBase): """Test class- and instance-level event registration.""" def setUp(self): @@ -34,9 +46,6 @@ class EventsTest(fixtures.TestBase): self.Target = Target - def tearDown(self): - event.base._remove_dispatcher(self.Target.__dict__["dispatch"].events) - def test_register_class(self): def listen(x, y): pass @@ -258,7 +267,60 @@ class EventsTest(fixtures.TestBase): ) -class NamedCallTest(fixtures.TestBase): +class SlotsEventsTest(fixtures.TestBase): + @testing.requires.python3 + def test_no_slots_dispatch(self): + class Target(object): + __slots__ = () + + class TargetEvents(event.Events): + _dispatch_target = Target + + def event_one(self, x, y): + pass + + def event_two(self, x): + pass + + def event_three(self, x): + pass + + t1 = Target() + + with testing.expect_raises_message( + TypeError, + r"target .*Target.* doesn't have __dict__, should it " + "be defining _slots_dispatch", + ): + event.listen(t1, "event_one", Mock()) + + def test_slots_dispatch(self): + class Target(object): + __slots__ = ("_slots_dispatch",) + + class TargetEvents(event.Events): + _dispatch_target = Target + + def event_one(self, x, y): + pass + + def event_two(self, x): + pass + + def event_three(self, x): + pass + + t1 = Target() + + m1 = Mock() + event.listen(t1, "event_one", m1) + + t1.dispatch.event_one(2, 4) + + eq_(m1.mock_calls, [call(2, 4)]) + + +class NamedCallTest(TearDownLocalEventsFixture, fixtures.TestBase): def _fixture(self): class TargetEventsOne(event.Events): def event_one(self, x, y): @@ -373,7 +435,7 @@ class NamedCallTest(fixtures.TestBase): eq_(canary.mock_calls, [call({"x": 4, "y": 5, "z": 8, "q": 5})]) -class LegacySignatureTest(fixtures.TestBase): +class LegacySignatureTest(TearDownLocalEventsFixture, fixtures.TestBase): """test adaption of legacy args""" def setUp(self): @@ -397,11 +459,6 @@ class LegacySignatureTest(fixtures.TestBase): self.TargetOne = TargetOne - def tearDown(self): - event.base._remove_dispatcher( - self.TargetOne.__dict__["dispatch"].events - ) - def test_legacy_accept(self): canary = Mock() @@ -550,12 +607,7 @@ class LegacySignatureTest(fixtures.TestBase): ) -class ClsLevelListenTest(fixtures.TestBase): - def tearDown(self): - event.base._remove_dispatcher( - self.TargetOne.__dict__["dispatch"].events - ) - +class ClsLevelListenTest(TearDownLocalEventsFixture, fixtures.TestBase): def setUp(self): class TargetEventsOne(event.Events): def event_one(self, x, y): @@ -622,7 +674,7 @@ class ClsLevelListenTest(fixtures.TestBase): assert handler2 not in s2.dispatch.event_one -class AcceptTargetsTest(fixtures.TestBase): +class AcceptTargetsTest(TearDownLocalEventsFixture, fixtures.TestBase): """Test default target acceptance.""" def setUp(self): @@ -643,14 +695,6 @@ class AcceptTargetsTest(fixtures.TestBase): self.TargetOne = TargetOne self.TargetTwo = TargetTwo - def tearDown(self): - event.base._remove_dispatcher( - self.TargetOne.__dict__["dispatch"].events - ) - event.base._remove_dispatcher( - self.TargetTwo.__dict__["dispatch"].events - ) - def test_target_accept(self): """Test that events of the same name are routed to the correct collection based on the type of target given. @@ -687,7 +731,7 @@ class AcceptTargetsTest(fixtures.TestBase): eq_(list(t2.dispatch.event_one), [listen_two, listen_four]) -class CustomTargetsTest(fixtures.TestBase): +class CustomTargetsTest(TearDownLocalEventsFixture, fixtures.TestBase): """Test custom target acceptance.""" def setUp(self): @@ -707,9 +751,6 @@ class CustomTargetsTest(fixtures.TestBase): self.Target = Target - def tearDown(self): - event.base._remove_dispatcher(self.Target.__dict__["dispatch"].events) - def test_indirect(self): def listen(x, y): pass @@ -727,7 +768,7 @@ class CustomTargetsTest(fixtures.TestBase): ) -class SubclassGrowthTest(fixtures.TestBase): +class SubclassGrowthTest(TearDownLocalEventsFixture, fixtures.TestBase): """test that ad-hoc subclasses are garbage collected.""" def setUp(self): @@ -752,7 +793,7 @@ class SubclassGrowthTest(fixtures.TestBase): eq_(self.Target.__subclasses__(), []) -class ListenOverrideTest(fixtures.TestBase): +class ListenOverrideTest(TearDownLocalEventsFixture, fixtures.TestBase): """Test custom listen functions which change the listener function signature.""" @@ -778,9 +819,6 @@ class ListenOverrideTest(fixtures.TestBase): self.Target = Target - def tearDown(self): - event.base._remove_dispatcher(self.Target.__dict__["dispatch"].events) - def test_listen_override(self): listen_one = Mock() listen_two = Mock() @@ -816,7 +854,7 @@ class ListenOverrideTest(fixtures.TestBase): eq_(listen_one.mock_calls, [call(12)]) -class PropagateTest(fixtures.TestBase): +class PropagateTest(TearDownLocalEventsFixture, fixtures.TestBase): def setUp(self): class TargetEvents(event.Events): def event_one(self, arg): @@ -850,7 +888,7 @@ class PropagateTest(fixtures.TestBase): eq_(listen_two.mock_calls, []) -class JoinTest(fixtures.TestBase): +class JoinTest(TearDownLocalEventsFixture, fixtures.TestBase): def setUp(self): class TargetEvents(event.Events): def event_one(self, target, arg): @@ -875,11 +913,6 @@ class JoinTest(fixtures.TestBase): self.TargetFactory = TargetFactory self.TargetElement = TargetElement - def tearDown(self): - for cls in (self.TargetElement, self.TargetFactory, self.BaseTarget): - if "dispatch" in cls.__dict__: - event.base._remove_dispatcher(cls.__dict__["dispatch"].events) - def test_neither(self): element = self.TargetFactory().create() element.run_event(1) @@ -1075,7 +1108,7 @@ class JoinTest(fixtures.TestBase): ) -class DisableClsPropagateTest(fixtures.TestBase): +class DisableClsPropagateTest(TearDownLocalEventsFixture, fixtures.TestBase): def setUp(self): class TargetEvents(event.Events): def event_one(self, target, arg): @@ -1093,11 +1126,6 @@ class DisableClsPropagateTest(fixtures.TestBase): self.BaseTarget = BaseTarget self.SubTarget = SubTarget - def tearDown(self): - for cls in (self.SubTarget, self.BaseTarget): - if "dispatch" in cls.__dict__: - event.base._remove_dispatcher(cls.__dict__["dispatch"].events) - def test_listen_invoke_clslevel(self): canary = Mock() @@ -1132,7 +1160,7 @@ class DisableClsPropagateTest(fixtures.TestBase): eq_(canary.mock_calls, []) -class RemovalTest(fixtures.TestBase): +class RemovalTest(TearDownLocalEventsFixture, fixtures.TestBase): def _fixture(self): class TargetEvents(event.Events): def event_one(self, x, y): |
