Skip to content

Commit d971fb5

Browse files
committed
Cleanup all test connections
1 parent 64e7445 commit d971fb5

4 files changed

Lines changed: 71 additions & 62 deletions

File tree

sqlalchemy_mptt/tests/__init__.py

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,33 @@
3131
3232
"""
3333
# standard library
34-
import os
34+
import contextlib
3535
import json
36+
import os
3637
import sys
38+
import typing
3739
import unittest
3840

3941
# SQLAlchemy
4042
import sqlalchemy as sa
41-
from sqlalchemy import event, create_engine
43+
from sqlalchemy import create_engine, event
4244
from sqlalchemy.orm import sessionmaker
4345

44-
# third-party
4546
from sqlalchemy_mptt import mptt_sessionmaker
47+
from sqlalchemy_mptt.sqlalchemy_compat import compat_layer
4648

47-
# local
48-
from .cases.get_tree import Tree
49-
from .cases.get_node import GetNodes
5049
from .cases.edit_node import Changes
50+
from .cases.get_node import GetNodes
51+
from .cases.get_tree import Tree
52+
from .cases.initialize import Initialize
5153
from .cases.integrity import DataIntegrity
5254
from .cases.move_node import MoveAfter, MoveBefore, MoveInside
53-
from .cases.initialize import Initialize
55+
56+
if typing.TYPE_CHECKING:
57+
BaseType = unittest.TestCase
58+
else:
59+
BaseType = object
60+
DeclarativeBase = compat_layer.declarative_base()
5461

5562

5663
def failures_expected_on(*, sqlalchemy_versions=[], python_versions=[]):
@@ -73,6 +80,24 @@ def decorator(test_method):
7380
return decorator
7481

7582

83+
class DatabaseSetupMixin(BaseType):
84+
base: DeclarativeBase # type: ignore
85+
86+
def setUp(self):
87+
with contextlib.suppress(AttributeError):
88+
super().setUp()
89+
self.engine: sa.engine.Engine = create_engine("sqlite:///:memory:")
90+
Session = mptt_sessionmaker(sessionmaker(bind=self.engine))
91+
self.session = Session()
92+
self.base.metadata.create_all(self.engine)
93+
94+
def tearDown(self):
95+
with contextlib.suppress(AttributeError):
96+
super().tearDown()
97+
self.session.close()
98+
self.engine.dispose()
99+
100+
76101
class Fixtures(object):
77102
def __init__(self, session):
78103
self.session = session
@@ -97,6 +122,7 @@ class TreeTestingMixin(
97122
MoveInside,
98123
Tree,
99124
GetNodes,
125+
DatabaseSetupMixin
100126
):
101127
base = None
102128
model = None
@@ -116,10 +142,7 @@ def stop_query_counter(self):
116142
)
117143

118144
def setUp(self):
119-
self.engine = create_engine("sqlite:///:memory:")
120-
Session = mptt_sessionmaker(sessionmaker(bind=self.engine))
121-
self.session = Session()
122-
self.base.metadata.create_all(self.engine)
145+
super().setUp()
123146
self.fixture = Fixtures(self.session)
124147
self.fixture.add(
125148
self.model, os.path.join("fixtures", getattr(self, "fixtures", "tree.json"))
@@ -134,9 +157,6 @@ def setUp(self):
134157
self.model.tree_id,
135158
)
136159

137-
def tearDown(self):
138-
self.base.metadata.drop_all(self.engine)
139-
140160
def test_session_expire_for_move_after_to_new_tree(self):
141161
"""
142162
https://github.com/uralbash/sqlalchemy_mptt/issues/33

sqlalchemy_mptt/tests/test_events.py

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,12 @@
1212

1313
import unittest
1414

15-
from sqlalchemy import Column, Boolean, Integer, create_engine
15+
from sqlalchemy import Boolean, Column, Integer
1616
from sqlalchemy.event import contains
17-
from sqlalchemy.orm import sessionmaker
18-
19-
from sqlalchemy_mptt import mptt_sessionmaker
2017

2118
from sqlalchemy_mptt.mixins import BaseNestedSets
2219
from sqlalchemy_mptt.sqlalchemy_compat import compat_layer
23-
from sqlalchemy_mptt.tests import TreeTestingMixin
24-
20+
from sqlalchemy_mptt.tests import DatabaseSetupMixin, TreeTestingMixin
2521

2622
Base = compat_layer.declarative_base()
2723

@@ -156,40 +152,36 @@ def test_remove(self):
156152
tree_manager.register_events()
157153

158154

159-
class Tree0Id(unittest.TestCase):
155+
class Tree0Id(DatabaseSetupMixin, unittest.TestCase):
160156
"""Test case where node id is provided and starts with 0
161157
162158
See comments in https://github.com/uralbash/sqlalchemy_mptt/issues/57
163159
"""
164-
def test(self):
165-
engine = create_engine('sqlite:///:memory:')
166-
Session = mptt_sessionmaker(sessionmaker(bind=engine))
167-
session = Session()
168-
Base.metadata.create_all(engine)
169160

161+
base = Base
162+
163+
def test(self):
170164
root = Tree(id=0)
171165
child = Tree(id=1, parent_id=0)
172166

173-
session.add(root)
174-
session.add(child)
175-
session.commit()
167+
self.session.add(root)
168+
self.session.add(child)
169+
self.session.commit()
176170

177171
self.assertEqual(root.tree_id, 1)
178172
self.assertEqual(child.tree_id, 1)
179173

180174

181-
class InitialInsert(unittest.TestCase):
175+
class InitialInsert(DatabaseSetupMixin, unittest.TestCase):
182176
"""Test case for initial insertion of node as specified in
183177
docs/initialize.rst
184178
"""
179+
180+
base = Base
181+
185182
def test_documented_initial_insert(self):
186183
from sqlalchemy_mptt import tree_manager
187184

188-
engine = create_engine('sqlite:///:memory:')
189-
Session = mptt_sessionmaker(sessionmaker(bind=engine))
190-
session = Session()
191-
Base.metadata.create_all(engine)
192-
193185
tree_manager.register_events(remove=True) # Disable MPTT events
194186

195187
_tree_id = 1
@@ -202,11 +194,11 @@ def test_documented_initial_insert(self):
202194
right=0,
203195
tree_id=_tree_id
204196
)
205-
session.add(item)
206-
session.commit()
197+
self.session.add(item)
198+
self.session.commit()
207199

208200
tree_manager.register_events() # enabled MPTT events back
209201
Tree.rebuild_tree(
210-
session,
202+
self.session,
211203
_tree_id
212204
) # rebuild lft, rgt value automatically

sqlalchemy_mptt/tests/test_inheritance.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import unittest
22

33
import sqlalchemy as sa
4-
from sqlalchemy.orm import sessionmaker
54

65
from sqlalchemy_mptt.mixins import BaseNestedSets
76
from sqlalchemy_mptt.sqlalchemy_compat import compat_layer
8-
from sqlalchemy_mptt.tests import TreeTestingMixin, failures_expected_on
9-
7+
from sqlalchemy_mptt.tests import (DatabaseSetupMixin, TreeTestingMixin,
8+
failures_expected_on)
109

1110
Base = compat_layer.declarative_base()
1211

@@ -45,16 +44,9 @@ class SpecializedTree(GenericTree):
4544
__table_args__ = tuple()
4645

4746

48-
class TestTree(unittest.TestCase):
49-
50-
def setUp(self):
51-
self.engine = sa.create_engine('sqlite:///:memory:')
52-
Session = sessionmaker(bind=self.engine)
53-
self.session = Session()
54-
Base.metadata.create_all(self.engine)
47+
class TestTree(DatabaseSetupMixin, unittest.TestCase):
5548

56-
def tearDown(self):
57-
Base.metadata.drop_all(self.engine)
49+
base = Base
5850

5951
def test_create_generic(self):
6052
self.session.add(GenericTree(ppk=1))

sqlalchemy_mptt/tests/test_stateful.py

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
#
66
# Distributed under terms of the MIT license.
77
"""Test cases written using Hypothesis stateful testing framework."""
8-
from hypothesis import HealthCheck, settings, strategies as st
9-
from hypothesis.stateful import Bundle, RuleBasedStateMachine, consumes, invariant, rule
10-
from sqlalchemy import Column, Integer, Boolean, create_engine
11-
from sqlalchemy.orm import joinedload, sessionmaker
12-
13-
from sqlalchemy_mptt import BaseNestedSets, mptt_sessionmaker
8+
from hypothesis import HealthCheck, settings
9+
from hypothesis import strategies as st
10+
from hypothesis.stateful import (Bundle, RuleBasedStateMachine, consumes,
11+
invariant, rule)
12+
from sqlalchemy import Boolean, Column, Integer
13+
from sqlalchemy.orm import joinedload
14+
15+
from sqlalchemy_mptt import BaseNestedSets
1416
from sqlalchemy_mptt.sqlalchemy_compat import compat_layer
15-
17+
from sqlalchemy_mptt.tests import DatabaseSetupMixin
1618

1719
Base = compat_layer.declarative_base()
1820

@@ -27,15 +29,18 @@ def __repr__(self):
2729
return "<Node (%s)>" % self.id
2830

2931

30-
class TreeStateMachine(RuleBasedStateMachine):
32+
class TreeStateMachine(DatabaseSetupMixin, RuleBasedStateMachine):
3133
"""A state machine with various possible actions and transitions for the Tree model."""
3234

35+
base = Base
36+
3337
def __init__(self):
3438
super().__init__()
35-
self.engine = create_engine("sqlite:///:memory:")
36-
Session = mptt_sessionmaker(sessionmaker(bind=self.engine))
37-
self.session = Session()
38-
Base.metadata.create_all(self.engine)
39+
self.setUp()
40+
41+
def teardown(self):
42+
super().teardown()
43+
self.tearDown()
3944

4045
node = Bundle('node')
4146

0 commit comments

Comments
 (0)