/
testing.py
130 lines (105 loc) · 3.83 KB
/
testing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# -*- coding: utf-8 -*-
import unittest
import six
from six.moves import http_cookies
from six.moves.urllib.parse import urlencode
from gunstar.http import Request
from gunstar.signals import template_rendered_signal
class Client(object):
def __init__(self, app):
self.app = app
self.cookies = {}
self.template = None
self.context = None
template_rendered_signal.connect(self.receive_template_rendered_signal)
def get(self, path, data=None, headers=None):
return self.get_request(path, data=data, headers=headers)
def post(self, path, data=None, headers=None,
content_type='application/x-www-form-urlencoded'):
return self.post_request(
path, data=data, headers=headers,
content_type=content_type, method='POST'
)
def put(self, path, data=None, headers=None,
content_type='application/octet-stream'):
return self.post_request(
path, data=data, headers=headers,
content_type=content_type, method='PUT'
)
def delete(self, path, data=None, headers=None,
content_type='application/octet-stream'):
return self.post_request(
path, data=data, headers=headers,
content_type=content_type, method='DELETE'
)
def options(self, path, data=None, headers=None,
content_type='application/octet-stream'):
return self.post_request(
path, data=data, headers=headers,
content_type=content_type, method='OPTIONS'
)
def head(self, path, data=None, headers=None):
return self.get_request(
path, data=data, headers=headers, method='HEAD'
)
def get_request(self, path, data=None, headers=None, method='GET'):
if data is None:
data = {}
if headers is None:
headers = {}
if data:
path = path + '?' + urlencode(data)
req = Request.blank(path)
req.method = method
req.headers.update(headers)
self.load_cookies(req)
resp = req.get_response(self.app)
self.store_cookies(resp)
resp.request_started = req
resp.template = self.template
resp.context = self.context
self.template = self.context = None
return resp
def post_request(self, path, data=None, headers=None, content_type='',
method='POST'):
if data is None:
data = {}
if headers is None:
headers = {}
req = Request.blank(path)
req.content_type = content_type
req.method = method
req.body = six.b(urlencode(data))
req.headers.update(headers)
self.load_cookies(req)
resp = req.get_response(self.app)
self.store_cookies(resp)
resp.request_started = req
resp.template = self.template
resp.context = self.context
self.template = self.context = None
return resp
def store_cookies(self, resp):
cookies = http_cookies.SimpleCookie()
try:
cookies.load(resp.headers['Set-Cookie'])
for key in cookies:
self.cookies[key] = cookies[key].value
except:
pass
def load_cookies(self, req):
for key in self.cookies:
req.cookies[key] = self.cookies[key]
def receive_template_rendered_signal(self, app, handler, template,
context):
self.template = template
self.context = context
class TestCase(unittest.TestCase):
def get_app(self):
raise NotImplementedError()
def _pre_setup(self):
self.app = self.get_app()
self.client = Client(self.app)
def __call__(self, result=None):
self._pre_setup()
super(TestCase, self).__call__(result)