/
test_decorated_controller.py
194 lines (149 loc) · 6.55 KB
/
test_decorated_controller.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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# -*- coding: utf-8 -*-
from nose.tools import raises
import os, tg
from tests.test_stack import TestConfig, app_from_config
from tg.decorators import Decoration
from tg.configuration import milestones
from nose.tools import eq_
from nose import SkipTest
from tg._compat import PY3, u_
from tg.util import Bunch
class TestHooks(object):
def setUp(self):
milestones._reset_all()
def test_hooks_syswide(self):
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
def hook(*args, **kw):
tg.tmpl_context.echo = 'WORKED'
base_config.register_hook('before_call', hook)
app = app_from_config(base_config, reset_milestones=False)
ans = app.get('/echo')
assert 'WORKED' in ans
def test_decoration_run_hooks_backward_compatibility(self):
# TODO: Remove test when Decoration.run_hooks gets removed
def func(*args, **kw):
pass
def hook(*args, **kw):
hook.did_run = True
hook.did_run = False
milestones.renderers_ready.reach()
tg.hooks.register('before_call', hook, controller=func)
deco = Decoration.get_decoration(func)
deco.run_hooks(Bunch(config=None), 'before_call')
assert hook.did_run is True
class TestExpose(object):
def setUp(self):
milestones.renderers_ready._reset()
def tearDown(self):
milestones.renderers_ready._reset()
def test_unregisterd_renderers_detection(self):
#If no renderers are available we should just issue a warning
#and avoid crashing. Simply bypass rendering availability check.
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
app = app_from_config(base_config)
old_renderers = tg.config['renderers']
tg.config['renderers'] = []
@tg.expose('mako:nonexisting')
def func(*args, **kw):
pass
tg.config['renderers'] = old_renderers
def test_use_default_renderer(self):
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
app = app_from_config(base_config)
exposition = tg.expose('nonexisting')
exposition._resolve_options()
assert exposition.engine == tg.config['default_renderer']
assert exposition.template == 'nonexisting'
def test_expose_without_function_does_nothing(self):
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
app = app_from_config(base_config)
exposition = tg.expose('nonexisting')
exposition._apply()
assert exposition._func is None
assert exposition.engine is None
def test_expose_idempotent(self):
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
app = app_from_config(base_config)
exposition = tg.expose('nonexisting')
@exposition
@exposition
def func(*args, **kw):
pass
milestones.renderers_ready.reach()
deco = Decoration.get_decoration(func)
assert len(deco.engines) == 1, deco.engines
class TestDecorators(object):
def setup(self):
base_config = TestConfig(folder = 'dispatch',
values = {'use_sqlalchemy': False,
'use_toscawidgets': False,
'use_toscawidgets2': False,
'ignore_parameters': ["ignore", "ignore_me"]
})
self.app = app_from_config(base_config)
def test_variabledecode_fail(self):
resp = self.app.get('/test_vardec', params={'test-1': '1',
'test-2': 2,
'test--repetitions': 'hi'})
assert resp.json['test-1'] == '1', resp.json
assert resp.json['test--repetitions'] == 'hi', resp.json
assert 'test' not in resp.json, resp.json
def test_variabledecode_partial_fail(self):
resp = self.app.get('/test_vardec', params={'test-1': '1',
'test-2': 2,
'test-': 4})
assert resp.json['test-1'] == '1'
assert resp.json['test-'] == '4'
assert len(resp.json['test']) == 2
def test_variable_decode(self):
from formencode.variabledecode import variable_encode
obj = dict(a=['1','2','3'], b=dict(c=[dict(d='1')]))
params = variable_encode(dict(obj=obj), add_repetitions=False)
resp = self.app.get('/test_vardec', params=params)
assert resp.json['obj'] == obj, (resp.json['obj'], obj)
def test_without_trailing_slash(self):
resp = self.app.get('/without_tslash/', status=301)
assert resp.headers['Location'].endswith('/without_tslash')
def test_with_trailing_slash(self):
resp = self.app.get('/with_tslash', status=301)
assert resp.headers['Location'].endswith('/with_tslash/')
def test_with_engine(self):
resp = self.app.get('/onmaster')
assert 'mainslave' in resp
def test_with_engine_nopop(self):
resp = self.app.get('/onmaster?second=1')
assert 'master' in resp
assert 'second' in resp
def test_with_engine_pop(self):
resp = self.app.get('/onmaster?first=1')
assert 'master' in resp
assert 'first' not in resp
def test_with_engine_using_list(self):
resp = self.app.get('/onmaster_withlist?first=1')
assert 'master' in resp
assert 'first' not in resp