summaryrefslogtreecommitdiff
path: root/test/orm
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-10-04 22:11:28 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2021-10-04 22:11:28 +0000
commitbb3560851280d338ffb03b72da25488f7db34d22 (patch)
tree015f3ba5d9631b52b83b9fe4f28b01b2de03c2b5 /test/orm
parentc33a0a9c4732743a58e5e40ae6d8fd52e7865ca8 (diff)
parente7e0757efe042b8343ef44d4f61a33cdbc072ff3 (diff)
downloadsqlalchemy-bb3560851280d338ffb03b72da25488f7db34d22.tar.gz
Merge "disallow adding to identity map that's been discarded"
Diffstat (limited to 'test/orm')
-rw-r--r--test/orm/test_session.py77
1 files changed, 77 insertions, 0 deletions
diff --git a/test/orm/test_session.py b/test/orm/test_session.py
index efe10f4cc..afd9ca815 100644
--- a/test/orm/test_session.py
+++ b/test/orm/test_session.py
@@ -28,8 +28,10 @@ from sqlalchemy.testing import assertions
from sqlalchemy.testing import config
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
+from sqlalchemy.testing import expect_raises_message
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
+from sqlalchemy.testing import is_false
from sqlalchemy.testing import is_not
from sqlalchemy.testing import is_true
from sqlalchemy.testing import mock
@@ -2176,6 +2178,81 @@ class SessionInterface(fixtures.MappedTest):
)
+class NewStyleExecutionTest(_fixtures.FixtureTest):
+ run_setup_mappers = "once"
+ run_inserts = "once"
+ run_deletes = None
+
+ @classmethod
+ def setup_mappers(cls):
+ cls._setup_stock_mapping()
+
+ @testing.combinations(("close",), ("expunge_all",))
+ def test_unbuffered_result_session_is_closed(self, meth):
+ """test #7128"""
+ User = self.classes.User
+
+ sess = fixture_session()
+
+ result = sess.execute(select(User))
+
+ # close or expunge_all
+ getattr(sess, meth)()
+
+ with expect_raises_message(
+ sa.exc.InvalidRequestError,
+ "Object .*User.* cannot be converted to 'persistent' state, "
+ "as this identity map is no longer valid.",
+ ):
+ result.all()
+
+ @testing.combinations((True,), (False,), argnames="prebuffered")
+ @testing.combinations(("close",), ("expunge_all",), argnames="meth")
+ def test_unbuffered_result_before_session_is_closed(
+ self, prebuffered, meth
+ ):
+ """test #7128"""
+ User = self.classes.User
+
+ sess = fixture_session()
+
+ if prebuffered:
+ result = sess.execute(
+ select(User), execution_options={"prebuffer_rows": True}
+ )
+ else:
+ result = sess.execute(select(User))
+ u1 = result.scalars().all()[0]
+
+ is_true(inspect(u1).persistent)
+ is_false(inspect(u1).detached)
+ is_(inspect(u1).session, sess)
+
+ # close or expunge_all
+ getattr(sess, meth)()
+
+ is_true(inspect(u1).detached)
+ is_(inspect(u1).session, None)
+
+ @testing.combinations(("close",), ("expunge_all",))
+ def test_prebuffered_result_session_is_closed(self, meth):
+ """test #7128"""
+ User = self.classes.User
+
+ sess = fixture_session()
+
+ result = sess.execute(
+ select(User), execution_options={"prebuffer_rows": True}
+ )
+ # close or expunge_all
+ getattr(sess, meth)()
+
+ u1 = result.scalars().all()[0]
+
+ is_true(inspect(u1).detached)
+ is_(inspect(u1).session, None)
+
+
class FlushWarningsTest(fixtures.MappedTest):
run_setup_mappers = "each"