
If you set up requests_mock to catch all requests (which I would recommend) you sometimes get caught with things like file:// paths that should be allowed to reach the filesystem. To do this we should allow you to add a matcher that says a specific route can bypass the catch all and do a real request. This is a bit of a layer violation but I thought it was easy to start with, then realized why it wasn't. Change-Id: Ic2516f78413b88a489c8d6bd2bc39b8ebb5bf273 Closes-Bug: #1501665
225 lines
8.9 KiB
Python
225 lines
8.9 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import re
|
|
|
|
from requests_mock import adapter
|
|
from requests_mock.tests import base
|
|
|
|
ANY = adapter.ANY
|
|
|
|
|
|
class TestMatcher(base.TestCase):
|
|
|
|
def match(self,
|
|
target,
|
|
url,
|
|
matcher_method='GET',
|
|
request_method='GET',
|
|
complete_qs=False,
|
|
headers=None,
|
|
request_headers={},
|
|
real_http=False):
|
|
matcher = adapter._Matcher(matcher_method,
|
|
target,
|
|
[],
|
|
complete_qs,
|
|
request_headers,
|
|
real_http=real_http)
|
|
request = adapter._RequestObjectProxy._create(request_method,
|
|
url,
|
|
headers)
|
|
return matcher._match(request)
|
|
|
|
def assertMatch(self,
|
|
target,
|
|
url,
|
|
matcher_method='GET',
|
|
request_method='GET',
|
|
**kwargs):
|
|
self.assertEqual(True,
|
|
self.match(target,
|
|
url,
|
|
matcher_method=matcher_method,
|
|
request_method=request_method,
|
|
**kwargs),
|
|
'Matcher %s %s failed to match %s %s' %
|
|
(matcher_method, target, request_method, url))
|
|
|
|
def assertMatchBoth(self,
|
|
target,
|
|
url,
|
|
matcher_method='GET',
|
|
request_method='GET',
|
|
**kwargs):
|
|
self.assertMatch(target,
|
|
url,
|
|
matcher_method=matcher_method,
|
|
request_method=request_method,
|
|
**kwargs)
|
|
self.assertMatch(url,
|
|
target,
|
|
matcher_method=request_method,
|
|
request_method=matcher_method,
|
|
**kwargs)
|
|
|
|
def assertNoMatch(self,
|
|
target,
|
|
url,
|
|
matcher_method='GET',
|
|
request_method='GET',
|
|
**kwargs):
|
|
self.assertEqual(False,
|
|
self.match(target,
|
|
url,
|
|
matcher_method=matcher_method,
|
|
request_method=request_method,
|
|
**kwargs),
|
|
'Matcher %s %s unexpectedly matched %s %s' %
|
|
(matcher_method, target, request_method, url))
|
|
|
|
def assertNoMatchBoth(self,
|
|
target,
|
|
url,
|
|
matcher_method='GET',
|
|
request_method='GET',
|
|
**kwargs):
|
|
self.assertNoMatch(target,
|
|
url,
|
|
matcher_method=matcher_method,
|
|
request_method=request_method,
|
|
**kwargs)
|
|
self.assertNoMatch(url,
|
|
target,
|
|
matcher_method=request_method,
|
|
request_method=matcher_method,
|
|
**kwargs)
|
|
|
|
def assertMatchMethodBoth(self, matcher_method, request_method, **kwargs):
|
|
url = 'http://www.test.com'
|
|
|
|
self.assertMatchBoth(url,
|
|
url,
|
|
request_method=request_method,
|
|
matcher_method=matcher_method,
|
|
**kwargs)
|
|
|
|
def assertNoMatchMethodBoth(self,
|
|
matcher_method,
|
|
request_method,
|
|
**kwargs):
|
|
url = 'http://www.test.com'
|
|
|
|
self.assertNoMatchBoth(url,
|
|
url,
|
|
request_method=request_method,
|
|
matcher_method=matcher_method,
|
|
**kwargs)
|
|
|
|
def test_url_matching(self):
|
|
self.assertMatchBoth('http://www.test.com',
|
|
'http://www.test.com')
|
|
self.assertMatchBoth('http://www.test.com',
|
|
'http://www.test.com/')
|
|
self.assertMatchBoth('http://www.test.com/abc',
|
|
'http://www.test.com/abc')
|
|
self.assertMatchBoth('http://www.test.com:5000/abc',
|
|
'http://www.test.com:5000/abc')
|
|
|
|
self.assertNoMatchBoth('https://www.test.com',
|
|
'http://www.test.com')
|
|
self.assertNoMatchBoth('http://www.test.com/abc',
|
|
'http://www.test.com')
|
|
self.assertNoMatchBoth('http://test.com',
|
|
'http://www.test.com')
|
|
self.assertNoMatchBoth('http://test.com',
|
|
'http://www.test.com')
|
|
self.assertNoMatchBoth('http://test.com/abc',
|
|
'http://www.test.com/abc/')
|
|
self.assertNoMatchBoth('http://test.com/abc/',
|
|
'http://www.test.com/abc')
|
|
self.assertNoMatchBoth('http://test.com:5000/abc/',
|
|
'http://www.test.com/abc')
|
|
self.assertNoMatchBoth('http://test.com/abc/',
|
|
'http://www.test.com:5000/abc')
|
|
|
|
def test_subset_match(self):
|
|
self.assertMatch('/path', 'http://www.test.com/path')
|
|
self.assertMatch('/path', 'http://www.test.com/path')
|
|
self.assertMatch('//www.test.com/path', 'http://www.test.com/path')
|
|
self.assertMatch('//www.test.com/path', 'https://www.test.com/path')
|
|
|
|
def test_query_string(self):
|
|
self.assertMatch('/path?a=1&b=2',
|
|
'http://www.test.com/path?a=1&b=2')
|
|
self.assertMatch('/path?a=1',
|
|
'http://www.test.com/path?a=1&b=2',
|
|
complete_qs=False)
|
|
self.assertNoMatch('/path?a=1',
|
|
'http://www.test.com/path?a=1&b=2',
|
|
complete_qs=True)
|
|
self.assertNoMatch('/path?a=1&b=2',
|
|
'http://www.test.com/path?a=1')
|
|
|
|
def test_method_match(self):
|
|
self.assertNoMatchMethodBoth('GET', 'POST')
|
|
self.assertMatchMethodBoth('GET', 'get')
|
|
self.assertMatchMethodBoth('GeT', 'geT')
|
|
|
|
def test_match_ANY_url(self):
|
|
self.assertMatch(ANY, 'http://anything')
|
|
self.assertMatch(ANY, 'http://somethingelse')
|
|
self.assertNoMatch(ANY, 'http://somethingelse', request_method='POST')
|
|
|
|
def test_match_ANY_method(self):
|
|
for m in ('GET', 'POST', 'HEAD', 'OPTION'):
|
|
self.assertMatch('http://www.test.com',
|
|
'http://www.test.com',
|
|
matcher_method=ANY,
|
|
request_method=m)
|
|
|
|
self.assertNoMatch('http://www.test.com',
|
|
'http://another',
|
|
matcher_method=ANY)
|
|
|
|
def test_match_with_regex(self):
|
|
r1 = re.compile('test.com/a')
|
|
r2 = re.compile('/b/c')
|
|
|
|
self.assertMatch(r1, 'http://mock.test.com/a/b')
|
|
self.assertMatch(r1, 'http://test.com/a/')
|
|
self.assertMatch(r1, 'mock://test.com/a/b')
|
|
self.assertNoMatch(r1, 'mock://test.com/')
|
|
|
|
self.assertMatch(r2, 'http://anything/a/b/c/d')
|
|
self.assertMatch(r2, 'mock://anything/a/b/c/d')
|
|
|
|
def test_match_with_headers(self):
|
|
self.assertMatch('/path',
|
|
'http://www.test.com/path',
|
|
headers={'A': 'abc', 'b': 'def'},
|
|
request_headers={'a': 'abc'})
|
|
|
|
self.assertMatch('/path',
|
|
'http://www.test.com/path',
|
|
headers={'A': 'abc', 'b': 'def'})
|
|
|
|
self.assertNoMatch('/path',
|
|
'http://www.test.com/path',
|
|
headers={'A': 'abc', 'b': 'def'},
|
|
request_headers={'b': 'abc'})
|
|
|
|
self.assertNoMatch('/path',
|
|
'http://www.test.com/path',
|
|
headers={'A': 'abc', 'b': 'def'},
|
|
request_headers={'c': 'ghi'})
|