summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/build/changelog/unreleased_14/7599.rst16
-rw-r--r--lib/sqlalchemy/dialects/postgresql/provision.py4
-rw-r--r--lib/sqlalchemy/testing/__init__.py2
-rw-r--r--lib/sqlalchemy/testing/assertions.py59
-rw-r--r--lib/sqlalchemy/testing/plugin/pytestplugin.py19
-rw-r--r--lib/sqlalchemy/testing/warnings.py32
-rw-r--r--test/dialect/oracle/test_reflection.py6
-rw-r--r--test/dialect/postgresql/test_reflection.py3
-rw-r--r--test/engine/test_pool.py4
-rw-r--r--test/engine/test_reconnect.py3
-rw-r--r--test/orm/declarative/test_basic.py37
-rw-r--r--test/orm/declarative/test_clsregistry.py17
-rw-r--r--test/orm/declarative/test_mixin.py11
-rw-r--r--test/orm/inheritance/test_basic.py15
-rw-r--r--test/orm/test_attributes.py7
-rw-r--r--test/orm/test_cascade.py33
-rw-r--r--test/orm/test_dynamic.py3
-rw-r--r--test/orm/test_eager_relations.py4
-rw-r--r--test/orm/test_events.py19
-rw-r--r--test/orm/test_instrumentation.py4
-rw-r--r--test/orm/test_lazy_relations.py3
-rw-r--r--test/orm/test_mapper.py5
-rw-r--r--test/orm/test_query.py5
-rw-r--r--test/orm/test_rel_fn.py13
-rw-r--r--test/orm/test_relationships.py19
-rw-r--r--test/orm/test_scoping.py3
-rw-r--r--test/orm/test_selectin_relations.py4
-rw-r--r--test/orm/test_session.py13
-rw-r--r--test/orm/test_subquery_relations.py4
-rw-r--r--test/orm/test_unitofworkv2.py7
-rw-r--r--test/orm/test_versioning.py6
-rw-r--r--test/sql/test_metadata.py46
-rw-r--r--test/sql/test_operators.py10
33 files changed, 263 insertions, 173 deletions
diff --git a/doc/build/changelog/unreleased_14/7599.rst b/doc/build/changelog/unreleased_14/7599.rst
new file mode 100644
index 000000000..db69ace46
--- /dev/null
+++ b/doc/build/changelog/unreleased_14/7599.rst
@@ -0,0 +1,16 @@
+.. change::
+ :tags: bug, tests
+ :tickets: 7599
+
+ Improvements to the test suite's integration with pytest such that the
+ "warnings" plugin, if manually enabled, will not interfere with the test
+ suite, such that third parties can enable the warnings plugin or make use
+ of the ``-W`` parameter and SQLAlchemy's test suite will continue to pass.
+ Additionally, modernized the detection of the "pytest-xdist" plugin so that
+ plugins can be globally disabled using PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
+ without breaking the test suite if xdist were still installed. Warning
+ filters that promote deprecation warnings to errors are now localized to
+ SQLAlchemy-specific warnings, or within SQLAlchemy-specific sources for
+ general Python deprecation warnings, so that non-SQLAlchemy deprecation
+ warnings emitted from pytest plugins should also not impact the test suite.
+
diff --git a/lib/sqlalchemy/dialects/postgresql/provision.py b/lib/sqlalchemy/dialects/postgresql/provision.py
index 289dda4b6..29926ee3d 100644
--- a/lib/sqlalchemy/dialects/postgresql/provision.py
+++ b/lib/sqlalchemy/dialects/postgresql/provision.py
@@ -19,10 +19,6 @@ def _pg_create_db(cfg, eng, ident):
template_db = cfg.options.postgresql_templatedb
with eng.execution_options(isolation_level="AUTOCOMMIT").begin() as conn:
- try:
- _pg_drop_db(cfg, conn, ident)
- except Exception:
- pass
if not template_db:
template_db = conn.exec_driver_sql(
"select current_database()"
diff --git a/lib/sqlalchemy/testing/__init__.py b/lib/sqlalchemy/testing/__init__.py
index 87208d3f4..fd6ddf593 100644
--- a/lib/sqlalchemy/testing/__init__.py
+++ b/lib/sqlalchemy/testing/__init__.py
@@ -12,6 +12,8 @@ from .assertions import assert_raises
from .assertions import assert_raises_context_ok
from .assertions import assert_raises_message
from .assertions import assert_raises_message_context_ok
+from .assertions import assert_warns
+from .assertions import assert_warns_message
from .assertions import AssertsCompiledSQL
from .assertions import AssertsExecutionResults
from .assertions import ComparesTables
diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py
index f268b6fc3..2a00f1c14 100644
--- a/lib/sqlalchemy/testing/assertions.py
+++ b/lib/sqlalchemy/testing/assertions.py
@@ -139,13 +139,15 @@ def _expect_warnings(
exc_cls,
messages,
regex=True,
+ search_msg=False,
assert_=True,
raise_on_any_unexpected=False,
+ squelch_other_warnings=False,
):
global _FILTERS, _SEEN, _EXC_CLS
- if regex:
+ if regex or search_msg:
filters = [re.compile(msg, re.I | re.S) for msg in messages]
else:
filters = list(messages)
@@ -183,19 +185,23 @@ def _expect_warnings(
exception = None
if not exception or not issubclass(exception, _EXC_CLS):
- return real_warn(msg, *arg, **kw)
+ if not squelch_other_warnings:
+ return real_warn(msg, *arg, **kw)
if not filters and not raise_on_any_unexpected:
return
for filter_ in filters:
- if (regex and filter_.match(msg)) or (
- not regex and filter_ == msg
+ if (
+ (search_msg and filter_.search(msg))
+ or (regex and filter_.match(msg))
+ or (not regex and filter_ == msg)
):
seen.discard(filter_)
break
else:
- real_warn(msg, *arg, **kw)
+ if not squelch_other_warnings:
+ real_warn(msg, *arg, **kw)
with mock.patch("warnings.warn", our_warn):
try:
@@ -343,6 +349,40 @@ def assert_raises_message(except_cls, msg, callable_, *args, **kwargs):
)
+def assert_warns(except_cls, callable_, *args, **kwargs):
+ """legacy adapter function for functions that were previously using
+ assert_raises with SAWarning or similar.
+
+ has some workarounds to accommodate the fact that the callable completes
+ with this approach rather than stopping at the exception raise.
+
+
+ """
+ with _expect_warnings(except_cls, [".*"], squelch_other_warnings=True):
+ return callable_(*args, **kwargs)
+
+
+def assert_warns_message(except_cls, msg, callable_, *args, **kwargs):
+ """legacy adapter function for functions that were previously using
+ assert_raises with SAWarning or similar.
+
+ has some workarounds to accommodate the fact that the callable completes
+ with this approach rather than stopping at the exception raise.
+
+ Also uses regex.search() to match the given message to the error string
+ rather than regex.match().
+
+ """
+ with _expect_warnings(
+ except_cls,
+ [msg],
+ search_msg=True,
+ regex=False,
+ squelch_other_warnings=True,
+ ):
+ return callable_(*args, **kwargs)
+
+
def assert_raises_message_context_ok(
except_cls, msg, callable_, *args, **kwargs
):
@@ -364,6 +404,15 @@ class _ErrorContainer:
@contextlib.contextmanager
def _expect_raises(except_cls, msg=None, check_context=False):
+ if (
+ isinstance(except_cls, type)
+ and issubclass(except_cls, Warning)
+ or isinstance(except_cls, Warning)
+ ):
+ raise TypeError(
+ "Use expect_warnings for warnings, not "
+ "expect_raises / assert_raises"
+ )
ec = _ErrorContainer()
if check_context:
are_we_already_in_a_traceback = sys.exc_info()[0]
diff --git a/lib/sqlalchemy/testing/plugin/pytestplugin.py b/lib/sqlalchemy/testing/plugin/pytestplugin.py
index 7a62ad008..2ae6730bb 100644
--- a/lib/sqlalchemy/testing/plugin/pytestplugin.py
+++ b/lib/sqlalchemy/testing/plugin/pytestplugin.py
@@ -13,16 +13,10 @@ import itertools
import operator
import os
import re
+import uuid
import pytest
-try:
- import xdist # noqa
-
- has_xdist = True
-except ImportError:
- has_xdist = False
-
def pytest_addoption(parser):
group = parser.getgroup("sqlalchemy")
@@ -75,6 +69,9 @@ def pytest_addoption(parser):
def pytest_configure(config):
+ if config.pluginmanager.hasplugin("xdist"):
+ config.pluginmanager.register(XDistHooks())
+
if hasattr(config, "workerinput"):
plugin_base.restore_important_follower_config(config.workerinput)
plugin_base.configure_follower(config.workerinput["follower_ident"])
@@ -148,10 +145,8 @@ def pytest_collection_finish(session):
collect_types.init_types_collection(filter_filename=_filter)
-if has_xdist:
- import uuid
-
- def pytest_configure_node(node):
+class XDistHooks:
+ def pytest_configure_node(self, node):
from sqlalchemy.testing import provision
from sqlalchemy.testing import asyncio
@@ -166,7 +161,7 @@ if has_xdist:
provision.create_follower_db, node.workerinput["follower_ident"]
)
- def pytest_testnodedown(node, error):
+ def pytest_testnodedown(self, node, error):
from sqlalchemy.testing import provision
from sqlalchemy.testing import asyncio
diff --git a/lib/sqlalchemy/testing/warnings.py b/lib/sqlalchemy/testing/warnings.py
index 34b23d675..1c2039602 100644
--- a/lib/sqlalchemy/testing/warnings.py
+++ b/lib/sqlalchemy/testing/warnings.py
@@ -11,8 +11,13 @@ from .. import exc as sa_exc
from ..util.langhelpers import _warnings_warn
-class SATestSuiteWarning(sa_exc.SAWarning):
- """warning for a condition detected during tests that is non-fatal"""
+class SATestSuiteWarning(Warning):
+ """warning for a condition detected during tests that is non-fatal
+
+ Currently outside of SAWarning so that we can work around tools like
+ Alembic doing the wrong thing with warnings.
+
+ """
def warn_test_suite(message):
@@ -22,28 +27,21 @@ def warn_test_suite(message):
def setup_filters():
"""Set global warning behavior for the test suite."""
+ # TODO: at this point we can use the normal pytest warnings plugin,
+ # if we decide the test suite can be linked to pytest only
+
+ origin = r"^(?:test|sqlalchemy)\..*"
+
warnings.filterwarnings(
"ignore", category=sa_exc.SAPendingDeprecationWarning
)
warnings.filterwarnings("error", category=sa_exc.SADeprecationWarning)
warnings.filterwarnings("error", category=sa_exc.SAWarning)
- warnings.filterwarnings("always", category=SATestSuiteWarning)
- # some selected deprecations...
- warnings.filterwarnings("error", category=DeprecationWarning)
- warnings.filterwarnings(
- "ignore", category=DeprecationWarning, message=r".*StopIteration"
- )
- warnings.filterwarnings(
- "ignore",
- category=DeprecationWarning,
- message=r".*inspect.get.*argspec",
- )
+ warnings.filterwarnings("always", category=SATestSuiteWarning)
warnings.filterwarnings(
- "ignore",
- category=DeprecationWarning,
- message="The loop argument is deprecated",
+ "error", category=DeprecationWarning, module=origin
)
try:
@@ -52,7 +50,7 @@ def setup_filters():
pass
else:
warnings.filterwarnings(
- "once", category=pytest.PytestDeprecationWarning
+ "once", category=pytest.PytestDeprecationWarning, module=origin
)
diff --git a/test/dialect/oracle/test_reflection.py b/test/dialect/oracle/test_reflection.py
index 7dcd5bb1d..df8dff30f 100644
--- a/test/dialect/oracle/test_reflection.py
+++ b/test/dialect/oracle/test_reflection.py
@@ -23,7 +23,7 @@ from sqlalchemy.dialects.oracle.base import BINARY_DOUBLE
from sqlalchemy.dialects.oracle.base import BINARY_FLOAT
from sqlalchemy.dialects.oracle.base import DOUBLE_PRECISION
from sqlalchemy.dialects.oracle.base import NUMBER
-from sqlalchemy.testing import assert_raises
+from sqlalchemy.testing import assert_warns
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
@@ -352,7 +352,7 @@ class ConstraintTest(fixtures.TablesTest):
"foo_id", Integer, ForeignKey("foo.id", onupdate="CASCADE")
),
)
- assert_raises(exc.SAWarning, bar.create, connection)
+ assert_warns(exc.SAWarning, bar.create, connection)
bat = Table(
"bat",
@@ -361,7 +361,7 @@ class ConstraintTest(fixtures.TablesTest):
Column("foo_id", Integer),
ForeignKeyConstraint(["foo_id"], ["foo.id"], onupdate="CASCADE"),
)
- assert_raises(exc.SAWarning, bat.create, connection)
+ assert_warns(exc.SAWarning, bat.create, connection)
def test_reflect_check_include_all(self, connection):
insp = inspect(connection)
diff --git a/test/dialect/postgresql/test_reflection.py b/test/dialect/postgresql/test_reflection.py
index fa04dee48..9c286145b 100644
--- a/test/dialect/postgresql/test_reflection.py
+++ b/test/dialect/postgresql/test_reflection.py
@@ -34,6 +34,7 @@ from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import mock
from sqlalchemy.testing.assertions import assert_raises
+from sqlalchemy.testing.assertions import assert_warns
from sqlalchemy.testing.assertions import AssertsExecutionResults
from sqlalchemy.testing.assertions import eq_
from sqlalchemy.testing.assertions import is_
@@ -486,7 +487,7 @@ class DomainReflectionTest(fixtures.TestBase, AssertsExecutionResults):
base.PGDialect.ischema_names = {}
try:
m2 = MetaData()
- assert_raises(
+ assert_warns(
exc.SAWarning, Table, "testtable", m2, autoload_with=connection
)
diff --git a/test/engine/test_pool.py b/test/engine/test_pool.py
index 324b971b6..0c8975202 100644
--- a/test/engine/test_pool.py
+++ b/test/engine/test_pool.py
@@ -18,7 +18,7 @@ from sqlalchemy.pool.base import _AsyncConnDialect
from sqlalchemy.pool.base import _ConnDialect
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_context_ok
-from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises
from sqlalchemy.testing import fixtures
@@ -1816,7 +1816,7 @@ class QueuePoolTest(PoolTestBase):
c1 = p.connect()
rec = c1._connection_record
c1.close()
- assert_raises_message(
+ assert_warns_message(
Warning, "Double checkin attempted on %s" % rec, rec.checkin
)
diff --git a/test/engine/test_reconnect.py b/test/engine/test_reconnect.py
index 74b5b2df5..cccf66821 100644
--- a/test/engine/test_reconnect.py
+++ b/test/engine/test_reconnect.py
@@ -17,6 +17,7 @@ from sqlalchemy.engine import url
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import assert_raises_message_context_ok
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises
@@ -961,7 +962,7 @@ class CursorErrTest(fixtures.TestBase):
def test_cursor_shutdown_in_initialize(self):
db = self._fixture(True, True)
- assert_raises_message_context_ok(
+ assert_warns_message(
exc.SAWarning, "Exception attempting to detect", db.connect
)
eq_(
diff --git a/test/orm/declarative/test_basic.py b/test/orm/declarative/test_basic.py
index 4fb276543..9651f6dbf 100644
--- a/test/orm/declarative/test_basic.py
+++ b/test/orm/declarative/test_basic.py
@@ -806,7 +806,13 @@ class DeclarativeMultiBaseTest(
id = Column(Integer, primary_key=True)
def test_column_named_twice(self):
- def go():
+ with assertions.expect_deprecated(
+ "A column with name 'x' is already present in table 'foo'"
+ ), expect_warnings(
+ "On class 'Foo', Column object 'x' named directly multiple times, "
+ "only one will be used: x, y",
+ ):
+
class Foo(Base):
__tablename__ = "foo"
@@ -814,15 +820,14 @@ class DeclarativeMultiBaseTest(
x = Column("x", Integer)
y = Column("x", Integer)
- assert_raises_message(
- sa.exc.SAWarning,
+ def test_column_repeated_under_prop(self):
+ with assertions.expect_deprecated(
+ "A column with name 'x' is already present in table 'foo'"
+ ), expect_warnings(
"On class 'Foo', Column object 'x' named directly multiple times, "
- "only one will be used: x, y",
- go,
- )
+ "only one will be used: x, y, z",
+ ):
- def test_column_repeated_under_prop(self):
- def go():
class Foo(Base):
__tablename__ = "foo"
@@ -831,13 +836,6 @@ class DeclarativeMultiBaseTest(
y = column_property(x)
z = Column("x", Integer)
- assert_raises_message(
- sa.exc.SAWarning,
- "On class 'Foo', Column object 'x' named directly multiple times, "
- "only one will be used: x, y, z",
- go,
- )
-
def test_using_explicit_prop_in_schema_objects(self):
class Foo(Base):
__tablename__ = "foo"
@@ -2416,15 +2414,14 @@ class DeclarativeMultiBaseTest(
__tablename__ = "a"
id = Column(Integer, primary_key=True)
- assert_raises_message(
- sa.exc.SAWarning,
+ with expect_warnings(
"This declarative base already contains a class with ",
- lambda: type(Base)(
+ ):
+ type(Base)(
"Test",
(Base,),
dict(__tablename__="b", id=Column(Integer, primary_key=True)),
- ),
- )
+ )
@testing.teardown_events(MapperEvents)
@testing.teardown_events(InstrumentationEvents)
diff --git a/test/orm/declarative/test_clsregistry.py b/test/orm/declarative/test_clsregistry.py
index 8c6381475..f19276126 100644
--- a/test/orm/declarative/test_clsregistry.py
+++ b/test/orm/declarative/test_clsregistry.py
@@ -7,6 +7,7 @@ from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
from sqlalchemy.testing import mock
+from sqlalchemy.testing.assertions import expect_warnings
from sqlalchemy.testing.util import gc_collect
@@ -34,16 +35,16 @@ class ClsRegistryTest(fixtures.TestBase):
clsregistry.add_class("Foo", f1, base._class_registry)
gc_collect()
- assert_raises_message(
- exc.SAWarning,
+ with expect_warnings(
"This declarative base already contains a class with the "
"same class name and module name as foo.bar.Foo, and "
- "will be replaced in the string-lookup table.",
- clsregistry.add_class,
- "Foo",
- f2,
- base._class_registry,
- )
+ "will be replaced in the string-lookup table."
+ ):
+ clsregistry.add_class(
+ "Foo",
+ f2,
+ base._class_registry,
+ )
def test_resolve(self):
base = registry()
diff --git a/test/orm/declarative/test_mixin.py b/test/orm/declarative/test_mixin.py
index 3bad55d31..97f0d560e 100644
--- a/test/orm/declarative/test_mixin.py
+++ b/test/orm/declarative/test_mixin.py
@@ -1856,14 +1856,11 @@ class DeclaredAttrTest(DeclarativeTestBase, testing.AssertsCompiledSQL):
def my_prop(cls):
return Column("x", Integer)
- assert_raises_message(
- sa.exc.SAWarning,
+ with expect_warnings(
"Unmanaged access of declarative attribute my_prop "
- "from non-mapped class Mixin",
- getattr,
- Mixin,
- "my_prop",
- )
+ "from non-mapped class Mixin"
+ ):
+ Mixin.my_prop
def test_can_we_access_the_mixin_straight_special_names(self):
class Mixin:
diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py
index 5fc69bf9e..67abc8971 100644
--- a/test/orm/inheritance/test_basic.py
+++ b/test/orm/inheritance/test_basic.py
@@ -35,6 +35,7 @@ from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
from sqlalchemy.testing import mock
+from sqlalchemy.testing.assertions import assert_warns_message
from sqlalchemy.testing.assertsql import AllOf
from sqlalchemy.testing.assertsql import CompiledSQL
from sqlalchemy.testing.assertsql import Conditional
@@ -903,7 +904,7 @@ class PolymorphicAttributeManagementTest(fixtures.MappedTest):
c1 = C()
c1.class_name = "b"
sess.add(c1)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Flushing object %s with incompatible "
"polymorphic identity 'b'; the object may not "
@@ -922,7 +923,7 @@ class PolymorphicAttributeManagementTest(fixtures.MappedTest):
b1 = B()
b1.class_name = "c"
sess.add(b1)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Flushing object %s with incompatible "
"polymorphic identity 'c'; the object may not "
@@ -938,7 +939,7 @@ class PolymorphicAttributeManagementTest(fixtures.MappedTest):
b1 = B()
b1.class_name = "xyz"
sess.add(b1)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Flushing object %s with incompatible "
"polymorphic identity 'xyz'; the object may not "
@@ -968,7 +969,7 @@ class PolymorphicAttributeManagementTest(fixtures.MappedTest):
sess.expire(c1)
c1.class_name = "b"
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Flushing object %s with incompatible "
"polymorphic identity 'b'; the object may not "
@@ -2231,7 +2232,7 @@ class DistinctPKTest(fixtures.MappedTest):
properties=dict(id=[employee_table.c.eid, person_table.c.id]),
primary_key=[person_table.c.id, employee_table.c.eid],
)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
r"On mapper Mapper\[Employee\(employees\)\], "
"primary key column 'persons.id' is being "
@@ -2529,7 +2530,7 @@ class OverrideColKeyTest(fixtures.MappedTest):
Sub, subtable_two, inherits=Base
)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Implicitly combining column base.base_id with "
"column subtable_two.base_id under attribute 'base_id'",
@@ -3181,7 +3182,7 @@ class NoPKOnSubTableWarningTest(fixtures.MappedTest):
pass
self.mapper_registry.map_imperatively(P, parent)
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"Could not assemble any primary keys for locally mapped "
"table 'child' - no rows will be persisted in this Table.",
diff --git a/test/orm/test_attributes.py b/test/orm/test_attributes.py
index 3a174ffd9..8e6ddf9d4 100644
--- a/test/orm/test_attributes.py
+++ b/test/orm/test_attributes.py
@@ -19,6 +19,7 @@ from sqlalchemy.testing import is_false
from sqlalchemy.testing import is_not
from sqlalchemy.testing import is_true
from sqlalchemy.testing import not_in
+from sqlalchemy.testing.assertions import assert_warns
from sqlalchemy.testing.util import all_partial_orderings
from sqlalchemy.testing.util import gc_collect
@@ -3769,7 +3770,7 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
state._expire(state.dict, set())
- assert_raises(Warning, coll.append, B())
+ assert_warns(Warning, coll.append, B())
def test_replaced(self):
A, B = self.A, self.B
@@ -3790,7 +3791,7 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
state._reset(state.dict, "bs")
- assert_raises(Warning, coll.append, B())
+ assert_warns(Warning, coll.append, B())
def test_ad_hoc_lazy(self):
A, B = self.A, self.B
@@ -3799,4 +3800,4 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
_set_callable(state, state.dict, "bs", lambda: B())
- assert_raises(Warning, coll.append, B())
+ assert_warns(Warning, coll.append, B())
diff --git a/test/orm/test_cascade.py b/test/orm/test_cascade.py
index 6de346ace..51f37f028 100644
--- a/test/orm/test_cascade.py
+++ b/test/orm/test_cascade.py
@@ -23,6 +23,7 @@ from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.orm.decl_api import declarative_base
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import in_
@@ -93,7 +94,7 @@ class CascadeArgTest(fixtures.MappedTest):
def test_delete_orphan_without_delete(self):
Address = self.classes.Address
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
"The 'delete-orphan' cascade option requires 'delete'.",
relationship,
@@ -1208,7 +1209,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(u1)
assert u1 in sess
assert a1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_o2m_only_child_persistent(self):
User, Address = self.classes.User, self.classes.Address
@@ -1226,7 +1227,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(u1)
assert u1 in sess
assert a1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_o2m_backref_child_pending(self):
User, Address = self.classes.User, self.classes.Address
@@ -1252,7 +1253,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(u1)
assert u1 in sess
assert a1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_o2m_backref_child_transient_nochange(self):
User, Address = self.classes.User, self.classes.Address
@@ -1288,7 +1289,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.expunge(a1)
assert u1 in sess
assert a1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_o2m_backref_child_expunged_nochange(self):
User, Address = self.classes.User, self.classes.Address
@@ -1337,7 +1338,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(a1)
assert u1 not in sess
assert a1 in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2o_only_child_expunged(self):
User, Address = self.classes.User, self.classes.Address
@@ -1354,7 +1355,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.expunge(u1)
assert u1 not in sess
assert a1 in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2o_backref_child_pending(self):
User, Address = self.classes.User, self.classes.Address
@@ -1380,7 +1381,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(a1)
assert u1 not in sess
assert a1 in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2o_backref_child_expunged(self):
User, Address = self.classes.User, self.classes.Address
@@ -1397,7 +1398,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.expunge(u1)
assert u1 not in sess
assert a1 in sess
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning, "not in session", sess.flush
)
@@ -1417,7 +1418,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.expunge(u1)
assert u1 not in sess
assert a1 in sess
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning, "not in session", sess.flush
)
@@ -1517,7 +1518,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(i1)
assert i1 in sess
assert k1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2m_only_child_persistent(self):
Item, Keyword = self.classes.Item, self.classes.Keyword
@@ -1535,7 +1536,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(i1)
assert i1 in sess
assert k1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2m_backref_child_pending(self):
Item, Keyword = self.classes.Item, self.classes.Keyword
@@ -1561,7 +1562,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.add(i1)
assert i1 in sess
assert k1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2m_backref_child_transient_nochange(self):
Item, Keyword = self.classes.Item, self.classes.Keyword
@@ -1597,7 +1598,7 @@ class NoSaveCascadeFlushTest(_fixtures.FixtureTest):
sess.expunge(k1)
assert i1 in sess
assert k1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.flush)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.flush)
def test_m2m_backref_child_expunged_nochange(self):
Item, Keyword = self.classes.Item, self.classes.Keyword
@@ -2775,7 +2776,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
a1 = Address(email_address="a1")
a1.user = u1
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.commit)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.commit)
assert a1 not in sess
@@ -2828,7 +2829,7 @@ class NoBackrefCascadeTest(_fixtures.FixtureTest):
a1.dingalings.append(d1)
assert a1 not in sess
- assert_raises_message(sa_exc.SAWarning, "not in session", sess.commit)
+ assert_warns_message(sa_exc.SAWarning, "not in session", sess.commit)
class PendingOrphanTestSingleLevel(fixtures.MappedTest):
diff --git a/test/orm/test_dynamic.py b/test/orm/test_dynamic.py
index 5ea613197..2eaafb953 100644
--- a/test/orm/test_dynamic.py
+++ b/test/orm/test_dynamic.py
@@ -15,6 +15,7 @@ from sqlalchemy.orm import Query
from sqlalchemy.orm import relationship
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises_message
@@ -321,7 +322,7 @@ class DynamicTest(_DynamicFixture, _fixtures.FixtureTest, AssertsCompiledSQL):
},
)
self.mapper_registry.map_imperatively(User, users)
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
"On relationship Address.user, 'dynamic' loaders cannot be "
"used with many-to-one/one-to-one relationships and/or "
diff --git a/test/orm/test_eager_relations.py b/test/orm/test_eager_relations.py
index 42b3bd1ea..8c82450da 100644
--- a/test/orm/test_eager_relations.py
+++ b/test/orm/test_eager_relations.py
@@ -31,8 +31,8 @@ from sqlalchemy.orm import Session
from sqlalchemy.orm import undefer
from sqlalchemy.sql import operators
from sqlalchemy.sql.selectable import LABEL_STYLE_TABLENAME_PLUS_COL
-from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises_message
from sqlalchemy.testing import fixtures
@@ -2142,7 +2142,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
)
self.mapper_registry.map_imperatively(Order, orders)
s = fixture_session()
- assert_raises(
+ assert_warns(
sa.exc.SAWarning, s.query(User).options(joinedload(User.order)).all
)
diff --git a/test/orm/test_events.py b/test/orm/test_events.py
index 37b4d0ae1..79b20e285 100644
--- a/test/orm/test_events.py
+++ b/test/orm/test_events.py
@@ -35,8 +35,10 @@ from sqlalchemy.orm import UserDefinedOption
from sqlalchemy.sql.cache_key import NO_CACHE
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
+from sqlalchemy.testing import expect_raises
from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_not
@@ -1059,7 +1061,7 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
m1 = Mock()
self.mapper_registry.map_imperatively(User, users)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
r"before_configured' and 'after_configured' ORM events only "
r"invoke with the Mapper class as "
@@ -1070,7 +1072,7 @@ class MapperEventsTest(_RemoveListeners, _fixtures.FixtureTest):
m1,
)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
r"before_configured' and 'after_configured' ORM events only "
r"invoke with the Mapper class as "
@@ -2197,7 +2199,12 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
u2 = User(name="u1", id=1)
sess.add(u2)
- assert_raises(sa.exc.SAWarning, sess.commit)
+
+ with expect_raises(sa.exc.IntegrityError), expect_warnings(
+ "New instance"
+ ):
+ sess.commit()
+
sess.rollback()
eq_(
canary,
@@ -2249,7 +2256,11 @@ class SessionEventsTest(_RemoveListeners, _fixtures.FixtureTest):
u2 = User(name="u1", id=1)
sess.add(u2)
- assert_raises(sa.exc.SAWarning, sess.commit)
+ with expect_raises(sa.exc.IntegrityError), expect_warnings(
+ "New instance"
+ ):
+ sess.commit()
+
sess.rollback()
eq_(assertions, [True, True])
diff --git a/test/orm/test_instrumentation.py b/test/orm/test_instrumentation.py
index 8f5455850..3b1010300 100644
--- a/test/orm/test_instrumentation.py
+++ b/test/orm/test_instrumentation.py
@@ -9,7 +9,7 @@ from sqlalchemy.orm import clear_mappers
from sqlalchemy.orm import instrumentation
from sqlalchemy.orm import relationship
from sqlalchemy.testing import assert_raises
-from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import ne_
@@ -524,7 +524,7 @@ class MapperInitTest(fixtures.MappedTest):
def __del__(self):
pass
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
r"__del__\(\) method on class "
r"<class '.*\.A'> will cause "
diff --git a/test/orm/test_lazy_relations.py b/test/orm/test_lazy_relations.py
index ee6d53652..ed636ae42 100644
--- a/test/orm/test_lazy_relations.py
+++ b/test/orm/test_lazy_relations.py
@@ -25,6 +25,7 @@ from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
from sqlalchemy.orm import with_parent
from sqlalchemy.testing import assert_raises
+from sqlalchemy.testing import assert_warns
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
@@ -369,7 +370,7 @@ class LazyTest(_fixtures.FixtureTest):
self.mapper_registry.map_imperatively(Order, orders)
s = fixture_session()
u1 = s.query(User).filter(User.id == 7).one()
- assert_raises(sa.exc.SAWarning, getattr, u1, "order")
+ assert_warns(sa.exc.SAWarning, getattr, u1, "order")
def test_callable_bind(self):
Address, addresses, users, User = (
diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py
index fc7406b81..de211cf63 100644
--- a/test/orm/test_mapper.py
+++ b/test/orm/test_mapper.py
@@ -31,6 +31,7 @@ from sqlalchemy.orm import synonym
from sqlalchemy.orm.persistence import _sort_states
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
from sqlalchemy.testing import expect_raises_message
@@ -818,7 +819,7 @@ class MapperTest(_fixtures.FixtureTest, AssertsCompiledSQL):
)
self.mapper(Address, addresses)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
"Property User.addresses on Mapper|User|users being replaced "
"with new property User.addresses; the old property will "
@@ -1001,7 +1002,7 @@ class MapperTest(_fixtures.FixtureTest, AssertsCompiledSQL):
polymorphic_on=users.c.name,
polymorphic_identity="user",
)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
"Reassigning polymorphic association for identity 'user'",
self.mapper_registry.map_imperatively,
diff --git a/test/orm/test_query.py b/test/orm/test_query.py
index a53c90ed4..e7fdf661a 100644
--- a/test/orm/test_query.py
+++ b/test/orm/test_query.py
@@ -73,6 +73,7 @@ from sqlalchemy.testing import is_true
from sqlalchemy.testing import mock
from sqlalchemy.testing.assertions import assert_raises
from sqlalchemy.testing.assertions import assert_raises_message
+from sqlalchemy.testing.assertions import assert_warns_message
from sqlalchemy.testing.assertions import eq_
from sqlalchemy.testing.assertions import expect_raises
from sqlalchemy.testing.assertions import expect_warnings
@@ -1315,7 +1316,7 @@ class GetTest(QueryTest):
User = self.classes.User
s = fixture_session()
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
r"fully NULL primary key identity cannot load any object. "
"This condition may raise an error in a future release.",
@@ -1329,7 +1330,7 @@ class GetTest(QueryTest):
s = fixture_session()
- assert_raises_message(
+ assert_warns_message(
sa_exc.SAWarning,
r"fully NULL primary key identity cannot load any object. "
"This condition may raise an error in a future release.",
diff --git a/test/orm/test_rel_fn.py b/test/orm/test_rel_fn.py
index ea292a43e..f5da7aa81 100644
--- a/test/orm/test_rel_fn.py
+++ b/test/orm/test_rel_fn.py
@@ -17,11 +17,13 @@ from sqlalchemy.orm import remote
from sqlalchemy.orm.interfaces import MANYTOONE
from sqlalchemy.orm.interfaces import ONETOMANY
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
from sqlalchemy.testing import mock
+from sqlalchemy.testing.assertions import expect_raises_message
class _JoinFixtures:
@@ -573,7 +575,7 @@ class _JoinFixtures:
)
def _assert_non_simple_warning(self, fn):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
"Non-simple column elements in "
"primary join condition for property "
@@ -818,9 +820,12 @@ class ColumnCollectionsTest(
self._join_fixture_o2m_composite_selfref_func_remote_side()
def test_determine_local_remote_pairs_o2m_overlap_func_warning(self):
- self._assert_non_simple_warning(
- self._join_fixture_m2o_sub_to_joined_sub_func
- )
+ with expect_raises_message(
+ exc.ArgumentError, "Could not locate any relevant"
+ ):
+ self._assert_non_simple_warning(
+ self._join_fixture_m2o_sub_to_joined_sub_func
+ )
def test_determine_local_remote_pairs_o2m_composite_selfref_func_annotated(
self,
diff --git a/test/orm/test_relationships.py b/test/orm/test_relationships.py
index f91e7e8d5..fd192ab51 100644
--- a/test/orm/test_relationships.py
+++ b/test/orm/test_relationships.py
@@ -33,13 +33,14 @@ from sqlalchemy.orm.interfaces import MANYTOONE
from sqlalchemy.orm.interfaces import ONETOMANY
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
+from sqlalchemy.testing import expect_raises_message
+from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import in_
from sqlalchemy.testing import is_
-from sqlalchemy.testing.assertions import expect_raises_message
-from sqlalchemy.testing.assertions import expect_warnings
from sqlalchemy.testing.assertsql import assert_engine
from sqlalchemy.testing.assertsql import CompiledSQL
from sqlalchemy.testing.fixtures import fixture_session
@@ -873,7 +874,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_simple_warn(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship '(?:Child.parent|Parent.children)' will copy "
r"column parent.id to column child.parent_id, which conflicts "
@@ -964,7 +965,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_double_rel_same_mapper_warns(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship 'Parent.child[12]' will copy column parent.id to "
r"column child.parent_id, which conflicts with relationship\(s\): "
@@ -984,7 +985,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_warn_one(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship '(?:BSub1.a|BSub2.a_member|B.a)' will copy column "
r"(?:a.id|a_member.a_id) to column b.a_id",
@@ -995,7 +996,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_warn_two(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship '(?:BSub1.a|B.a_member)' will copy column "
r"(?:a.id|a_member.a_id) to column b.a_id",
@@ -1006,7 +1007,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_warn_three(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship '(?:BSub1.a|B.a_member|B.a)' will copy column "
r"(?:a.id|a_member.a_id) to column b.a_id",
@@ -1018,7 +1019,7 @@ class OverlappingFksSiblingTest(fixtures.MappedTest):
@testing.provide_metadata
def test_warn_four(self):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship '(?:B.a|BSub2.a_member|B.a)' will copy column "
r"(?:a.id|a_member.a_id) to column b.a_id",
@@ -1302,7 +1303,7 @@ class CompositeSelfRefFKTest(fixtures.MappedTest, AssertsCompiledSQL):
},
)
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"relationship .* will copy column .* to column "
r"employee_t.company_id, which conflicts with relationship\(s\)",
diff --git a/test/orm/test_scoping.py b/test/orm/test_scoping.py
index 9b255bf5e..f2d7d8569 100644
--- a/test/orm/test_scoping.py
+++ b/test/orm/test_scoping.py
@@ -11,6 +11,7 @@ from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import Session
from sqlalchemy.orm import sessionmaker
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
@@ -102,7 +103,7 @@ class ScopedSessionTest(fixtures.MappedTest):
bind=testing.db,
)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
"At least one scoped session is already present. ",
Session.configure,
diff --git a/test/orm/test_selectin_relations.py b/test/orm/test_selectin_relations.py
index 1daf7b053..0458d616e 100644
--- a/test/orm/test_selectin_relations.py
+++ b/test/orm/test_selectin_relations.py
@@ -18,8 +18,8 @@ from sqlalchemy.orm import Session
from sqlalchemy.orm import subqueryload
from sqlalchemy.orm import undefer
from sqlalchemy.orm import with_polymorphic
-from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
@@ -1458,7 +1458,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
)
self.mapper_registry.map_imperatively(Order, orders)
s = fixture_session()
- assert_raises(
+ assert_warns(
sa.exc.SAWarning,
s.query(User).options(selectinload(User.order)).all,
)
diff --git a/test/orm/test_session.py b/test/orm/test_session.py
index a53756d63..d146612a5 100644
--- a/test/orm/test_session.py
+++ b/test/orm/test_session.py
@@ -25,6 +25,7 @@ from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import was_deleted
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import assertions
from sqlalchemy.testing import config
from sqlalchemy.testing import engines
@@ -1062,7 +1063,7 @@ class SessionStateTest(_fixtures.FixtureTest):
def test_extra_dirty_state_post_flush_warning(self):
s, a1, a2 = self._test_extra_dirty_state()
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning,
"Attribute history events accumulated on 1 previously "
"clean instances",
@@ -2309,7 +2310,8 @@ class FlushWarningsTest(fixtures.MappedTest):
def evt(mapper, conn, instance):
instance.addresses[0].user = User(name="u2")
- self._test(evt, "related attribute set")
+ with expect_raises_message(orm_exc.FlushError, ".*Over 100"):
+ self._test(evt, "related attribute set")
def test_m2o_cascade_remove(self):
def evt(mapper, conn, instance):
@@ -2340,7 +2342,10 @@ class FlushWarningsTest(fixtures.MappedTest):
def evt(mapper, conn, instance):
object_session(instance).delete(Address(email="x1"))
- self._test(evt, r"Session.delete\(\)")
+ with expect_raises_message(
+ sa.exc.InvalidRequestError, ".*is not persisted"
+ ):
+ self._test(evt, r"Session.delete\(\)")
def _test(self, fn, method):
User = self.classes.User
@@ -2351,6 +2356,6 @@ class FlushWarningsTest(fixtures.MappedTest):
u1 = User(name="u1", addresses=[Address(name="a1")])
s.add(u1)
- assert_raises_message(
+ assert_warns_message(
sa.exc.SAWarning, "Usage of the '%s'" % method, s.commit
)
diff --git a/test/orm/test_subquery_relations.py b/test/orm/test_subquery_relations.py
index c48fe4588..6da0e9010 100644
--- a/test/orm/test_subquery_relations.py
+++ b/test/orm/test_subquery_relations.py
@@ -20,8 +20,8 @@ from sqlalchemy.orm import Session
from sqlalchemy.orm import subqueryload
from sqlalchemy.orm import undefer
from sqlalchemy.orm import with_polymorphic
-from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns
from sqlalchemy.testing import eq_
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
@@ -1510,7 +1510,7 @@ class EagerTest(_fixtures.FixtureTest, testing.AssertsCompiledSQL):
)
self.mapper_registry.map_imperatively(Order, orders)
s = fixture_session()
- assert_raises(
+ assert_warns(
sa.exc.SAWarning,
s.query(User).options(subqueryload(User.order)).all,
)
diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py
index c93cc2edf..7f4c04652 100644
--- a/test/orm/test_unitofworkv2.py
+++ b/test/orm/test_unitofworkv2.py
@@ -28,6 +28,7 @@ from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
from sqlalchemy.orm import unitofwork
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import config
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
@@ -1920,7 +1921,7 @@ class BasicStaleChecksTest(fixtures.MappedTest):
sess.delete(p1)
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"DELETE statement on table 'parent' expected to "
r"delete 1 row\(s\); 0 were matched.",
@@ -1940,7 +1941,7 @@ class BasicStaleChecksTest(fixtures.MappedTest):
sess.delete(p1)
sess.delete(p2)
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"DELETE statement on table 'parent' expected to "
r"delete 2 row\(s\); 0 were matched.",
@@ -2005,7 +2006,7 @@ class BasicStaleChecksTest(fixtures.MappedTest):
with patch.object(
config.db.dialect, "supports_sane_multi_rowcount", False
):
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
r"DELETE statement on table 'parent' expected to "
r"delete 1 row\(s\); 0 were matched.",
diff --git a/test/orm/test_versioning.py b/test/orm/test_versioning.py
index b5955e4a6..9f23073d4 100644
--- a/test/orm/test_versioning.py
+++ b/test/orm/test_versioning.py
@@ -21,6 +21,8 @@ from sqlalchemy.orm import relationship
from sqlalchemy.orm import Session
from sqlalchemy.testing import assert_raises
from sqlalchemy.testing import assert_raises_message
+from sqlalchemy.testing import assert_warns
+from sqlalchemy.testing import assert_warns_message
from sqlalchemy.testing import config
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
@@ -193,7 +195,7 @@ class VersioningTest(fixtures.MappedTest):
s1.commit()
f1.value = "f1rev2"
- assert_raises(sa.exc.SAWarning, s1.commit)
+ assert_warns(sa.exc.SAWarning, s1.commit)
finally:
testing.db.dialect.supports_sane_rowcount = save
@@ -1328,7 +1330,7 @@ class InheritanceTwoVersionIdsTest(fixtures.MappedTest):
Base, base, version_id_col=base.c.version_id
)
- assert_raises_message(
+ assert_warns_message(
exc.SAWarning,
"Inheriting version_id_col 'version_id' does not "
"match inherited version_id_col 'version_id' and will not "
diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py
index 8a9c868be..e02f0e2ed 100644
--- a/test/sql/test_metadata.py
+++ b/test/sql/test_metadata.py
@@ -53,6 +53,7 @@ from sqlalchemy.testing import is_
from sqlalchemy.testing import is_false
from sqlalchemy.testing import is_true
from sqlalchemy.testing import mock
+from sqlalchemy.testing.assertions import expect_warnings
class MetaDataTest(fixtures.TestBase, ComparesTables):
@@ -1822,32 +1823,35 @@ class TableTest(fixtures.TestBase, AssertsCompiledSQL):
def test_pk_col_mismatch_one(self):
m = MetaData()
- assert_raises_message(
- exc.SAWarning,
+
+ with expect_warnings(
"Table 't' specifies columns 'x' as primary_key=True, "
- "not matching locally specified columns 'q'",
- Table,
- "t",
- m,
- Column("x", Integer, primary_key=True),
- Column("q", Integer),
- PrimaryKeyConstraint("q"),
- )
+ "not matching locally specified columns 'q'"
+ ):
+ Table(
+ "t",
+ m,
+ Column("x", Integer, primary_key=True),
+ Column("q", Integer),
+ PrimaryKeyConstraint("q"),
+ )
def test_pk_col_mismatch_two(self):
m = MetaData()
- assert_raises_message(
- exc.SAWarning,
+
+ with expect_warnings(
"Table 't' specifies columns 'a', 'b', 'c' as primary_key=True, "
- "not matching locally specified columns 'b', 'c'",
- Table,
- "t",
- m,
- Column("a", Integer, primary_key=True),
- Column("b", Integer, primary_key=True),
- Column("c", Integer, primary_key=True),
- PrimaryKeyConstraint("b", "c"),
- )
+ "not matching locally specified columns 'b', 'c'"
+ ):
+
+ Table(
+ "t",
+ m,
+ Column("a", Integer, primary_key=True),
+ Column("b", Integer, primary_key=True),
+ Column("c", Integer, primary_key=True),
+ PrimaryKeyConstraint("b", "c"),
+ )
@testing.emits_warning("Table 't'")
def test_pk_col_mismatch_three(self):
diff --git a/test/sql/test_operators.py b/test/sql/test_operators.py
index e72ab6ac9..e5176713a 100644
--- a/test/sql/test_operators.py
+++ b/test/sql/test_operators.py
@@ -60,6 +60,7 @@ from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import is_
from sqlalchemy.testing import is_not
+from sqlalchemy.testing.assertions import expect_deprecated
from sqlalchemy.types import ARRAY
from sqlalchemy.types import Boolean
from sqlalchemy.types import Concatenable
@@ -1221,15 +1222,14 @@ class ConjunctionTest(fixtures.TestBase, testing.AssertsCompiledSQL):
# these warning classes will change to ArgumentError when the
# deprecated behavior is disabled
- assert_raises_message(
- exc.SADeprecationWarning,
+ with expect_deprecated(
r"Invoking %(str_op)s\(\) without arguments is deprecated, and "
r"will be disallowed in a future release. For an empty "
r"%(str_op)s\(\) construct, use "
r"%(str_op)s\(%(str_continue)s, \*args\)\."
- % {"str_op": str_op, "str_continue": str_continue},
- op,
- )
+ % {"str_op": str_op, "str_continue": str_continue}
+ ):
+ op()
def test_empty_and_raw(self):
self.assert_compile(