summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/orm/test_transaction.py100
1 files changed, 76 insertions, 24 deletions
diff --git a/test/orm/test_transaction.py b/test/orm/test_transaction.py
index 6095d8642..fd015a8b6 100644
--- a/test/orm/test_transaction.py
+++ b/test/orm/test_transaction.py
@@ -1089,34 +1089,80 @@ class _LocalFixture(FixtureTest):
mapper(Address, addresses)
-class SubtransactionRecipeTest(FixtureTest):
- run_inserts = None
- __backend__ = True
+def subtransaction_recipe_one(self):
+ @contextlib.contextmanager
+ def transaction(session):
- future = False
-
- @testing.fixture
- def subtransaction_recipe(self):
- @contextlib.contextmanager
- def transaction(session):
+ if session.in_transaction():
+ outermost = False
+ else:
+ outermost = True
+ session.begin()
+ try:
+ yield
+ except:
if session.in_transaction():
- outermost = False
- else:
- outermost = True
- session.begin()
+ session.rollback()
+ raise
+ else:
+ if outermost and session.in_transaction():
+ session.commit()
+ return transaction
+
+
+def subtransaction_recipe_two(self):
+ # shorter recipe
+ @contextlib.contextmanager
+ def transaction(session):
+ if not session.in_transaction():
+ with session.begin():
+ yield
+ else:
+ yield
+
+ return transaction
+
+
+def subtransaction_recipe_three(self):
+ @contextlib.contextmanager
+ def transaction(session):
+ if not session.in_transaction():
+ session.begin()
try:
yield
except:
if session.in_transaction():
session.rollback()
- raise
else:
- if outermost and session.in_transaction():
- session.commit()
+ session.commit()
+ else:
+ try:
+ yield
+ except:
+ if session.in_transaction():
+ session.rollback()
+ raise
+
+ return transaction
+
- return transaction
+@testing.combinations(
+ (subtransaction_recipe_one, True),
+ (subtransaction_recipe_two, False),
+ (subtransaction_recipe_three, True),
+ argnames="target_recipe,recipe_rollsback_early",
+ id_="ns",
+)
+@testing.combinations((True,), (False,), argnames="future", id_="s")
+class SubtransactionRecipeTest(FixtureTest):
+ run_inserts = None
+ __backend__ = True
+
+ @testing.fixture
+ def subtransaction_recipe(self):
+ return self.target_recipe()
@testing.requires.savepoints
def test_recipe_heavy_nesting(self, subtransaction_recipe):
@@ -1253,10 +1299,15 @@ class SubtransactionRecipeTest(FixtureTest):
except:
pass
- # that was a real rollback, so no transaction
- is_(sess.get_transaction(), None)
+ if self.recipe_rollsback_early:
+ # that was a real rollback, so no transaction
+ assert not sess.in_transaction()
+ is_(sess.get_transaction(), None)
+ else:
+ assert sess.in_transaction()
sess.close()
+ assert not sess.in_transaction()
def test_recipe_multi_nesting(self, subtransaction_recipe):
sess = Session(testing.db, future=self.future)
@@ -1271,7 +1322,12 @@ class SubtransactionRecipeTest(FixtureTest):
except:
pass
- assert not sess.in_transaction()
+ if self.recipe_rollsback_early:
+ assert not sess.in_transaction()
+ else:
+ assert sess.in_transaction()
+
+ assert not sess.in_transaction()
def test_recipe_deactive_status_check(self, subtransaction_recipe):
sess = Session(testing.db, future=self.future)
@@ -1284,10 +1340,6 @@ class SubtransactionRecipeTest(FixtureTest):
sess.commit() # no error
-class FutureSubtransactionRecipeTest(SubtransactionRecipeTest):
- future = True
-
-
class FixtureDataTest(_LocalFixture):
run_inserts = "each"
__backend__ = True