##// END OF EJS Templates
tests: Fix tests for moved labs setting....
Martin Bornhold -
r371:47b7ed9f default
parent child Browse files
Show More
@@ -1,624 +1,655 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2016 RhodeCode GmbH
3 # Copyright (C) 2010-2016 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import mock
21 import mock
22 import pytest
22 import pytest
23
23
24 import rhodecode
24 import rhodecode
25 from rhodecode.config.routing import ADMIN_PREFIX
25 from rhodecode.config.routing import ADMIN_PREFIX
26 from rhodecode.lib.utils2 import md5
26 from rhodecode.lib.utils2 import md5
27 from rhodecode.model.db import RhodeCodeUi
27 from rhodecode.model.db import RhodeCodeUi
28 from rhodecode.model.meta import Session
28 from rhodecode.model.meta import Session
29 from rhodecode.model.settings import SettingsModel, IssueTrackerSettingsModel
29 from rhodecode.model.settings import SettingsModel, IssueTrackerSettingsModel
30 from rhodecode.tests import url, assert_session_flash
30 from rhodecode.tests import url, assert_session_flash
31 from rhodecode.tests.utils import AssertResponse
31 from rhodecode.tests.utils import AssertResponse
32
32
33
33
34 UPDATE_DATA_QUALNAME = (
34 UPDATE_DATA_QUALNAME = (
35 'rhodecode.controllers.admin.settings.SettingsController.get_update_data')
35 'rhodecode.controllers.admin.settings.SettingsController.get_update_data')
36
36
37
37
38 @pytest.mark.usefixtures('autologin_user', 'app')
38 @pytest.mark.usefixtures('autologin_user', 'app')
39 class TestAdminSettingsController:
39 class TestAdminSettingsController:
40
40
41 @pytest.mark.parametrize('urlname', [
41 @pytest.mark.parametrize('urlname', [
42 'admin_settings_vcs',
42 'admin_settings_vcs',
43 'admin_settings_mapping',
43 'admin_settings_mapping',
44 'admin_settings_global',
44 'admin_settings_global',
45 'admin_settings_visual',
45 'admin_settings_visual',
46 'admin_settings_email',
46 'admin_settings_email',
47 'admin_settings_hooks',
47 'admin_settings_hooks',
48 'admin_settings_search',
48 'admin_settings_search',
49 'admin_settings_system',
49 'admin_settings_system',
50 ])
50 ])
51 def test_simple_get(self, urlname, app):
51 def test_simple_get(self, urlname, app):
52 app.get(url(urlname))
52 app.get(url(urlname))
53
53
54 def test_create_custom_hook(self, csrf_token):
54 def test_create_custom_hook(self, csrf_token):
55 response = self.app.post(
55 response = self.app.post(
56 url('admin_settings_hooks'),
56 url('admin_settings_hooks'),
57 params={
57 params={
58 'new_hook_ui_key': 'test_hooks_1',
58 'new_hook_ui_key': 'test_hooks_1',
59 'new_hook_ui_value': 'cd /tmp',
59 'new_hook_ui_value': 'cd /tmp',
60 'csrf_token': csrf_token})
60 'csrf_token': csrf_token})
61
61
62 response = response.follow()
62 response = response.follow()
63 response.mustcontain('test_hooks_1')
63 response.mustcontain('test_hooks_1')
64 response.mustcontain('cd /tmp')
64 response.mustcontain('cd /tmp')
65
65
66 def test_create_custom_hook_delete(self, csrf_token):
66 def test_create_custom_hook_delete(self, csrf_token):
67 response = self.app.post(
67 response = self.app.post(
68 url('admin_settings_hooks'),
68 url('admin_settings_hooks'),
69 params={
69 params={
70 'new_hook_ui_key': 'test_hooks_2',
70 'new_hook_ui_key': 'test_hooks_2',
71 'new_hook_ui_value': 'cd /tmp2',
71 'new_hook_ui_value': 'cd /tmp2',
72 'csrf_token': csrf_token})
72 'csrf_token': csrf_token})
73
73
74 response = response.follow()
74 response = response.follow()
75 response.mustcontain('test_hooks_2')
75 response.mustcontain('test_hooks_2')
76 response.mustcontain('cd /tmp2')
76 response.mustcontain('cd /tmp2')
77
77
78 hook_id = SettingsModel().get_ui_by_key('test_hooks_2').ui_id
78 hook_id = SettingsModel().get_ui_by_key('test_hooks_2').ui_id
79
79
80 # delete
80 # delete
81 self.app.post(
81 self.app.post(
82 url('admin_settings_hooks'),
82 url('admin_settings_hooks'),
83 params={'hook_id': hook_id, 'csrf_token': csrf_token})
83 params={'hook_id': hook_id, 'csrf_token': csrf_token})
84 response = self.app.get(url('admin_settings_hooks'))
84 response = self.app.get(url('admin_settings_hooks'))
85 response.mustcontain(no=['test_hooks_2'])
85 response.mustcontain(no=['test_hooks_2'])
86 response.mustcontain(no=['cd /tmp2'])
86 response.mustcontain(no=['cd /tmp2'])
87
87
88 def test_system_update_new_version(self):
88 def test_system_update_new_version(self):
89 update_data = {
89 update_data = {
90 'versions': [
90 'versions': [
91 {
91 {
92 'version': '100.3.1415926535',
92 'version': '100.3.1415926535',
93 'general': 'The latest version we are ever going to ship'
93 'general': 'The latest version we are ever going to ship'
94 },
94 },
95 {
95 {
96 'version': '0.0.0',
96 'version': '0.0.0',
97 'general': 'The first version we ever shipped'
97 'general': 'The first version we ever shipped'
98 }
98 }
99 ]
99 ]
100 }
100 }
101 with mock.patch(UPDATE_DATA_QUALNAME, return_value=update_data):
101 with mock.patch(UPDATE_DATA_QUALNAME, return_value=update_data):
102 response = self.app.get(url('admin_settings_system_update'))
102 response = self.app.get(url('admin_settings_system_update'))
103 response.mustcontain('A <b>new version</b> is available')
103 response.mustcontain('A <b>new version</b> is available')
104
104
105 def test_system_update_nothing_new(self):
105 def test_system_update_nothing_new(self):
106 update_data = {
106 update_data = {
107 'versions': [
107 'versions': [
108 {
108 {
109 'version': '0.0.0',
109 'version': '0.0.0',
110 'general': 'The first version we ever shipped'
110 'general': 'The first version we ever shipped'
111 }
111 }
112 ]
112 ]
113 }
113 }
114 with mock.patch(UPDATE_DATA_QUALNAME, return_value=update_data):
114 with mock.patch(UPDATE_DATA_QUALNAME, return_value=update_data):
115 response = self.app.get(url('admin_settings_system_update'))
115 response = self.app.get(url('admin_settings_system_update'))
116 response.mustcontain(
116 response.mustcontain(
117 'You already have the <b>latest</b> stable version.')
117 'You already have the <b>latest</b> stable version.')
118
118
119 def test_system_update_bad_response(self):
119 def test_system_update_bad_response(self):
120 with mock.patch(UPDATE_DATA_QUALNAME, side_effect=ValueError('foo')):
120 with mock.patch(UPDATE_DATA_QUALNAME, side_effect=ValueError('foo')):
121 response = self.app.get(url('admin_settings_system_update'))
121 response = self.app.get(url('admin_settings_system_update'))
122 response.mustcontain(
122 response.mustcontain(
123 'Bad data sent from update server')
123 'Bad data sent from update server')
124
124
125
125
126 @pytest.mark.usefixtures('autologin_user', 'app')
126 @pytest.mark.usefixtures('autologin_user', 'app')
127 class TestAdminSettingsGlobal:
127 class TestAdminSettingsGlobal:
128
128
129 def test_pre_post_code_code_active(self, csrf_token):
129 def test_pre_post_code_code_active(self, csrf_token):
130 pre_code = 'rc-pre-code-187652122'
130 pre_code = 'rc-pre-code-187652122'
131 post_code = 'rc-postcode-98165231'
131 post_code = 'rc-postcode-98165231'
132
132
133 response = self.post_and_verify_settings({
133 response = self.post_and_verify_settings({
134 'rhodecode_pre_code': pre_code,
134 'rhodecode_pre_code': pre_code,
135 'rhodecode_post_code': post_code,
135 'rhodecode_post_code': post_code,
136 'csrf_token': csrf_token,
136 'csrf_token': csrf_token,
137 })
137 })
138
138
139 response = response.follow()
139 response = response.follow()
140 response.mustcontain(pre_code, post_code)
140 response.mustcontain(pre_code, post_code)
141
141
142 def test_pre_post_code_code_inactive(self, csrf_token):
142 def test_pre_post_code_code_inactive(self, csrf_token):
143 pre_code = 'rc-pre-code-187652122'
143 pre_code = 'rc-pre-code-187652122'
144 post_code = 'rc-postcode-98165231'
144 post_code = 'rc-postcode-98165231'
145 response = self.post_and_verify_settings({
145 response = self.post_and_verify_settings({
146 'rhodecode_pre_code': '',
146 'rhodecode_pre_code': '',
147 'rhodecode_post_code': '',
147 'rhodecode_post_code': '',
148 'csrf_token': csrf_token,
148 'csrf_token': csrf_token,
149 })
149 })
150
150
151 response = response.follow()
151 response = response.follow()
152 response.mustcontain(no=[pre_code, post_code])
152 response.mustcontain(no=[pre_code, post_code])
153
153
154 def test_captcha_activate(self, csrf_token):
154 def test_captcha_activate(self, csrf_token):
155 self.post_and_verify_settings({
155 self.post_and_verify_settings({
156 'rhodecode_captcha_private_key': '1234567890',
156 'rhodecode_captcha_private_key': '1234567890',
157 'rhodecode_captcha_public_key': '1234567890',
157 'rhodecode_captcha_public_key': '1234567890',
158 'csrf_token': csrf_token,
158 'csrf_token': csrf_token,
159 })
159 })
160
160
161 response = self.app.get(ADMIN_PREFIX + '/register')
161 response = self.app.get(ADMIN_PREFIX + '/register')
162 response.mustcontain('captcha')
162 response.mustcontain('captcha')
163
163
164 def test_captcha_deactivate(self, csrf_token):
164 def test_captcha_deactivate(self, csrf_token):
165 self.post_and_verify_settings({
165 self.post_and_verify_settings({
166 'rhodecode_captcha_private_key': '',
166 'rhodecode_captcha_private_key': '',
167 'rhodecode_captcha_public_key': '1234567890',
167 'rhodecode_captcha_public_key': '1234567890',
168 'csrf_token': csrf_token,
168 'csrf_token': csrf_token,
169 })
169 })
170
170
171 response = self.app.get(ADMIN_PREFIX + '/register')
171 response = self.app.get(ADMIN_PREFIX + '/register')
172 response.mustcontain(no=['captcha'])
172 response.mustcontain(no=['captcha'])
173
173
174 def test_title_change(self, csrf_token):
174 def test_title_change(self, csrf_token):
175 old_title = 'RhodeCode'
175 old_title = 'RhodeCode'
176 new_title = old_title + '_changed'
176 new_title = old_title + '_changed'
177
177
178 for new_title in ['Changed', 'Ε»Γ³Ε‚wik', old_title]:
178 for new_title in ['Changed', 'Ε»Γ³Ε‚wik', old_title]:
179 response = self.post_and_verify_settings({
179 response = self.post_and_verify_settings({
180 'rhodecode_title': new_title,
180 'rhodecode_title': new_title,
181 'csrf_token': csrf_token,
181 'csrf_token': csrf_token,
182 })
182 })
183
183
184 response = response.follow()
184 response = response.follow()
185 response.mustcontain(
185 response.mustcontain(
186 """<div class="branding">- %s</div>""" % new_title)
186 """<div class="branding">- %s</div>""" % new_title)
187
187
188 def post_and_verify_settings(self, settings):
188 def post_and_verify_settings(self, settings):
189 old_title = 'RhodeCode'
189 old_title = 'RhodeCode'
190 old_realm = 'RhodeCode authentication'
190 old_realm = 'RhodeCode authentication'
191 params = {
191 params = {
192 'rhodecode_title': old_title,
192 'rhodecode_title': old_title,
193 'rhodecode_realm': old_realm,
193 'rhodecode_realm': old_realm,
194 'rhodecode_pre_code': '',
194 'rhodecode_pre_code': '',
195 'rhodecode_post_code': '',
195 'rhodecode_post_code': '',
196 'rhodecode_captcha_private_key': '',
196 'rhodecode_captcha_private_key': '',
197 'rhodecode_captcha_public_key': '',
197 'rhodecode_captcha_public_key': '',
198 }
198 }
199 params.update(settings)
199 params.update(settings)
200 response = self.app.post(url('admin_settings_global'), params=params)
200 response = self.app.post(url('admin_settings_global'), params=params)
201
201
202 assert_session_flash(response, 'Updated application settings')
202 assert_session_flash(response, 'Updated application settings')
203 app_settings = SettingsModel().get_all_settings()
203 app_settings = SettingsModel().get_all_settings()
204 del settings['csrf_token']
204 del settings['csrf_token']
205 for key, value in settings.iteritems():
205 for key, value in settings.iteritems():
206 assert app_settings[key] == value.decode('utf-8')
206 assert app_settings[key] == value.decode('utf-8')
207
207
208 return response
208 return response
209
209
210
210
211 @pytest.mark.usefixtures('autologin_user', 'app')
211 @pytest.mark.usefixtures('autologin_user', 'app')
212 class TestAdminSettingsVcs:
212 class TestAdminSettingsVcs:
213
213
214 def test_contains_svn_default_patterns(self, app):
214 def test_contains_svn_default_patterns(self, app):
215 response = app.get(url('admin_settings_vcs'))
215 response = app.get(url('admin_settings_vcs'))
216 expected_patterns = [
216 expected_patterns = [
217 '/trunk',
217 '/trunk',
218 '/branches/*',
218 '/branches/*',
219 '/tags/*',
219 '/tags/*',
220 ]
220 ]
221 for pattern in expected_patterns:
221 for pattern in expected_patterns:
222 response.mustcontain(pattern)
222 response.mustcontain(pattern)
223
223
224 def test_add_new_svn_branch_and_tag_pattern(
224 def test_add_new_svn_branch_and_tag_pattern(
225 self, app, backend_svn, form_defaults, disable_sql_cache,
225 self, app, backend_svn, form_defaults, disable_sql_cache,
226 csrf_token):
226 csrf_token):
227 form_defaults.update({
227 form_defaults.update({
228 'new_svn_branch': '/exp/branches/*',
228 'new_svn_branch': '/exp/branches/*',
229 'new_svn_tag': '/important_tags/*',
229 'new_svn_tag': '/important_tags/*',
230 'csrf_token': csrf_token,
230 'csrf_token': csrf_token,
231 })
231 })
232
232
233 response = app.post(
233 response = app.post(
234 url('admin_settings_vcs'), params=form_defaults, status=302)
234 url('admin_settings_vcs'), params=form_defaults, status=302)
235 response = response.follow()
235 response = response.follow()
236
236
237 # Expect to find the new values on the page
237 # Expect to find the new values on the page
238 response.mustcontain('/exp/branches/*')
238 response.mustcontain('/exp/branches/*')
239 response.mustcontain('/important_tags/*')
239 response.mustcontain('/important_tags/*')
240
240
241 # Expect that those patterns are used to match branches and tags now
241 # Expect that those patterns are used to match branches and tags now
242 repo = backend_svn['svn-simple-layout'].scm_instance()
242 repo = backend_svn['svn-simple-layout'].scm_instance()
243 assert 'exp/branches/exp-sphinx-docs' in repo.branches
243 assert 'exp/branches/exp-sphinx-docs' in repo.branches
244 assert 'important_tags/v0.5' in repo.tags
244 assert 'important_tags/v0.5' in repo.tags
245
245
246 def test_add_same_svn_value_twice_shows_an_error_message(
246 def test_add_same_svn_value_twice_shows_an_error_message(
247 self, app, form_defaults, csrf_token, settings_util):
247 self, app, form_defaults, csrf_token, settings_util):
248 settings_util.create_rhodecode_ui('vcs_svn_branch', '/test')
248 settings_util.create_rhodecode_ui('vcs_svn_branch', '/test')
249 settings_util.create_rhodecode_ui('vcs_svn_tag', '/test')
249 settings_util.create_rhodecode_ui('vcs_svn_tag', '/test')
250
250
251 response = app.post(
251 response = app.post(
252 url('admin_settings_vcs'),
252 url('admin_settings_vcs'),
253 params={
253 params={
254 'paths_root_path': form_defaults['paths_root_path'],
254 'paths_root_path': form_defaults['paths_root_path'],
255 'new_svn_branch': '/test',
255 'new_svn_branch': '/test',
256 'new_svn_tag': '/test',
256 'new_svn_tag': '/test',
257 'csrf_token': csrf_token,
257 'csrf_token': csrf_token,
258 },
258 },
259 status=200)
259 status=200)
260
260
261 response.mustcontain("Pattern already exists")
261 response.mustcontain("Pattern already exists")
262 response.mustcontain("Some form inputs contain invalid data.")
262 response.mustcontain("Some form inputs contain invalid data.")
263
263
264 @pytest.mark.parametrize('section', [
264 @pytest.mark.parametrize('section', [
265 'vcs_svn_branch',
265 'vcs_svn_branch',
266 'vcs_svn_tag',
266 'vcs_svn_tag',
267 ])
267 ])
268 def test_delete_svn_patterns(
268 def test_delete_svn_patterns(
269 self, section, app, csrf_token, settings_util):
269 self, section, app, csrf_token, settings_util):
270 setting = settings_util.create_rhodecode_ui(
270 setting = settings_util.create_rhodecode_ui(
271 section, '/test_delete', cleanup=False)
271 section, '/test_delete', cleanup=False)
272
272
273 app.post(
273 app.post(
274 url('admin_settings_vcs'),
274 url('admin_settings_vcs'),
275 params={
275 params={
276 '_method': 'delete',
276 '_method': 'delete',
277 'delete_svn_pattern': setting.ui_id,
277 'delete_svn_pattern': setting.ui_id,
278 'csrf_token': csrf_token},
278 'csrf_token': csrf_token},
279 headers={'X-REQUESTED-WITH': 'XMLHttpRequest'})
279 headers={'X-REQUESTED-WITH': 'XMLHttpRequest'})
280
280
281 @pytest.mark.parametrize('section', [
281 @pytest.mark.parametrize('section', [
282 'vcs_svn_branch',
282 'vcs_svn_branch',
283 'vcs_svn_tag',
283 'vcs_svn_tag',
284 ])
284 ])
285 def test_delete_svn_patterns_raises_400_when_no_xhr(
285 def test_delete_svn_patterns_raises_400_when_no_xhr(
286 self, section, app, csrf_token, settings_util):
286 self, section, app, csrf_token, settings_util):
287 setting = settings_util.create_rhodecode_ui(section, '/test_delete')
287 setting = settings_util.create_rhodecode_ui(section, '/test_delete')
288
288
289 app.post(
289 app.post(
290 url('admin_settings_vcs'),
290 url('admin_settings_vcs'),
291 params={
291 params={
292 '_method': 'delete',
292 '_method': 'delete',
293 'delete_svn_pattern': setting.ui_id,
293 'delete_svn_pattern': setting.ui_id,
294 'csrf_token': csrf_token},
294 'csrf_token': csrf_token},
295 status=400)
295 status=400)
296
296
297 def test_extensions_hgsubversion(self, app, form_defaults, csrf_token):
297 def test_extensions_hgsubversion(self, app, form_defaults, csrf_token):
298 form_defaults.update({
298 form_defaults.update({
299 'csrf_token': csrf_token,
299 'csrf_token': csrf_token,
300 'extensions_hgsubversion': 'True',
300 'extensions_hgsubversion': 'True',
301 })
301 })
302 response = app.post(
302 response = app.post(
303 url('admin_settings_vcs'),
303 url('admin_settings_vcs'),
304 params=form_defaults,
304 params=form_defaults,
305 status=302)
305 status=302)
306
306
307 response = response.follow()
307 response = response.follow()
308 extensions_input = (
308 extensions_input = (
309 '<input id="extensions_hgsubversion" '
309 '<input id="extensions_hgsubversion" '
310 'name="extensions_hgsubversion" type="checkbox" '
310 'name="extensions_hgsubversion" type="checkbox" '
311 'value="True" checked="checked" />')
311 'value="True" checked="checked" />')
312 response.mustcontain(extensions_input)
312 response.mustcontain(extensions_input)
313
313
314 def test_has_a_section_for_pull_request_settings(self, app):
314 def test_has_a_section_for_pull_request_settings(self, app):
315 response = app.get(url('admin_settings_vcs'))
315 response = app.get(url('admin_settings_vcs'))
316 response.mustcontain('Pull Request Settings')
316 response.mustcontain('Pull Request Settings')
317
317
318 def test_has_an_input_for_invalidation_of_inline_comments(
318 def test_has_an_input_for_invalidation_of_inline_comments(
319 self, app):
319 self, app):
320 response = app.get(url('admin_settings_vcs'))
320 response = app.get(url('admin_settings_vcs'))
321 assert_response = AssertResponse(response)
321 assert_response = AssertResponse(response)
322 assert_response.one_element_exists(
322 assert_response.one_element_exists(
323 '[name=rhodecode_use_outdated_comments]')
323 '[name=rhodecode_use_outdated_comments]')
324
324
325 @pytest.mark.parametrize('new_value', [True, False])
325 @pytest.mark.parametrize('new_value', [True, False])
326 def test_allows_to_change_invalidation_of_inline_comments(
326 def test_allows_to_change_invalidation_of_inline_comments(
327 self, app, form_defaults, csrf_token, new_value):
327 self, app, form_defaults, csrf_token, new_value):
328 setting_key = 'use_outdated_comments'
328 setting_key = 'use_outdated_comments'
329 setting = SettingsModel().create_or_update_setting(
329 setting = SettingsModel().create_or_update_setting(
330 setting_key, not new_value, 'bool')
330 setting_key, not new_value, 'bool')
331 Session().add(setting)
331 Session().add(setting)
332 Session().commit()
332 Session().commit()
333
333
334 form_defaults.update({
334 form_defaults.update({
335 'csrf_token': csrf_token,
335 'csrf_token': csrf_token,
336 'rhodecode_use_outdated_comments': str(new_value),
336 'rhodecode_use_outdated_comments': str(new_value),
337 })
337 })
338 response = app.post(
338 response = app.post(
339 url('admin_settings_vcs'),
339 url('admin_settings_vcs'),
340 params=form_defaults,
340 params=form_defaults,
341 status=302)
341 status=302)
342 response = response.follow()
342 response = response.follow()
343 setting = SettingsModel().get_setting_by_name(setting_key)
343 setting = SettingsModel().get_setting_by_name(setting_key)
344 assert setting.app_settings_value is new_value
344 assert setting.app_settings_value is new_value
345
345
346 def test_has_a_section_for_labs_settings_if_enabled(self, app):
347 with mock.patch.dict(
348 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
349 response = self.app.get(url('admin_settings_vcs'))
350 response.mustcontain('Labs settings:')
351
352 def test_has_not_a_section_for_labs_settings_if_disables(self, app):
353 with mock.patch.dict(
354 rhodecode.CONFIG, {'labs_settings_active': 'false'}):
355 response = self.app.get(url('admin_settings_vcs'))
356 response.mustcontain(no='Labs settings:')
357
358 @pytest.mark.parametrize('new_value', [True, False])
359 def test_allows_to_change_hg_rebase_merge_strategy(
360 self, app, form_defaults, csrf_token, new_value):
361 setting_key = 'hg_use_rebase_for_merging'
362
363 form_defaults.update({
364 'csrf_token': csrf_token,
365 'rhodecode_' + setting_key: str(new_value),
366 })
367
368 with mock.patch.dict(
369 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
370 app.post(
371 url('admin_settings_vcs'),
372 params=form_defaults,
373 status=302)
374
375 setting = SettingsModel().get_setting_by_name(setting_key)
376 assert setting.app_settings_value is new_value
377
346 @pytest.fixture
378 @pytest.fixture
347 def disable_sql_cache(self, request):
379 def disable_sql_cache(self, request):
348 patcher = mock.patch(
380 patcher = mock.patch(
349 'rhodecode.lib.caching_query.FromCache.process_query')
381 'rhodecode.lib.caching_query.FromCache.process_query')
350 request.addfinalizer(patcher.stop)
382 request.addfinalizer(patcher.stop)
351 patcher.start()
383 patcher.start()
352
384
353 @pytest.fixture
385 @pytest.fixture
354 def form_defaults(self):
386 def form_defaults(self):
355 from rhodecode.controllers.admin.settings import SettingsController
387 from rhodecode.controllers.admin.settings import SettingsController
356 controller = SettingsController()
388 controller = SettingsController()
357 return controller._form_defaults()
389 return controller._form_defaults()
358
390
359 # TODO: johbo: What we really want is to checkpoint before a test run and
391 # TODO: johbo: What we really want is to checkpoint before a test run and
360 # reset the session afterwards.
392 # reset the session afterwards.
361 @pytest.fixture(scope='class', autouse=True)
393 @pytest.fixture(scope='class', autouse=True)
362 def cleanup_settings(self, request, pylonsapp):
394 def cleanup_settings(self, request, pylonsapp):
363 ui_id = RhodeCodeUi.ui_id
395 ui_id = RhodeCodeUi.ui_id
364 original_ids = list(
396 original_ids = list(
365 r.ui_id for r in RhodeCodeUi.query().values(ui_id))
397 r.ui_id for r in RhodeCodeUi.query().values(ui_id))
366
398
367 @request.addfinalizer
399 @request.addfinalizer
368 def cleanup():
400 def cleanup():
369 RhodeCodeUi.query().filter(
401 RhodeCodeUi.query().filter(
370 ui_id.notin_(original_ids)).delete(False)
402 ui_id.notin_(original_ids)).delete(False)
371
403
372
404
373 @pytest.mark.usefixtures('autologin_user', 'app')
405 @pytest.mark.usefixtures('autologin_user', 'app')
374 class TestLabsSettings(object):
406 class TestLabsSettings(object):
375 def test_get_settings_page_disabled(self):
407 def test_get_settings_page_disabled(self):
376 with mock.patch.dict(rhodecode.CONFIG,
408 with mock.patch.dict(rhodecode.CONFIG,
377 {'labs_settings_active': 'false'}):
409 {'labs_settings_active': 'false'}):
378 response = self.app.get(url('admin_settings_labs'), status=302)
410 response = self.app.get(url('admin_settings_labs'), status=302)
379
411
380 assert response.location.endswith(url('admin_settings'))
412 assert response.location.endswith(url('admin_settings'))
381
413
382 def test_get_settings_page_enabled(self):
414 def test_get_settings_page_enabled(self):
383 from rhodecode.controllers.admin import settings
415 from rhodecode.controllers.admin import settings
384 lab_settings = [
416 lab_settings = [
385 settings.LabSetting(
417 settings.LabSetting(
386 key='rhodecode_bool',
418 key='rhodecode_bool',
387 type='bool',
419 type='bool',
388 group='bool group',
420 group='bool group',
389 label='bool label',
421 label='bool label',
390 help='bool help'
422 help='bool help'
391 ),
423 ),
392 settings.LabSetting(
424 settings.LabSetting(
393 key='rhodecode_text',
425 key='rhodecode_text',
394 type='unicode',
426 type='unicode',
395 group='text group',
427 group='text group',
396 label='text label',
428 label='text label',
397 help='text help'
429 help='text help'
398 ),
430 ),
399 ]
431 ]
400 with mock.patch.dict(rhodecode.CONFIG,
432 with mock.patch.dict(rhodecode.CONFIG,
401 {'labs_settings_active': 'true'}):
433 {'labs_settings_active': 'true'}):
402 with mock.patch.object(settings, '_LAB_SETTINGS', lab_settings):
434 with mock.patch.object(settings, '_LAB_SETTINGS', lab_settings):
403 response = self.app.get(url('admin_settings_labs'))
435 response = self.app.get(url('admin_settings_labs'))
404
436
405 assert '<label>bool group:</label>' in response
437 assert '<label>bool group:</label>' in response
406 assert '<label for="rhodecode_bool">bool label</label>' in response
438 assert '<label for="rhodecode_bool">bool label</label>' in response
407 assert '<p class="help-block">bool help</p>' in response
439 assert '<p class="help-block">bool help</p>' in response
408 assert 'name="rhodecode_bool" type="checkbox"' in response
440 assert 'name="rhodecode_bool" type="checkbox"' in response
409
441
410 assert '<label>text group:</label>' in response
442 assert '<label>text group:</label>' in response
411 assert '<label for="rhodecode_text">text label</label>' in response
443 assert '<label for="rhodecode_text">text label</label>' in response
412 assert '<p class="help-block">text help</p>' in response
444 assert '<p class="help-block">text help</p>' in response
413 assert 'name="rhodecode_text" size="60" type="text"' in response
445 assert 'name="rhodecode_text" size="60" type="text"' in response
414
446
415 @pytest.mark.parametrize('setting_name', [
447 @pytest.mark.parametrize('setting_name', [
416 'proxy_subversion_http_requests',
448 'proxy_subversion_http_requests',
417 'hg_use_rebase_for_merging',
418 ])
449 ])
419 def test_update_boolean_settings(self, csrf_token, setting_name):
450 def test_update_boolean_settings(self, csrf_token, setting_name):
420 self.app.post(
451 self.app.post(
421 url('admin_settings_labs'),
452 url('admin_settings_labs'),
422 params={
453 params={
423 'rhodecode_{}'.format(setting_name): 'true',
454 'rhodecode_{}'.format(setting_name): 'true',
424 'csrf_token': csrf_token,
455 'csrf_token': csrf_token,
425 })
456 })
426 setting = SettingsModel().get_setting_by_name(setting_name)
457 setting = SettingsModel().get_setting_by_name(setting_name)
427 assert setting.app_settings_value
458 assert setting.app_settings_value
428
459
429 self.app.post(
460 self.app.post(
430 url('admin_settings_labs'),
461 url('admin_settings_labs'),
431 params={
462 params={
432 'rhodecode_{}'.format(setting_name): 'false',
463 'rhodecode_{}'.format(setting_name): 'false',
433 'csrf_token': csrf_token,
464 'csrf_token': csrf_token,
434 })
465 })
435 setting = SettingsModel().get_setting_by_name(setting_name)
466 setting = SettingsModel().get_setting_by_name(setting_name)
436 assert not setting.app_settings_value
467 assert not setting.app_settings_value
437
468
438 @pytest.mark.parametrize('setting_name', [
469 @pytest.mark.parametrize('setting_name', [
439 'subversion_http_server_url',
470 'subversion_http_server_url',
440 ])
471 ])
441 def test_update_string_settings(self, csrf_token, setting_name):
472 def test_update_string_settings(self, csrf_token, setting_name):
442 self.app.post(
473 self.app.post(
443 url('admin_settings_labs'),
474 url('admin_settings_labs'),
444 params={
475 params={
445 'rhodecode_{}'.format(setting_name): 'Test 1',
476 'rhodecode_{}'.format(setting_name): 'Test 1',
446 'csrf_token': csrf_token,
477 'csrf_token': csrf_token,
447 })
478 })
448 setting = SettingsModel().get_setting_by_name(setting_name)
479 setting = SettingsModel().get_setting_by_name(setting_name)
449 assert setting.app_settings_value == 'Test 1'
480 assert setting.app_settings_value == 'Test 1'
450
481
451 self.app.post(
482 self.app.post(
452 url('admin_settings_labs'),
483 url('admin_settings_labs'),
453 params={
484 params={
454 'rhodecode_{}'.format(setting_name): ' Test 2 ',
485 'rhodecode_{}'.format(setting_name): ' Test 2 ',
455 'csrf_token': csrf_token,
486 'csrf_token': csrf_token,
456 })
487 })
457 setting = SettingsModel().get_setting_by_name(setting_name)
488 setting = SettingsModel().get_setting_by_name(setting_name)
458 assert setting.app_settings_value == 'Test 2'
489 assert setting.app_settings_value == 'Test 2'
459
490
460
491
461 @pytest.mark.usefixtures('app')
492 @pytest.mark.usefixtures('app')
462 class TestOpenSourceLicenses(object):
493 class TestOpenSourceLicenses(object):
463
494
464 def _get_url(self):
495 def _get_url(self):
465 return ADMIN_PREFIX + '/settings/open_source'
496 return ADMIN_PREFIX + '/settings/open_source'
466
497
467 def test_records_are_displayed(self, autologin_user):
498 def test_records_are_displayed(self, autologin_user):
468 sample_licenses = {
499 sample_licenses = {
469 "python2.7-pytest-2.7.1": {
500 "python2.7-pytest-2.7.1": {
470 "UNKNOWN": None
501 "UNKNOWN": None
471 },
502 },
472 "python2.7-Markdown-2.6.2": {
503 "python2.7-Markdown-2.6.2": {
473 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
504 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
474 }
505 }
475 }
506 }
476 read_licenses_patch = mock.patch(
507 read_licenses_patch = mock.patch(
477 'rhodecode.admin.views.read_opensource_licenses',
508 'rhodecode.admin.views.read_opensource_licenses',
478 return_value=sample_licenses)
509 return_value=sample_licenses)
479 with read_licenses_patch:
510 with read_licenses_patch:
480 response = self.app.get(self._get_url(), status=200)
511 response = self.app.get(self._get_url(), status=200)
481
512
482 assert_response = AssertResponse(response)
513 assert_response = AssertResponse(response)
483 assert_response.element_contains(
514 assert_response.element_contains(
484 '.panel-heading', 'Licenses of Third Party Packages')
515 '.panel-heading', 'Licenses of Third Party Packages')
485 for name in sample_licenses:
516 for name in sample_licenses:
486 response.mustcontain(name)
517 response.mustcontain(name)
487 for license in sample_licenses[name]:
518 for license in sample_licenses[name]:
488 assert_response.element_contains('.panel-body', license)
519 assert_response.element_contains('.panel-body', license)
489
520
490 def test_records_can_be_read(self, autologin_user):
521 def test_records_can_be_read(self, autologin_user):
491 response = self.app.get(self._get_url(), status=200)
522 response = self.app.get(self._get_url(), status=200)
492 assert_response = AssertResponse(response)
523 assert_response = AssertResponse(response)
493 assert_response.element_contains(
524 assert_response.element_contains(
494 '.panel-heading', 'Licenses of Third Party Packages')
525 '.panel-heading', 'Licenses of Third Party Packages')
495
526
496 def test_forbidden_when_normal_user(self, autologin_regular_user):
527 def test_forbidden_when_normal_user(self, autologin_regular_user):
497 self.app.get(self._get_url(), status=403)
528 self.app.get(self._get_url(), status=403)
498
529
499
530
500 @pytest.mark.usefixtures("app")
531 @pytest.mark.usefixtures("app")
501 class TestAdminSettingsIssueTracker:
532 class TestAdminSettingsIssueTracker:
502 RC_PREFIX = 'rhodecode_'
533 RC_PREFIX = 'rhodecode_'
503 SHORT_PATTERN_KEY = 'issuetracker_pat_'
534 SHORT_PATTERN_KEY = 'issuetracker_pat_'
504 PATTERN_KEY = RC_PREFIX + SHORT_PATTERN_KEY
535 PATTERN_KEY = RC_PREFIX + SHORT_PATTERN_KEY
505
536
506 def test_issuetracker_index(self, autologin_user):
537 def test_issuetracker_index(self, autologin_user):
507 response = self.app.get(url('admin_settings_issuetracker'))
538 response = self.app.get(url('admin_settings_issuetracker'))
508 assert response.status_code == 200
539 assert response.status_code == 200
509
540
510 def test_add_issuetracker_pattern(
541 def test_add_issuetracker_pattern(
511 self, request, autologin_user, csrf_token):
542 self, request, autologin_user, csrf_token):
512 pattern = 'issuetracker_pat'
543 pattern = 'issuetracker_pat'
513 another_pattern = pattern+'1'
544 another_pattern = pattern+'1'
514 post_url = url('admin_settings_issuetracker_save')
545 post_url = url('admin_settings_issuetracker_save')
515 post_data = {
546 post_data = {
516 'new_pattern_pattern_0': pattern,
547 'new_pattern_pattern_0': pattern,
517 'new_pattern_url_0': 'url',
548 'new_pattern_url_0': 'url',
518 'new_pattern_prefix_0': 'prefix',
549 'new_pattern_prefix_0': 'prefix',
519 'new_pattern_description_0': 'description',
550 'new_pattern_description_0': 'description',
520 'new_pattern_pattern_1': another_pattern,
551 'new_pattern_pattern_1': another_pattern,
521 'new_pattern_url_1': 'url1',
552 'new_pattern_url_1': 'url1',
522 'new_pattern_prefix_1': 'prefix1',
553 'new_pattern_prefix_1': 'prefix1',
523 'new_pattern_description_1': 'description1',
554 'new_pattern_description_1': 'description1',
524 'csrf_token': csrf_token
555 'csrf_token': csrf_token
525 }
556 }
526 self.app.post(post_url, post_data, status=302)
557 self.app.post(post_url, post_data, status=302)
527 settings = SettingsModel().get_all_settings()
558 settings = SettingsModel().get_all_settings()
528 self.uid = md5(pattern)
559 self.uid = md5(pattern)
529 assert settings[self.PATTERN_KEY+self.uid] == pattern
560 assert settings[self.PATTERN_KEY+self.uid] == pattern
530 self.another_uid = md5(another_pattern)
561 self.another_uid = md5(another_pattern)
531 assert settings[self.PATTERN_KEY+self.another_uid] == another_pattern
562 assert settings[self.PATTERN_KEY+self.another_uid] == another_pattern
532
563
533 @request.addfinalizer
564 @request.addfinalizer
534 def cleanup():
565 def cleanup():
535 defaults = SettingsModel().get_all_settings()
566 defaults = SettingsModel().get_all_settings()
536
567
537 entries = [name for name in defaults if (
568 entries = [name for name in defaults if (
538 (self.uid in name) or (self.another_uid) in name)]
569 (self.uid in name) or (self.another_uid) in name)]
539 start = len(self.RC_PREFIX)
570 start = len(self.RC_PREFIX)
540 for del_key in entries:
571 for del_key in entries:
541 # TODO: anderson: get_by_name needs name without prefix
572 # TODO: anderson: get_by_name needs name without prefix
542 entry = SettingsModel().get_setting_by_name(del_key[start:])
573 entry = SettingsModel().get_setting_by_name(del_key[start:])
543 Session().delete(entry)
574 Session().delete(entry)
544
575
545 Session().commit()
576 Session().commit()
546
577
547 def test_edit_issuetracker_pattern(
578 def test_edit_issuetracker_pattern(
548 self, autologin_user, backend, csrf_token, request):
579 self, autologin_user, backend, csrf_token, request):
549 old_pattern = 'issuetracker_pat'
580 old_pattern = 'issuetracker_pat'
550 old_uid = md5(old_pattern)
581 old_uid = md5(old_pattern)
551 pattern = 'issuetracker_pat_new'
582 pattern = 'issuetracker_pat_new'
552 self.new_uid = md5(pattern)
583 self.new_uid = md5(pattern)
553
584
554 SettingsModel().create_or_update_setting(
585 SettingsModel().create_or_update_setting(
555 self.SHORT_PATTERN_KEY+old_uid, old_pattern, 'unicode')
586 self.SHORT_PATTERN_KEY+old_uid, old_pattern, 'unicode')
556
587
557 post_url = url('admin_settings_issuetracker_save')
588 post_url = url('admin_settings_issuetracker_save')
558 post_data = {
589 post_data = {
559 'new_pattern_pattern_0': pattern,
590 'new_pattern_pattern_0': pattern,
560 'new_pattern_url_0': 'url',
591 'new_pattern_url_0': 'url',
561 'new_pattern_prefix_0': 'prefix',
592 'new_pattern_prefix_0': 'prefix',
562 'new_pattern_description_0': 'description',
593 'new_pattern_description_0': 'description',
563 'uid': old_uid,
594 'uid': old_uid,
564 'csrf_token': csrf_token
595 'csrf_token': csrf_token
565 }
596 }
566 self.app.post(post_url, post_data, status=302)
597 self.app.post(post_url, post_data, status=302)
567 settings = SettingsModel().get_all_settings()
598 settings = SettingsModel().get_all_settings()
568 assert settings[self.PATTERN_KEY+self.new_uid] == pattern
599 assert settings[self.PATTERN_KEY+self.new_uid] == pattern
569 assert self.PATTERN_KEY+old_uid not in settings
600 assert self.PATTERN_KEY+old_uid not in settings
570
601
571 @request.addfinalizer
602 @request.addfinalizer
572 def cleanup():
603 def cleanup():
573 IssueTrackerSettingsModel().delete_entries(self.new_uid)
604 IssueTrackerSettingsModel().delete_entries(self.new_uid)
574
605
575 def test_replace_issuetracker_pattern_description(
606 def test_replace_issuetracker_pattern_description(
576 self, autologin_user, csrf_token, request, settings_util):
607 self, autologin_user, csrf_token, request, settings_util):
577 prefix = 'issuetracker'
608 prefix = 'issuetracker'
578 pattern = 'issuetracker_pat'
609 pattern = 'issuetracker_pat'
579 self.uid = md5(pattern)
610 self.uid = md5(pattern)
580 pattern_key = '_'.join([prefix, 'pat', self.uid])
611 pattern_key = '_'.join([prefix, 'pat', self.uid])
581 rc_pattern_key = '_'.join(['rhodecode', pattern_key])
612 rc_pattern_key = '_'.join(['rhodecode', pattern_key])
582 desc_key = '_'.join([prefix, 'desc', self.uid])
613 desc_key = '_'.join([prefix, 'desc', self.uid])
583 rc_desc_key = '_'.join(['rhodecode', desc_key])
614 rc_desc_key = '_'.join(['rhodecode', desc_key])
584 new_description = 'new_description'
615 new_description = 'new_description'
585
616
586 settings_util.create_rhodecode_setting(
617 settings_util.create_rhodecode_setting(
587 pattern_key, pattern, 'unicode', cleanup=False)
618 pattern_key, pattern, 'unicode', cleanup=False)
588 settings_util.create_rhodecode_setting(
619 settings_util.create_rhodecode_setting(
589 desc_key, 'old description', 'unicode', cleanup=False)
620 desc_key, 'old description', 'unicode', cleanup=False)
590
621
591 post_url = url('admin_settings_issuetracker_save')
622 post_url = url('admin_settings_issuetracker_save')
592 post_data = {
623 post_data = {
593 'new_pattern_pattern_0': pattern,
624 'new_pattern_pattern_0': pattern,
594 'new_pattern_url_0': 'url',
625 'new_pattern_url_0': 'url',
595 'new_pattern_prefix_0': 'prefix',
626 'new_pattern_prefix_0': 'prefix',
596 'new_pattern_description_0': new_description,
627 'new_pattern_description_0': new_description,
597 'uid': self.uid,
628 'uid': self.uid,
598 'csrf_token': csrf_token
629 'csrf_token': csrf_token
599 }
630 }
600 self.app.post(post_url, post_data, status=302)
631 self.app.post(post_url, post_data, status=302)
601 settings = SettingsModel().get_all_settings()
632 settings = SettingsModel().get_all_settings()
602 assert settings[rc_pattern_key] == pattern
633 assert settings[rc_pattern_key] == pattern
603 assert settings[rc_desc_key] == new_description
634 assert settings[rc_desc_key] == new_description
604
635
605 @request.addfinalizer
636 @request.addfinalizer
606 def cleanup():
637 def cleanup():
607 IssueTrackerSettingsModel().delete_entries(self.uid)
638 IssueTrackerSettingsModel().delete_entries(self.uid)
608
639
609 def test_delete_issuetracker_pattern(
640 def test_delete_issuetracker_pattern(
610 self, autologin_user, backend, csrf_token, settings_util):
641 self, autologin_user, backend, csrf_token, settings_util):
611 pattern = 'issuetracker_pat'
642 pattern = 'issuetracker_pat'
612 uid = md5(pattern)
643 uid = md5(pattern)
613 settings_util.create_rhodecode_setting(
644 settings_util.create_rhodecode_setting(
614 self.SHORT_PATTERN_KEY+uid, pattern, 'unicode', cleanup=False)
645 self.SHORT_PATTERN_KEY+uid, pattern, 'unicode', cleanup=False)
615
646
616 post_url = url('admin_issuetracker_delete')
647 post_url = url('admin_issuetracker_delete')
617 post_data = {
648 post_data = {
618 '_method': 'delete',
649 '_method': 'delete',
619 'uid': uid,
650 'uid': uid,
620 'csrf_token': csrf_token
651 'csrf_token': csrf_token
621 }
652 }
622 self.app.post(post_url, post_data, status=302)
653 self.app.post(post_url, post_data, status=302)
623 settings = SettingsModel().get_all_settings()
654 settings = SettingsModel().get_all_settings()
624 assert 'rhodecode_%s%s' % (self.SHORT_PATTERN_KEY, uid) not in settings
655 assert 'rhodecode_%s%s' % (self.SHORT_PATTERN_KEY, uid) not in settings
General Comments 0
You need to be logged in to leave comments. Login now