summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing/assertions.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-02-19 12:01:48 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2015-02-19 12:01:48 -0500
commit140e8254a23c03f14d3f973e2ad3b197723007f8 (patch)
tree1a97071caf3e99c1fcd9a1b6674771348126eb3a /lib/sqlalchemy/testing/assertions.py
parent145db3bed7464e920cf2bb714cdf7672a1693eb3 (diff)
downloadsqlalchemy-140e8254a23c03f14d3f973e2ad3b197723007f8.tar.gz
- expect_warnings was not expecting and neither was assert_warnings
asserting.
Diffstat (limited to 'lib/sqlalchemy/testing/assertions.py')
-rw-r--r--lib/sqlalchemy/testing/assertions.py52
1 files changed, 40 insertions, 12 deletions
diff --git a/lib/sqlalchemy/testing/assertions.py b/lib/sqlalchemy/testing/assertions.py
index 635f6c539..91d0c6339 100644
--- a/lib/sqlalchemy/testing/assertions.py
+++ b/lib/sqlalchemy/testing/assertions.py
@@ -22,7 +22,7 @@ import contextlib
from . import mock
-def expect_warnings(*messages):
+def expect_warnings(*messages, **kw):
"""Context manager which expects one or more warnings.
With no arguments, squelches all SAWarnings emitted via
@@ -30,17 +30,21 @@ def expect_warnings(*messages):
pass string expressions that will match selected warnings via regex;
all non-matching warnings are sent through.
+ The expect version **asserts** that the warnings were in fact seen.
+
Note that the test suite sets SAWarning warnings to raise exceptions.
"""
- return _expect_warnings(sa_exc.SAWarning, messages)
+ return _expect_warnings(sa_exc.SAWarning, messages, **kw)
@contextlib.contextmanager
-def expect_warnings_on(db, *messages):
+def expect_warnings_on(db, *messages, **kw):
"""Context manager which expects one or more warnings on specific
dialects.
+ The expect version **asserts** that the warnings were in fact seen.
+
"""
spec = db_spec(db)
@@ -49,23 +53,28 @@ def expect_warnings_on(db, *messages):
elif not _is_excluded(*db):
yield
else:
- with expect_warnings(*messages):
+ with expect_warnings(*messages, **kw):
yield
def emits_warning(*messages):
- """Decorator form of expect_warnings()."""
+ """Decorator form of expect_warnings().
+
+ Note that emits_warning does **not** assert that the warnings
+ were in fact seen.
+
+ """
@decorator
def decorate(fn, *args, **kw):
- with expect_warnings(*messages):
+ with expect_warnings(assert_=False, *messages):
return fn(*args, **kw)
return decorate
-def expect_deprecated(*messages):
- return _expect_warnings(sa_exc.SADeprecationWarning, messages)
+def expect_deprecated(*messages, **kw):
+ return _expect_warnings(sa_exc.SADeprecationWarning, messages, **kw)
def emits_warning_on(db, *messages):
@@ -74,6 +83,10 @@ def emits_warning_on(db, *messages):
With no arguments, squelches all SAWarning failures. Or pass one or more
strings; these will be matched to the root of the warning description by
warnings.filterwarnings().
+
+ Note that emits_warning_on does **not** assert that the warnings
+ were in fact seen.
+
"""
@decorator
def decorate(fn, *args, **kw):
@@ -93,19 +106,28 @@ def uses_deprecated(*messages):
As a special case, you may pass a function name prefixed with //
and it will be re-written as needed to match the standard warning
verbiage emitted by the sqlalchemy.util.deprecated decorator.
+
+ Note that uses_deprecated does **not** assert that the warnings
+ were in fact seen.
+
"""
@decorator
def decorate(fn, *args, **kw):
- with expect_deprecated(*messages):
+ with expect_deprecated(*messages, assert_=False):
return fn(*args, **kw)
return decorate
@contextlib.contextmanager
-def _expect_warnings(exc_cls, messages):
+def _expect_warnings(exc_cls, messages, regex=True, assert_=True):
- filters = [re.compile(msg, re.I) for msg in messages]
+ if regex:
+ filters = [re.compile(msg, re.I) for msg in messages]
+ else:
+ filters = messages
+
+ seen = set(filters)
real_warn = warnings.warn
@@ -117,7 +139,9 @@ def _expect_warnings(exc_cls, messages):
return
for filter_ in filters:
- if filter_.match(msg):
+ if (regex and filter_.match(msg)) or \
+ (not regex and filter_ == msg):
+ seen.discard(filter_)
break
else:
real_warn(msg, exception, *arg, **kw)
@@ -125,6 +149,10 @@ def _expect_warnings(exc_cls, messages):
with mock.patch("warnings.warn", our_warn):
yield
+ if assert_:
+ assert not seen, "Warnings were not seen: %s" % \
+ ", ".join("%r" % (s.pattern if regex else s) for s in seen)
+
def global_cleanup_assertions():
"""Check things that have to be finalized at the end of a test suite.