##// END OF EJS Templates
tests: fixed tests for personal repo groups
marcink -
r1095:bfb70415 default
parent child Browse files
Show More
@@ -1,619 +1,621 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 'rhodecode_create_personal_repo_group': False,
199 'rhodecode_personal_repo_group_pattern': '${username}',
198 }
200 }
199 params.update(settings)
201 params.update(settings)
200 response = self.app.post(url('admin_settings_global'), params=params)
202 response = self.app.post(url('admin_settings_global'), params=params)
201
203
202 assert_session_flash(response, 'Updated application settings')
204 assert_session_flash(response, 'Updated application settings')
203 app_settings = SettingsModel().get_all_settings()
205 app_settings = SettingsModel().get_all_settings()
204 del settings['csrf_token']
206 del settings['csrf_token']
205 for key, value in settings.iteritems():
207 for key, value in settings.iteritems():
206 assert app_settings[key] == value.decode('utf-8')
208 assert app_settings[key] == value.decode('utf-8')
207
209
208 return response
210 return response
209
211
210
212
211 @pytest.mark.usefixtures('autologin_user', 'app')
213 @pytest.mark.usefixtures('autologin_user', 'app')
212 class TestAdminSettingsVcs:
214 class TestAdminSettingsVcs:
213
215
214 def test_contains_svn_default_patterns(self, app):
216 def test_contains_svn_default_patterns(self, app):
215 response = app.get(url('admin_settings_vcs'))
217 response = app.get(url('admin_settings_vcs'))
216 expected_patterns = [
218 expected_patterns = [
217 '/trunk',
219 '/trunk',
218 '/branches/*',
220 '/branches/*',
219 '/tags/*',
221 '/tags/*',
220 ]
222 ]
221 for pattern in expected_patterns:
223 for pattern in expected_patterns:
222 response.mustcontain(pattern)
224 response.mustcontain(pattern)
223
225
224 def test_add_new_svn_branch_and_tag_pattern(
226 def test_add_new_svn_branch_and_tag_pattern(
225 self, app, backend_svn, form_defaults, disable_sql_cache,
227 self, app, backend_svn, form_defaults, disable_sql_cache,
226 csrf_token):
228 csrf_token):
227 form_defaults.update({
229 form_defaults.update({
228 'new_svn_branch': '/exp/branches/*',
230 'new_svn_branch': '/exp/branches/*',
229 'new_svn_tag': '/important_tags/*',
231 'new_svn_tag': '/important_tags/*',
230 'csrf_token': csrf_token,
232 'csrf_token': csrf_token,
231 })
233 })
232
234
233 response = app.post(
235 response = app.post(
234 url('admin_settings_vcs'), params=form_defaults, status=302)
236 url('admin_settings_vcs'), params=form_defaults, status=302)
235 response = response.follow()
237 response = response.follow()
236
238
237 # Expect to find the new values on the page
239 # Expect to find the new values on the page
238 response.mustcontain('/exp/branches/*')
240 response.mustcontain('/exp/branches/*')
239 response.mustcontain('/important_tags/*')
241 response.mustcontain('/important_tags/*')
240
242
241 # Expect that those patterns are used to match branches and tags now
243 # Expect that those patterns are used to match branches and tags now
242 repo = backend_svn['svn-simple-layout'].scm_instance()
244 repo = backend_svn['svn-simple-layout'].scm_instance()
243 assert 'exp/branches/exp-sphinx-docs' in repo.branches
245 assert 'exp/branches/exp-sphinx-docs' in repo.branches
244 assert 'important_tags/v0.5' in repo.tags
246 assert 'important_tags/v0.5' in repo.tags
245
247
246 def test_add_same_svn_value_twice_shows_an_error_message(
248 def test_add_same_svn_value_twice_shows_an_error_message(
247 self, app, form_defaults, csrf_token, settings_util):
249 self, app, form_defaults, csrf_token, settings_util):
248 settings_util.create_rhodecode_ui('vcs_svn_branch', '/test')
250 settings_util.create_rhodecode_ui('vcs_svn_branch', '/test')
249 settings_util.create_rhodecode_ui('vcs_svn_tag', '/test')
251 settings_util.create_rhodecode_ui('vcs_svn_tag', '/test')
250
252
251 response = app.post(
253 response = app.post(
252 url('admin_settings_vcs'),
254 url('admin_settings_vcs'),
253 params={
255 params={
254 'paths_root_path': form_defaults['paths_root_path'],
256 'paths_root_path': form_defaults['paths_root_path'],
255 'new_svn_branch': '/test',
257 'new_svn_branch': '/test',
256 'new_svn_tag': '/test',
258 'new_svn_tag': '/test',
257 'csrf_token': csrf_token,
259 'csrf_token': csrf_token,
258 },
260 },
259 status=200)
261 status=200)
260
262
261 response.mustcontain("Pattern already exists")
263 response.mustcontain("Pattern already exists")
262 response.mustcontain("Some form inputs contain invalid data.")
264 response.mustcontain("Some form inputs contain invalid data.")
263
265
264 @pytest.mark.parametrize('section', [
266 @pytest.mark.parametrize('section', [
265 'vcs_svn_branch',
267 'vcs_svn_branch',
266 'vcs_svn_tag',
268 'vcs_svn_tag',
267 ])
269 ])
268 def test_delete_svn_patterns(
270 def test_delete_svn_patterns(
269 self, section, app, csrf_token, settings_util):
271 self, section, app, csrf_token, settings_util):
270 setting = settings_util.create_rhodecode_ui(
272 setting = settings_util.create_rhodecode_ui(
271 section, '/test_delete', cleanup=False)
273 section, '/test_delete', cleanup=False)
272
274
273 app.post(
275 app.post(
274 url('admin_settings_vcs'),
276 url('admin_settings_vcs'),
275 params={
277 params={
276 '_method': 'delete',
278 '_method': 'delete',
277 'delete_svn_pattern': setting.ui_id,
279 'delete_svn_pattern': setting.ui_id,
278 'csrf_token': csrf_token},
280 'csrf_token': csrf_token},
279 headers={'X-REQUESTED-WITH': 'XMLHttpRequest'})
281 headers={'X-REQUESTED-WITH': 'XMLHttpRequest'})
280
282
281 @pytest.mark.parametrize('section', [
283 @pytest.mark.parametrize('section', [
282 'vcs_svn_branch',
284 'vcs_svn_branch',
283 'vcs_svn_tag',
285 'vcs_svn_tag',
284 ])
286 ])
285 def test_delete_svn_patterns_raises_400_when_no_xhr(
287 def test_delete_svn_patterns_raises_400_when_no_xhr(
286 self, section, app, csrf_token, settings_util):
288 self, section, app, csrf_token, settings_util):
287 setting = settings_util.create_rhodecode_ui(section, '/test_delete')
289 setting = settings_util.create_rhodecode_ui(section, '/test_delete')
288
290
289 app.post(
291 app.post(
290 url('admin_settings_vcs'),
292 url('admin_settings_vcs'),
291 params={
293 params={
292 '_method': 'delete',
294 '_method': 'delete',
293 'delete_svn_pattern': setting.ui_id,
295 'delete_svn_pattern': setting.ui_id,
294 'csrf_token': csrf_token},
296 'csrf_token': csrf_token},
295 status=400)
297 status=400)
296
298
297 def test_extensions_hgsubversion(self, app, form_defaults, csrf_token):
299 def test_extensions_hgsubversion(self, app, form_defaults, csrf_token):
298 form_defaults.update({
300 form_defaults.update({
299 'csrf_token': csrf_token,
301 'csrf_token': csrf_token,
300 'extensions_hgsubversion': 'True',
302 'extensions_hgsubversion': 'True',
301 })
303 })
302 response = app.post(
304 response = app.post(
303 url('admin_settings_vcs'),
305 url('admin_settings_vcs'),
304 params=form_defaults,
306 params=form_defaults,
305 status=302)
307 status=302)
306
308
307 response = response.follow()
309 response = response.follow()
308 extensions_input = (
310 extensions_input = (
309 '<input id="extensions_hgsubversion" '
311 '<input id="extensions_hgsubversion" '
310 'name="extensions_hgsubversion" type="checkbox" '
312 'name="extensions_hgsubversion" type="checkbox" '
311 'value="True" checked="checked" />')
313 'value="True" checked="checked" />')
312 response.mustcontain(extensions_input)
314 response.mustcontain(extensions_input)
313
315
314 def test_has_a_section_for_pull_request_settings(self, app):
316 def test_has_a_section_for_pull_request_settings(self, app):
315 response = app.get(url('admin_settings_vcs'))
317 response = app.get(url('admin_settings_vcs'))
316 response.mustcontain('Pull Request Settings')
318 response.mustcontain('Pull Request Settings')
317
319
318 def test_has_an_input_for_invalidation_of_inline_comments(
320 def test_has_an_input_for_invalidation_of_inline_comments(
319 self, app):
321 self, app):
320 response = app.get(url('admin_settings_vcs'))
322 response = app.get(url('admin_settings_vcs'))
321 assert_response = AssertResponse(response)
323 assert_response = AssertResponse(response)
322 assert_response.one_element_exists(
324 assert_response.one_element_exists(
323 '[name=rhodecode_use_outdated_comments]')
325 '[name=rhodecode_use_outdated_comments]')
324
326
325 @pytest.mark.parametrize('new_value', [True, False])
327 @pytest.mark.parametrize('new_value', [True, False])
326 def test_allows_to_change_invalidation_of_inline_comments(
328 def test_allows_to_change_invalidation_of_inline_comments(
327 self, app, form_defaults, csrf_token, new_value):
329 self, app, form_defaults, csrf_token, new_value):
328 setting_key = 'use_outdated_comments'
330 setting_key = 'use_outdated_comments'
329 setting = SettingsModel().create_or_update_setting(
331 setting = SettingsModel().create_or_update_setting(
330 setting_key, not new_value, 'bool')
332 setting_key, not new_value, 'bool')
331 Session().add(setting)
333 Session().add(setting)
332 Session().commit()
334 Session().commit()
333
335
334 form_defaults.update({
336 form_defaults.update({
335 'csrf_token': csrf_token,
337 'csrf_token': csrf_token,
336 'rhodecode_use_outdated_comments': str(new_value),
338 'rhodecode_use_outdated_comments': str(new_value),
337 })
339 })
338 response = app.post(
340 response = app.post(
339 url('admin_settings_vcs'),
341 url('admin_settings_vcs'),
340 params=form_defaults,
342 params=form_defaults,
341 status=302)
343 status=302)
342 response = response.follow()
344 response = response.follow()
343 setting = SettingsModel().get_setting_by_name(setting_key)
345 setting = SettingsModel().get_setting_by_name(setting_key)
344 assert setting.app_settings_value is new_value
346 assert setting.app_settings_value is new_value
345
347
346 def test_has_a_section_for_labs_settings_if_enabled(self, app):
348 def test_has_a_section_for_labs_settings_if_enabled(self, app):
347 with mock.patch.dict(
349 with mock.patch.dict(
348 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
350 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
349 response = self.app.get(url('admin_settings_vcs'))
351 response = self.app.get(url('admin_settings_vcs'))
350 response.mustcontain('Labs Settings')
352 response.mustcontain('Labs Settings')
351
353
352 def test_has_not_a_section_for_labs_settings_if_disables(self, app):
354 def test_has_not_a_section_for_labs_settings_if_disables(self, app):
353 with mock.patch.dict(
355 with mock.patch.dict(
354 rhodecode.CONFIG, {'labs_settings_active': 'false'}):
356 rhodecode.CONFIG, {'labs_settings_active': 'false'}):
355 response = self.app.get(url('admin_settings_vcs'))
357 response = self.app.get(url('admin_settings_vcs'))
356 response.mustcontain(no='Labs Settings')
358 response.mustcontain(no='Labs Settings')
357
359
358 @pytest.mark.parametrize('new_value', [True, False])
360 @pytest.mark.parametrize('new_value', [True, False])
359 def test_allows_to_change_hg_rebase_merge_strategy(
361 def test_allows_to_change_hg_rebase_merge_strategy(
360 self, app, form_defaults, csrf_token, new_value):
362 self, app, form_defaults, csrf_token, new_value):
361 setting_key = 'hg_use_rebase_for_merging'
363 setting_key = 'hg_use_rebase_for_merging'
362
364
363 form_defaults.update({
365 form_defaults.update({
364 'csrf_token': csrf_token,
366 'csrf_token': csrf_token,
365 'rhodecode_' + setting_key: str(new_value),
367 'rhodecode_' + setting_key: str(new_value),
366 })
368 })
367
369
368 with mock.patch.dict(
370 with mock.patch.dict(
369 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
371 rhodecode.CONFIG, {'labs_settings_active': 'true'}):
370 app.post(
372 app.post(
371 url('admin_settings_vcs'),
373 url('admin_settings_vcs'),
372 params=form_defaults,
374 params=form_defaults,
373 status=302)
375 status=302)
374
376
375 setting = SettingsModel().get_setting_by_name(setting_key)
377 setting = SettingsModel().get_setting_by_name(setting_key)
376 assert setting.app_settings_value is new_value
378 assert setting.app_settings_value is new_value
377
379
378 @pytest.fixture
380 @pytest.fixture
379 def disable_sql_cache(self, request):
381 def disable_sql_cache(self, request):
380 patcher = mock.patch(
382 patcher = mock.patch(
381 'rhodecode.lib.caching_query.FromCache.process_query')
383 'rhodecode.lib.caching_query.FromCache.process_query')
382 request.addfinalizer(patcher.stop)
384 request.addfinalizer(patcher.stop)
383 patcher.start()
385 patcher.start()
384
386
385 @pytest.fixture
387 @pytest.fixture
386 def form_defaults(self):
388 def form_defaults(self):
387 from rhodecode.controllers.admin.settings import SettingsController
389 from rhodecode.controllers.admin.settings import SettingsController
388 controller = SettingsController()
390 controller = SettingsController()
389 return controller._form_defaults()
391 return controller._form_defaults()
390
392
391 # TODO: johbo: What we really want is to checkpoint before a test run and
393 # TODO: johbo: What we really want is to checkpoint before a test run and
392 # reset the session afterwards.
394 # reset the session afterwards.
393 @pytest.fixture(scope='class', autouse=True)
395 @pytest.fixture(scope='class', autouse=True)
394 def cleanup_settings(self, request, pylonsapp):
396 def cleanup_settings(self, request, pylonsapp):
395 ui_id = RhodeCodeUi.ui_id
397 ui_id = RhodeCodeUi.ui_id
396 original_ids = list(
398 original_ids = list(
397 r.ui_id for r in RhodeCodeUi.query().values(ui_id))
399 r.ui_id for r in RhodeCodeUi.query().values(ui_id))
398
400
399 @request.addfinalizer
401 @request.addfinalizer
400 def cleanup():
402 def cleanup():
401 RhodeCodeUi.query().filter(
403 RhodeCodeUi.query().filter(
402 ui_id.notin_(original_ids)).delete(False)
404 ui_id.notin_(original_ids)).delete(False)
403
405
404
406
405 @pytest.mark.usefixtures('autologin_user', 'app')
407 @pytest.mark.usefixtures('autologin_user', 'app')
406 class TestLabsSettings(object):
408 class TestLabsSettings(object):
407 def test_get_settings_page_disabled(self):
409 def test_get_settings_page_disabled(self):
408 with mock.patch.dict(rhodecode.CONFIG,
410 with mock.patch.dict(rhodecode.CONFIG,
409 {'labs_settings_active': 'false'}):
411 {'labs_settings_active': 'false'}):
410 response = self.app.get(url('admin_settings_labs'), status=302)
412 response = self.app.get(url('admin_settings_labs'), status=302)
411
413
412 assert response.location.endswith(url('admin_settings'))
414 assert response.location.endswith(url('admin_settings'))
413
415
414 def test_get_settings_page_enabled(self):
416 def test_get_settings_page_enabled(self):
415 from rhodecode.controllers.admin import settings
417 from rhodecode.controllers.admin import settings
416 lab_settings = [
418 lab_settings = [
417 settings.LabSetting(
419 settings.LabSetting(
418 key='rhodecode_bool',
420 key='rhodecode_bool',
419 type='bool',
421 type='bool',
420 group='bool group',
422 group='bool group',
421 label='bool label',
423 label='bool label',
422 help='bool help'
424 help='bool help'
423 ),
425 ),
424 settings.LabSetting(
426 settings.LabSetting(
425 key='rhodecode_text',
427 key='rhodecode_text',
426 type='unicode',
428 type='unicode',
427 group='text group',
429 group='text group',
428 label='text label',
430 label='text label',
429 help='text help'
431 help='text help'
430 ),
432 ),
431 ]
433 ]
432 with mock.patch.dict(rhodecode.CONFIG,
434 with mock.patch.dict(rhodecode.CONFIG,
433 {'labs_settings_active': 'true'}):
435 {'labs_settings_active': 'true'}):
434 with mock.patch.object(settings, '_LAB_SETTINGS', lab_settings):
436 with mock.patch.object(settings, '_LAB_SETTINGS', lab_settings):
435 response = self.app.get(url('admin_settings_labs'))
437 response = self.app.get(url('admin_settings_labs'))
436
438
437 assert '<label>bool group:</label>' in response
439 assert '<label>bool group:</label>' in response
438 assert '<label for="rhodecode_bool">bool label</label>' in response
440 assert '<label for="rhodecode_bool">bool label</label>' in response
439 assert '<p class="help-block">bool help</p>' in response
441 assert '<p class="help-block">bool help</p>' in response
440 assert 'name="rhodecode_bool" type="checkbox"' in response
442 assert 'name="rhodecode_bool" type="checkbox"' in response
441
443
442 assert '<label>text group:</label>' in response
444 assert '<label>text group:</label>' in response
443 assert '<label for="rhodecode_text">text label</label>' in response
445 assert '<label for="rhodecode_text">text label</label>' in response
444 assert '<p class="help-block">text help</p>' in response
446 assert '<p class="help-block">text help</p>' in response
445 assert 'name="rhodecode_text" size="60" type="text"' in response
447 assert 'name="rhodecode_text" size="60" type="text"' in response
446
448
447
449
448 @pytest.mark.usefixtures('app')
450 @pytest.mark.usefixtures('app')
449 class TestOpenSourceLicenses(object):
451 class TestOpenSourceLicenses(object):
450
452
451 def _get_url(self):
453 def _get_url(self):
452 return ADMIN_PREFIX + '/settings/open_source'
454 return ADMIN_PREFIX + '/settings/open_source'
453
455
454 def test_records_are_displayed(self, autologin_user):
456 def test_records_are_displayed(self, autologin_user):
455 sample_licenses = {
457 sample_licenses = {
456 "python2.7-pytest-2.7.1": {
458 "python2.7-pytest-2.7.1": {
457 "UNKNOWN": None
459 "UNKNOWN": None
458 },
460 },
459 "python2.7-Markdown-2.6.2": {
461 "python2.7-Markdown-2.6.2": {
460 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
462 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
461 }
463 }
462 }
464 }
463 read_licenses_patch = mock.patch(
465 read_licenses_patch = mock.patch(
464 'rhodecode.admin.views.read_opensource_licenses',
466 'rhodecode.admin.views.read_opensource_licenses',
465 return_value=sample_licenses)
467 return_value=sample_licenses)
466 with read_licenses_patch:
468 with read_licenses_patch:
467 response = self.app.get(self._get_url(), status=200)
469 response = self.app.get(self._get_url(), status=200)
468
470
469 assert_response = AssertResponse(response)
471 assert_response = AssertResponse(response)
470 assert_response.element_contains(
472 assert_response.element_contains(
471 '.panel-heading', 'Licenses of Third Party Packages')
473 '.panel-heading', 'Licenses of Third Party Packages')
472 for name in sample_licenses:
474 for name in sample_licenses:
473 response.mustcontain(name)
475 response.mustcontain(name)
474 for license in sample_licenses[name]:
476 for license in sample_licenses[name]:
475 assert_response.element_contains('.panel-body', license)
477 assert_response.element_contains('.panel-body', license)
476
478
477 def test_records_can_be_read(self, autologin_user):
479 def test_records_can_be_read(self, autologin_user):
478 response = self.app.get(self._get_url(), status=200)
480 response = self.app.get(self._get_url(), status=200)
479 assert_response = AssertResponse(response)
481 assert_response = AssertResponse(response)
480 assert_response.element_contains(
482 assert_response.element_contains(
481 '.panel-heading', 'Licenses of Third Party Packages')
483 '.panel-heading', 'Licenses of Third Party Packages')
482
484
483 def test_forbidden_when_normal_user(self, autologin_regular_user):
485 def test_forbidden_when_normal_user(self, autologin_regular_user):
484 self.app.get(self._get_url(), status=403)
486 self.app.get(self._get_url(), status=403)
485
487
486
488
487 @pytest.mark.usefixtures("app")
489 @pytest.mark.usefixtures("app")
488 class TestAdminSettingsIssueTracker:
490 class TestAdminSettingsIssueTracker:
489 RC_PREFIX = 'rhodecode_'
491 RC_PREFIX = 'rhodecode_'
490 SHORT_PATTERN_KEY = 'issuetracker_pat_'
492 SHORT_PATTERN_KEY = 'issuetracker_pat_'
491 PATTERN_KEY = RC_PREFIX + SHORT_PATTERN_KEY
493 PATTERN_KEY = RC_PREFIX + SHORT_PATTERN_KEY
492
494
493 def test_issuetracker_index(self, autologin_user):
495 def test_issuetracker_index(self, autologin_user):
494 response = self.app.get(url('admin_settings_issuetracker'))
496 response = self.app.get(url('admin_settings_issuetracker'))
495 assert response.status_code == 200
497 assert response.status_code == 200
496
498
497 def test_add_empty_issuetracker_pattern(
499 def test_add_empty_issuetracker_pattern(
498 self, request, autologin_user, csrf_token):
500 self, request, autologin_user, csrf_token):
499 post_url = url('admin_settings_issuetracker_save')
501 post_url = url('admin_settings_issuetracker_save')
500 post_data = {
502 post_data = {
501 'csrf_token': csrf_token
503 'csrf_token': csrf_token
502 }
504 }
503 self.app.post(post_url, post_data, status=302)
505 self.app.post(post_url, post_data, status=302)
504
506
505 def test_add_issuetracker_pattern(
507 def test_add_issuetracker_pattern(
506 self, request, autologin_user, csrf_token):
508 self, request, autologin_user, csrf_token):
507 pattern = 'issuetracker_pat'
509 pattern = 'issuetracker_pat'
508 another_pattern = pattern+'1'
510 another_pattern = pattern+'1'
509 post_url = url('admin_settings_issuetracker_save')
511 post_url = url('admin_settings_issuetracker_save')
510 post_data = {
512 post_data = {
511 'new_pattern_pattern_0': pattern,
513 'new_pattern_pattern_0': pattern,
512 'new_pattern_url_0': 'url',
514 'new_pattern_url_0': 'url',
513 'new_pattern_prefix_0': 'prefix',
515 'new_pattern_prefix_0': 'prefix',
514 'new_pattern_description_0': 'description',
516 'new_pattern_description_0': 'description',
515 'new_pattern_pattern_1': another_pattern,
517 'new_pattern_pattern_1': another_pattern,
516 'new_pattern_url_1': 'url1',
518 'new_pattern_url_1': 'url1',
517 'new_pattern_prefix_1': 'prefix1',
519 'new_pattern_prefix_1': 'prefix1',
518 'new_pattern_description_1': 'description1',
520 'new_pattern_description_1': 'description1',
519 'csrf_token': csrf_token
521 'csrf_token': csrf_token
520 }
522 }
521 self.app.post(post_url, post_data, status=302)
523 self.app.post(post_url, post_data, status=302)
522 settings = SettingsModel().get_all_settings()
524 settings = SettingsModel().get_all_settings()
523 self.uid = md5(pattern)
525 self.uid = md5(pattern)
524 assert settings[self.PATTERN_KEY+self.uid] == pattern
526 assert settings[self.PATTERN_KEY+self.uid] == pattern
525 self.another_uid = md5(another_pattern)
527 self.another_uid = md5(another_pattern)
526 assert settings[self.PATTERN_KEY+self.another_uid] == another_pattern
528 assert settings[self.PATTERN_KEY+self.another_uid] == another_pattern
527
529
528 @request.addfinalizer
530 @request.addfinalizer
529 def cleanup():
531 def cleanup():
530 defaults = SettingsModel().get_all_settings()
532 defaults = SettingsModel().get_all_settings()
531
533
532 entries = [name for name in defaults if (
534 entries = [name for name in defaults if (
533 (self.uid in name) or (self.another_uid) in name)]
535 (self.uid in name) or (self.another_uid) in name)]
534 start = len(self.RC_PREFIX)
536 start = len(self.RC_PREFIX)
535 for del_key in entries:
537 for del_key in entries:
536 # TODO: anderson: get_by_name needs name without prefix
538 # TODO: anderson: get_by_name needs name without prefix
537 entry = SettingsModel().get_setting_by_name(del_key[start:])
539 entry = SettingsModel().get_setting_by_name(del_key[start:])
538 Session().delete(entry)
540 Session().delete(entry)
539
541
540 Session().commit()
542 Session().commit()
541
543
542 def test_edit_issuetracker_pattern(
544 def test_edit_issuetracker_pattern(
543 self, autologin_user, backend, csrf_token, request):
545 self, autologin_user, backend, csrf_token, request):
544 old_pattern = 'issuetracker_pat'
546 old_pattern = 'issuetracker_pat'
545 old_uid = md5(old_pattern)
547 old_uid = md5(old_pattern)
546 pattern = 'issuetracker_pat_new'
548 pattern = 'issuetracker_pat_new'
547 self.new_uid = md5(pattern)
549 self.new_uid = md5(pattern)
548
550
549 SettingsModel().create_or_update_setting(
551 SettingsModel().create_or_update_setting(
550 self.SHORT_PATTERN_KEY+old_uid, old_pattern, 'unicode')
552 self.SHORT_PATTERN_KEY+old_uid, old_pattern, 'unicode')
551
553
552 post_url = url('admin_settings_issuetracker_save')
554 post_url = url('admin_settings_issuetracker_save')
553 post_data = {
555 post_data = {
554 'new_pattern_pattern_0': pattern,
556 'new_pattern_pattern_0': pattern,
555 'new_pattern_url_0': 'url',
557 'new_pattern_url_0': 'url',
556 'new_pattern_prefix_0': 'prefix',
558 'new_pattern_prefix_0': 'prefix',
557 'new_pattern_description_0': 'description',
559 'new_pattern_description_0': 'description',
558 'uid': old_uid,
560 'uid': old_uid,
559 'csrf_token': csrf_token
561 'csrf_token': csrf_token
560 }
562 }
561 self.app.post(post_url, post_data, status=302)
563 self.app.post(post_url, post_data, status=302)
562 settings = SettingsModel().get_all_settings()
564 settings = SettingsModel().get_all_settings()
563 assert settings[self.PATTERN_KEY+self.new_uid] == pattern
565 assert settings[self.PATTERN_KEY+self.new_uid] == pattern
564 assert self.PATTERN_KEY+old_uid not in settings
566 assert self.PATTERN_KEY+old_uid not in settings
565
567
566 @request.addfinalizer
568 @request.addfinalizer
567 def cleanup():
569 def cleanup():
568 IssueTrackerSettingsModel().delete_entries(self.new_uid)
570 IssueTrackerSettingsModel().delete_entries(self.new_uid)
569
571
570 def test_replace_issuetracker_pattern_description(
572 def test_replace_issuetracker_pattern_description(
571 self, autologin_user, csrf_token, request, settings_util):
573 self, autologin_user, csrf_token, request, settings_util):
572 prefix = 'issuetracker'
574 prefix = 'issuetracker'
573 pattern = 'issuetracker_pat'
575 pattern = 'issuetracker_pat'
574 self.uid = md5(pattern)
576 self.uid = md5(pattern)
575 pattern_key = '_'.join([prefix, 'pat', self.uid])
577 pattern_key = '_'.join([prefix, 'pat', self.uid])
576 rc_pattern_key = '_'.join(['rhodecode', pattern_key])
578 rc_pattern_key = '_'.join(['rhodecode', pattern_key])
577 desc_key = '_'.join([prefix, 'desc', self.uid])
579 desc_key = '_'.join([prefix, 'desc', self.uid])
578 rc_desc_key = '_'.join(['rhodecode', desc_key])
580 rc_desc_key = '_'.join(['rhodecode', desc_key])
579 new_description = 'new_description'
581 new_description = 'new_description'
580
582
581 settings_util.create_rhodecode_setting(
583 settings_util.create_rhodecode_setting(
582 pattern_key, pattern, 'unicode', cleanup=False)
584 pattern_key, pattern, 'unicode', cleanup=False)
583 settings_util.create_rhodecode_setting(
585 settings_util.create_rhodecode_setting(
584 desc_key, 'old description', 'unicode', cleanup=False)
586 desc_key, 'old description', 'unicode', cleanup=False)
585
587
586 post_url = url('admin_settings_issuetracker_save')
588 post_url = url('admin_settings_issuetracker_save')
587 post_data = {
589 post_data = {
588 'new_pattern_pattern_0': pattern,
590 'new_pattern_pattern_0': pattern,
589 'new_pattern_url_0': 'url',
591 'new_pattern_url_0': 'url',
590 'new_pattern_prefix_0': 'prefix',
592 'new_pattern_prefix_0': 'prefix',
591 'new_pattern_description_0': new_description,
593 'new_pattern_description_0': new_description,
592 'uid': self.uid,
594 'uid': self.uid,
593 'csrf_token': csrf_token
595 'csrf_token': csrf_token
594 }
596 }
595 self.app.post(post_url, post_data, status=302)
597 self.app.post(post_url, post_data, status=302)
596 settings = SettingsModel().get_all_settings()
598 settings = SettingsModel().get_all_settings()
597 assert settings[rc_pattern_key] == pattern
599 assert settings[rc_pattern_key] == pattern
598 assert settings[rc_desc_key] == new_description
600 assert settings[rc_desc_key] == new_description
599
601
600 @request.addfinalizer
602 @request.addfinalizer
601 def cleanup():
603 def cleanup():
602 IssueTrackerSettingsModel().delete_entries(self.uid)
604 IssueTrackerSettingsModel().delete_entries(self.uid)
603
605
604 def test_delete_issuetracker_pattern(
606 def test_delete_issuetracker_pattern(
605 self, autologin_user, backend, csrf_token, settings_util):
607 self, autologin_user, backend, csrf_token, settings_util):
606 pattern = 'issuetracker_pat'
608 pattern = 'issuetracker_pat'
607 uid = md5(pattern)
609 uid = md5(pattern)
608 settings_util.create_rhodecode_setting(
610 settings_util.create_rhodecode_setting(
609 self.SHORT_PATTERN_KEY+uid, pattern, 'unicode', cleanup=False)
611 self.SHORT_PATTERN_KEY+uid, pattern, 'unicode', cleanup=False)
610
612
611 post_url = url('admin_issuetracker_delete')
613 post_url = url('admin_issuetracker_delete')
612 post_data = {
614 post_data = {
613 '_method': 'delete',
615 '_method': 'delete',
614 'uid': uid,
616 'uid': uid,
615 'csrf_token': csrf_token
617 'csrf_token': csrf_token
616 }
618 }
617 self.app.post(post_url, post_data, status=302)
619 self.app.post(post_url, post_data, status=302)
618 settings = SettingsModel().get_all_settings()
620 settings = SettingsModel().get_all_settings()
619 assert 'rhodecode_%s%s' % (self.SHORT_PATTERN_KEY, uid) not in settings
621 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