Commit e1b6f97d authored by R David Murray's avatar R David Murray

#20145: assert[Raises|Warns]Regex now raise TypeError on bad regex.

Previously a non-string, non-regex second argument could cause the test
to always pass.

Initial patch by Kamilla Holanda.
parent 91e7f04f
...@@ -192,3 +192,9 @@ that may require changes to your code. ...@@ -192,3 +192,9 @@ that may require changes to your code.
if it represented midnight in UTC. This behavior was considered obscure and if it represented midnight in UTC. This behavior was considered obscure and
error-prone and has been removed in Python 3.5. See :issue:`13936` for full error-prone and has been removed in Python 3.5. See :issue:`13936` for full
details. details.
* :meth:`unittest.TestCase.assertRaisesRegex` and
:meth:`~unittest.TestCase.assertWarnsRegex` now raise a :exc:`TypeError` if
the second argument is not a string or a compiled :mod:`regex`. You may have
tests with an invalid second argument that have until 3.5 been falsely
passing which will now raise TypeErrors (:issue:`20145`).
...@@ -143,7 +143,7 @@ class _AssertRaisesBaseContext(_BaseTestCaseContext): ...@@ -143,7 +143,7 @@ class _AssertRaisesBaseContext(_BaseTestCaseContext):
self.obj_name = str(callable_obj) self.obj_name = str(callable_obj)
else: else:
self.obj_name = None self.obj_name = None
if isinstance(expected_regex, (bytes, str)): if expected_regex is not None:
expected_regex = re.compile(expected_regex) expected_regex = re.compile(expected_regex)
self.expected_regex = expected_regex self.expected_regex = expected_regex
self.msg = None self.msg = None
......
...@@ -1126,6 +1126,18 @@ test case ...@@ -1126,6 +1126,18 @@ test case
self.assertRaisesRegex, Exception, 'x', self.assertRaisesRegex, Exception, 'x',
lambda: None) lambda: None)
def testAssertRaisesRegexInvalidRegex(self):
# Issue 20145.
class MyExc(Exception):
pass
self.assertRaises(TypeError, self.assertRaisesRegex, MyExc, lambda: True)
def testAssertWarnsRegexInvalidRegex(self):
# Issue 20145.
class MyWarn(Warning):
pass
self.assertRaises(TypeError, self.assertWarnsRegex, MyWarn, lambda: True)
def testAssertRaisesRegexMismatch(self): def testAssertRaisesRegexMismatch(self):
def Stub(): def Stub():
raise Exception('Unexpected') raise Exception('Unexpected')
......
...@@ -546,6 +546,7 @@ Stefan Hoffmeister ...@@ -546,6 +546,7 @@ Stefan Hoffmeister
Albert Hofkamp Albert Hofkamp
Tomas Hoger Tomas Hoger
Jonathan Hogg Jonathan Hogg
Kamilla Holanda
Steve Holden Steve Holden
Akintayo Holder Akintayo Holder
Thomas Holenstein Thomas Holenstein
......
...@@ -23,6 +23,9 @@ Core and Builtins ...@@ -23,6 +23,9 @@ Core and Builtins
Library Library
------- -------
- Issue #20145: `assertRaisesRegex` and `assertWarnsRegex` now raise a
TypeError if the second argument is not a string or compiled regex.
- Issue #20633: Replace relative import by absolute import. - Issue #20633: Replace relative import by absolute import.
- Issue #20980: Stop wrapping exception when using ThreadPool. - Issue #20980: Stop wrapping exception when using ThreadPool.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment