Merge "Minor changes in docstrings"
[functest.git] / functest / utils / decorators.py
1 #!/usr/bin/env python
2
3 # pylint: disable=missing-docstring
4
5 import errno
6 import os
7 import urlparse
8
9 import mock
10 import requests.sessions
11
12
13 def can_dump_request_to_file(method):
14
15     def dump_preparedrequest(request, **kwargs):
16         # pylint: disable=unused-argument
17         parseresult = urlparse.urlparse(request.url)
18         if parseresult.scheme == "file":
19             try:
20                 dirname = os.path.dirname(parseresult.path)
21                 os.makedirs(dirname)
22             except OSError as ex:
23                 if ex.errno != errno.EEXIST:
24                     raise
25             with open(parseresult.path, 'a') as dumpfile:
26                 headers = ""
27                 for key in request.headers:
28                     headers += key + " " + request.headers[key] + "\n"
29                 message = "{} {}\n{}\n{}\n\n\n".format(
30                     request.method, request.url, headers, request.body)
31                 dumpfile.write(message)
32         return mock.Mock()
33
34     def patch_request(method, url, **kwargs):
35         with requests.sessions.Session() as session:
36             parseresult = urlparse.urlparse(url)
37             if parseresult.scheme == "file":
38                 with mock.patch.object(session, 'send',
39                                        side_effect=dump_preparedrequest):
40                     return session.request(method=method, url=url, **kwargs)
41             else:
42                 return session.request(method=method, url=url, **kwargs)
43
44     def hook(*args, **kwargs):
45         with mock.patch('requests.api.request', side_effect=patch_request):
46             return method(*args, **kwargs)
47
48     return hook