1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 01:03:24 +00:00

add private function to evaluate a matcher

A matcher can now return other results than a boolean :
- An AssertionError exception meaning that the matcher failed, with the exception we get the assertion failure message.
- None, in case we do an assert in the matcher, meaning that the assertion has passed, the matcher is considered as a success then.
- Boolean that indicates if a matcher failed or not. If there is no match, a boolean does not give any clue what it is the differences compared to the assertion.
This commit is contained in:
Arthur Hamon
2019-06-12 11:57:54 +02:00
parent de244a968f
commit 940dec1dd6
2 changed files with 53 additions and 12 deletions

View File

@@ -143,20 +143,44 @@ def test_query_matcher():
req2 = request.Request('GET', 'http://host.com/?c=d&a=b', '', {}) req2 = request.Request('GET', 'http://host.com/?c=d&a=b', '', {})
assert matchers.query(req1, req2) assert matchers.query(req1, req2)
req1 = request.Request('GET', 'http://host.com/?a=b&a=b&c=d', '', {}) def test_evaluate_matcher_does_match():
req2 = request.Request('GET', 'http://host.com/?a=b&c=d&a=b', '', {}) def bool_matcher(r1, r2):
req3 = request.Request('GET', 'http://host.com/?c=d&a=b&a=b', '', {}) return True
assert matchers.query(req1, req2)
assert matchers.query(req1, req3) def assertion_matcher(r1, r2):
assert 1 == 1
r1, r2 = None, None
for matcher in [bool_matcher, assertion_matcher]:
match, assertion_msg = matchers._evaluate_matcher(matcher, r1, r2)
assert match is True
assert assertion_msg is None
def test_metchers(): def test_evaluate_matcher_does_not_match():
assert_matcher('method') def bool_matcher(r1, r2):
assert_matcher('scheme') return False
assert_matcher('host')
assert_matcher('port') def assertion_matcher(r1, r2):
assert_matcher('path') # This is like the "assert" statement preventing pytest to recompile it
assert_matcher('query') raise AssertionError()
r1, r2 = None, None
for matcher in [bool_matcher, assertion_matcher]:
match, assertion_msg = matchers._evaluate_matcher(matcher, r1, r2)
assert match is False
assert not assertion_msg
def test_evaluate_matcher_does_not_match_with_assert_message():
def assertion_matcher(r1, r2):
# This is like the "assert" statement preventing pytest to recompile it
raise AssertionError("Failing matcher")
r1, r2 = None, None
match, assertion_msg = matchers._evaluate_matcher(assertion_matcher, r1, r2)
assert match is False
assert assertion_msg == "Failing matcher"
def test_get_assertion_message(): def test_get_assertion_message():

View File

@@ -101,6 +101,23 @@ def requests_match(r1, r2, matchers):
return all(m[0] for m in matches) return all(m[0] for m in matches)
def _evaluate_matcher(matcher_function, *args):
"""
Evaluate the result of a given matcher as a boolean with an assertion error message if any.
It handles two types of matcher :
- a matcher returning a boolean value.
- a matcher that only makes an assert, returning None or raises an assertion error.
"""
assertion_message = None
try:
match = matcher_function(*args)
match = True if match is None else match
except AssertionError as e:
match = False
assertion_message = str(e)
return match, assertion_message
def get_assertion_message(assertion_details, **format_options): def get_assertion_message(assertion_details, **format_options):
""" """
Get a detailed message about the failing matcher. Get a detailed message about the failing matcher.