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