##// END OF EJS Templates
tests: Fixed ecpected results.
Martin Bornhold -
r462:e1f66798 default
parent child Browse files
Show More
@@ -1,522 +1,525 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 re
21 import re
22 import os
22 import os
23
23
24 import mock
24 import mock
25 import pytest
25 import pytest
26
26
27 from rhodecode.controllers import summary
27 from rhodecode.controllers import summary
28 from rhodecode.lib import vcs
28 from rhodecode.lib import vcs
29 from rhodecode.lib import helpers as h
29 from rhodecode.lib import helpers as h
30 from rhodecode.lib.compat import OrderedDict
30 from rhodecode.lib.compat import OrderedDict
31 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
31 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
32 from rhodecode.model.db import Repository
32 from rhodecode.model.db import Repository
33 from rhodecode.model.meta import Session
33 from rhodecode.model.meta import Session
34 from rhodecode.model.repo import RepoModel
34 from rhodecode.model.repo import RepoModel
35 from rhodecode.model.scm import ScmModel
35 from rhodecode.model.scm import ScmModel
36 from rhodecode.tests import (
36 from rhodecode.tests import (
37 TestController, url, HG_REPO, assert_session_flash, TESTS_TMP_PATH)
37 TestController, url, HG_REPO, assert_session_flash, TESTS_TMP_PATH)
38 from rhodecode.tests.fixture import Fixture
38 from rhodecode.tests.fixture import Fixture
39 from rhodecode.tests.utils import AssertResponse
39 from rhodecode.tests.utils import AssertResponse
40
40
41
41
42 fixture = Fixture()
42 fixture = Fixture()
43
43
44
44
45 class TestSummaryController(TestController):
45 class TestSummaryController(TestController):
46 def test_index(self, backend):
46 def test_index(self, backend):
47 self.log_user()
47 self.log_user()
48 repo_id = backend.repo.repo_id
48 repo_id = backend.repo.repo_id
49 repo_name = backend.repo_name
49 repo_name = backend.repo_name
50 with mock.patch('rhodecode.lib.helpers.is_svn_without_proxy',
50 with mock.patch('rhodecode.lib.helpers.is_svn_without_proxy',
51 return_value=False):
51 return_value=False):
52 response = self.app.get(url('summary_home', repo_name=repo_name))
52 response = self.app.get(url('summary_home', repo_name=repo_name))
53
53
54 # repo type
54 # repo type
55 response.mustcontain(
55 response.mustcontain(
56 '<i class="icon-%s">' % (backend.alias, )
56 '<i class="icon-%s">' % (backend.alias, )
57 )
57 )
58 # public/private
58 # public/private
59 response.mustcontain(
59 response.mustcontain(
60 """<i class="icon-unlock-alt">"""
60 """<i class="icon-unlock-alt">"""
61 )
61 )
62
62
63 # clone url...
63 # clone url...
64 response.mustcontain(
64 response.mustcontain(
65 'id="clone_url" readonly="readonly"'
65 'id="clone_url" readonly="readonly"'
66 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
66 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
67 response.mustcontain(
67 response.mustcontain(
68 'id="clone_url_id" readonly="readonly"'
68 'id="clone_url_id" readonly="readonly"'
69 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
69 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
70
70
71 def test_index_svn_without_proxy(self, backend_svn):
71 def test_index_svn_without_proxy(self, backend_svn):
72 self.log_user()
72 self.log_user()
73 repo_id = backend_svn.repo.repo_id
73 repo_id = backend_svn.repo.repo_id
74 repo_name = backend_svn.repo_name
74 repo_name = backend_svn.repo_name
75 response = self.app.get(url('summary_home', repo_name=repo_name))
75 response = self.app.get(url('summary_home', repo_name=repo_name))
76 # clone url...
76 # clone url...
77 response.mustcontain(
77 response.mustcontain(
78 'id="clone_url" disabled'
78 'id="clone_url" disabled'
79 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
79 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
80 response.mustcontain(
80 response.mustcontain(
81 'id="clone_url_id" disabled'
81 'id="clone_url_id" disabled'
82 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
82 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
83
83
84 def test_index_with_trailing_slash(self, autologin_user, backend):
84 def test_index_with_trailing_slash(self, autologin_user, backend):
85 repo_id = backend.repo.repo_id
85 repo_id = backend.repo.repo_id
86 repo_name = backend.repo_name
86 repo_name = backend.repo_name
87 with mock.patch('rhodecode.lib.helpers.is_svn_without_proxy',
87 with mock.patch('rhodecode.lib.helpers.is_svn_without_proxy',
88 return_value=False):
88 return_value=False):
89 response = self.app.get(
89 response = self.app.get(
90 url('summary_home', repo_name=repo_name) + '/',
90 url('summary_home', repo_name=repo_name) + '/',
91 status=200)
91 status=200)
92
92
93 # clone url...
93 # clone url...
94 response.mustcontain(
94 response.mustcontain(
95 'id="clone_url" readonly="readonly"'
95 'id="clone_url" readonly="readonly"'
96 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
96 ' value="http://test_admin@test.example.com:80/%s"' % (repo_name, ))
97 response.mustcontain(
97 response.mustcontain(
98 'id="clone_url_id" readonly="readonly"'
98 'id="clone_url_id" readonly="readonly"'
99 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
99 ' value="http://test_admin@test.example.com:80/_%s"' % (repo_id, ))
100
100
101 def test_index_by_id(self, backend):
101 def test_index_by_id(self, backend):
102 self.log_user()
102 self.log_user()
103 repo_id = backend.repo.repo_id
103 repo_id = backend.repo.repo_id
104 response = self.app.get(url(
104 response = self.app.get(url(
105 'summary_home', repo_name='_%s' % (repo_id,)))
105 'summary_home', repo_name='_%s' % (repo_id,)))
106
106
107 # repo type
107 # repo type
108 response.mustcontain(
108 response.mustcontain(
109 '<i class="icon-%s">' % (backend.alias, )
109 '<i class="icon-%s">' % (backend.alias, )
110 )
110 )
111 # public/private
111 # public/private
112 response.mustcontain(
112 response.mustcontain(
113 """<i class="icon-unlock-alt">"""
113 """<i class="icon-unlock-alt">"""
114 )
114 )
115
115
116 def test_index_by_repo_having_id_path_in_name_hg(self):
116 def test_index_by_repo_having_id_path_in_name_hg(self):
117 self.log_user()
117 self.log_user()
118 fixture.create_repo(name='repo_1')
118 fixture.create_repo(name='repo_1')
119 response = self.app.get(url('summary_home', repo_name='repo_1'))
119 response = self.app.get(url('summary_home', repo_name='repo_1'))
120
120
121 try:
121 try:
122 response.mustcontain("repo_1")
122 response.mustcontain("repo_1")
123 finally:
123 finally:
124 RepoModel().delete(Repository.get_by_repo_name('repo_1'))
124 RepoModel().delete(Repository.get_by_repo_name('repo_1'))
125 Session().commit()
125 Session().commit()
126
126
127 def test_index_with_anonymous_access_disabled(self):
127 def test_index_with_anonymous_access_disabled(self):
128 with fixture.anon_access(False):
128 with fixture.anon_access(False):
129 response = self.app.get(url('summary_home', repo_name=HG_REPO),
129 response = self.app.get(url('summary_home', repo_name=HG_REPO),
130 status=302)
130 status=302)
131 assert 'login' in response.location
131 assert 'login' in response.location
132
132
133 def _enable_stats(self, repo):
133 def _enable_stats(self, repo):
134 r = Repository.get_by_repo_name(repo)
134 r = Repository.get_by_repo_name(repo)
135 r.enable_statistics = True
135 r.enable_statistics = True
136 Session().add(r)
136 Session().add(r)
137 Session().commit()
137 Session().commit()
138
138
139 expected_trending = {
139 expected_trending = {
140 'hg': {
140 'hg': {
141 "py": {"count": 68, "desc": ["Python"]},
141 "py": {"count": 68, "desc": ["Python"]},
142 "rst": {"count": 16, "desc": ["Rst"]},
142 "rst": {"count": 16, "desc": ["Rst"]},
143 "css": {"count": 2, "desc": ["Css"]},
143 "css": {"count": 2, "desc": ["Css"]},
144 "sh": {"count": 2, "desc": ["Bash"]},
144 "sh": {"count": 2, "desc": ["Bash"]},
145 "bat": {"count": 1, "desc": ["Batch"]},
145 "bat": {"count": 1, "desc": ["Batch"]},
146 "cfg": {"count": 1, "desc": ["Ini"]},
146 "cfg": {"count": 1, "desc": ["Ini"]},
147 "html": {"count": 1, "desc": ["EvoqueHtml", "Html"]},
147 "html": {"count": 1, "desc": ["EvoqueHtml", "Html"]},
148 "ini": {"count": 1, "desc": ["Ini"]},
148 "ini": {"count": 1, "desc": ["Ini"]},
149 "js": {"count": 1, "desc": ["Javascript"]},
149 "js": {"count": 1, "desc": ["Javascript"]},
150 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]}
150 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]}
151 },
151 },
152 'git': {
152 'git': {
153 "py": {"count": 68, "desc": ["Python"]},
153 "py": {"count": 68, "desc": ["Python"]},
154 "rst": {"count": 16, "desc": ["Rst"]},
154 "rst": {"count": 16, "desc": ["Rst"]},
155 "css": {"count": 2, "desc": ["Css"]},
155 "css": {"count": 2, "desc": ["Css"]},
156 "sh": {"count": 2, "desc": ["Bash"]},
156 "sh": {"count": 2, "desc": ["Bash"]},
157 "bat": {"count": 1, "desc": ["Batch"]},
157 "bat": {"count": 1, "desc": ["Batch"]},
158 "cfg": {"count": 1, "desc": ["Ini"]},
158 "cfg": {"count": 1, "desc": ["Ini"]},
159 "html": {"count": 1, "desc": ["EvoqueHtml", "Html"]},
159 "html": {"count": 1, "desc": ["EvoqueHtml", "Html"]},
160 "ini": {"count": 1, "desc": ["Ini"]},
160 "ini": {"count": 1, "desc": ["Ini"]},
161 "js": {"count": 1, "desc": ["Javascript"]},
161 "js": {"count": 1, "desc": ["Javascript"]},
162 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]}
162 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]}
163 },
163 },
164 'svn': {
164 'svn': {
165 "py": {"count": 75, "desc": ["Python"]},
165 "py": {"count": 75, "desc": ["Python"]},
166 "rst": {"count": 16, "desc": ["Rst"]},
166 "rst": {"count": 16, "desc": ["Rst"]},
167 "html": {"count": 11, "desc": ["EvoqueHtml", "Html"]},
167 "html": {"count": 11, "desc": ["EvoqueHtml", "Html"]},
168 "css": {"count": 2, "desc": ["Css"]},
168 "css": {"count": 2, "desc": ["Css"]},
169 "bat": {"count": 1, "desc": ["Batch"]},
169 "bat": {"count": 1, "desc": ["Batch"]},
170 "cfg": {"count": 1, "desc": ["Ini"]},
170 "cfg": {"count": 1, "desc": ["Ini"]},
171 "ini": {"count": 1, "desc": ["Ini"]},
171 "ini": {"count": 1, "desc": ["Ini"]},
172 "js": {"count": 1, "desc": ["Javascript"]},
172 "js": {"count": 1, "desc": ["Javascript"]},
173 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]},
173 "makefile": {"count": 1, "desc": ["Makefile", "Makefile"]},
174 "sh": {"count": 1, "desc": ["Bash"]}
174 "sh": {"count": 1, "desc": ["Bash"]}
175 },
175 },
176 }
176 }
177
177
178 def test_repo_stats(self, backend, xhr_header):
178 def test_repo_stats(self, backend, xhr_header):
179 self.log_user()
179 self.log_user()
180 response = self.app.get(
180 response = self.app.get(
181 url('repo_stats',
181 url('repo_stats',
182 repo_name=backend.repo_name, commit_id='tip'),
182 repo_name=backend.repo_name, commit_id='tip'),
183 extra_environ=xhr_header,
183 extra_environ=xhr_header,
184 status=200)
184 status=200)
185 assert re.match(r'6[\d\.]+ KiB', response.json['size'])
185 assert re.match(r'6[\d\.]+ KiB', response.json['size'])
186
186
187 def test_repo_stats_code_stats_enabled(self, backend, xhr_header):
187 def test_repo_stats_code_stats_enabled(self, backend, xhr_header):
188 self.log_user()
188 self.log_user()
189 repo_name = backend.repo_name
189 repo_name = backend.repo_name
190
190
191 # codes stats
191 # codes stats
192 self._enable_stats(repo_name)
192 self._enable_stats(repo_name)
193 ScmModel().mark_for_invalidation(repo_name)
193 ScmModel().mark_for_invalidation(repo_name)
194
194
195 response = self.app.get(
195 response = self.app.get(
196 url('repo_stats',
196 url('repo_stats',
197 repo_name=backend.repo_name, commit_id='tip'),
197 repo_name=backend.repo_name, commit_id='tip'),
198 extra_environ=xhr_header,
198 extra_environ=xhr_header,
199 status=200)
199 status=200)
200
200
201 expected_data = self.expected_trending[backend.alias]
201 expected_data = self.expected_trending[backend.alias]
202 returned_stats = response.json['code_stats']
202 returned_stats = response.json['code_stats']
203 for k, v in expected_data.items():
203 for k, v in expected_data.items():
204 assert v == returned_stats[k]
204 assert v == returned_stats[k]
205
205
206 def test_repo_refs_data(self, backend):
206 def test_repo_refs_data(self, backend):
207 response = self.app.get(
207 response = self.app.get(
208 url('repo_refs_data', repo_name=backend.repo_name),
208 url('repo_refs_data', repo_name=backend.repo_name),
209 status=200)
209 status=200)
210
210
211 # Ensure that there is the correct amount of items in the result
211 # Ensure that there is the correct amount of items in the result
212 repo = backend.repo.scm_instance()
212 repo = backend.repo.scm_instance()
213 data = response.json['results']
213 data = response.json['results']
214 items = sum(len(section['children']) for section in data)
214 items = sum(len(section['children']) for section in data)
215 repo_refs = len(repo.branches) + len(repo.tags) + len(repo.bookmarks)
215 repo_refs = len(repo.branches) + len(repo.tags) + len(repo.bookmarks)
216 assert items == repo_refs
216 assert items == repo_refs
217
217
218 def test_index_shows_missing_requirements_message(
218 def test_index_shows_missing_requirements_message(
219 self, backend, autologin_user):
219 self, backend, autologin_user):
220 repo_name = backend.repo_name
220 repo_name = backend.repo_name
221 scm_patcher = mock.patch.object(
221 scm_patcher = mock.patch.object(
222 Repository, 'scm_instance', side_effect=RepositoryRequirementError)
222 Repository, 'scm_instance', side_effect=RepositoryRequirementError)
223
223
224 with scm_patcher:
224 with scm_patcher:
225 response = self.app.get(url('summary_home', repo_name=repo_name))
225 response = self.app.get(url('summary_home', repo_name=repo_name))
226 assert_response = AssertResponse(response)
226 assert_response = AssertResponse(response)
227 assert_response.element_contains(
227 assert_response.element_contains(
228 '.main .alert-warning strong', 'Missing requirements')
228 '.main .alert-warning strong', 'Missing requirements')
229 assert_response.element_contains(
229 assert_response.element_contains(
230 '.main .alert-warning',
230 '.main .alert-warning',
231 'These commits cannot be displayed, because this repository'
231 'These commits cannot be displayed, because this repository'
232 ' uses the Mercurial largefiles extension, which was not enabled.')
232 ' uses the Mercurial largefiles extension, which was not enabled.')
233
233
234 def test_missing_requirements_page_does_not_contains_switch_to(
234 def test_missing_requirements_page_does_not_contains_switch_to(
235 self, backend):
235 self, backend):
236 self.log_user()
236 self.log_user()
237 repo_name = backend.repo_name
237 repo_name = backend.repo_name
238 scm_patcher = mock.patch.object(
238 scm_patcher = mock.patch.object(
239 Repository, 'scm_instance', side_effect=RepositoryRequirementError)
239 Repository, 'scm_instance', side_effect=RepositoryRequirementError)
240
240
241 with scm_patcher:
241 with scm_patcher:
242 response = self.app.get(url('summary_home', repo_name=repo_name))
242 response = self.app.get(url('summary_home', repo_name=repo_name))
243 response.mustcontain(no='Switch To')
243 response.mustcontain(no='Switch To')
244
244
245
245
246 @pytest.mark.usefixtures('pylonsapp')
246 @pytest.mark.usefixtures('pylonsapp')
247 class TestSwitcherReferenceData:
247 class TestSwitcherReferenceData:
248
248
249 def test_creates_reference_urls_based_on_name(self):
249 def test_creates_reference_urls_based_on_name(self):
250 references = {
250 references = {
251 'name': 'commit_id',
251 'name': 'commit_id',
252 }
252 }
253 controller = summary.SummaryController()
253 controller = summary.SummaryController()
254 is_svn = False
254 is_svn = False
255 result = controller._switcher_reference_data(
255 result = controller._switcher_reference_data(
256 'repo_name', references, is_svn)
256 'repo_name', references, is_svn)
257 expected_url = h.url(
257 expected_url = h.url(
258 'files_home', repo_name='repo_name', revision='name',
258 'files_home', repo_name='repo_name', revision='name',
259 at='name')
259 at='name')
260 assert result[0]['files_url'] == expected_url
260 assert result[0]['files_url'] == expected_url
261
261
262 def test_urls_contain_commit_id_if_slash_in_name(self):
262 def test_urls_contain_commit_id_if_slash_in_name(self):
263 references = {
263 references = {
264 'name/with/slash': 'commit_id',
264 'name/with/slash': 'commit_id',
265 }
265 }
266 controller = summary.SummaryController()
266 controller = summary.SummaryController()
267 is_svn = False
267 is_svn = False
268 result = controller._switcher_reference_data(
268 result = controller._switcher_reference_data(
269 'repo_name', references, is_svn)
269 'repo_name', references, is_svn)
270 expected_url = h.url(
270 expected_url = h.url(
271 'files_home', repo_name='repo_name', revision='commit_id',
271 'files_home', repo_name='repo_name', revision='commit_id',
272 at='name/with/slash')
272 at='name/with/slash')
273 assert result[0]['files_url'] == expected_url
273 assert result[0]['files_url'] == expected_url
274
274
275 def test_adds_reference_to_path_for_svn(self):
275 def test_adds_reference_to_path_for_svn(self):
276 references = {
276 references = {
277 'name/with/slash': 'commit_id',
277 'name/with/slash': 'commit_id',
278 }
278 }
279 controller = summary.SummaryController()
279 controller = summary.SummaryController()
280 is_svn = True
280 is_svn = True
281 result = controller._switcher_reference_data(
281 result = controller._switcher_reference_data(
282 'repo_name', references, is_svn)
282 'repo_name', references, is_svn)
283 expected_url = h.url(
283 expected_url = h.url(
284 'files_home', repo_name='repo_name', f_path='name/with/slash',
284 'files_home', repo_name='repo_name', f_path='name/with/slash',
285 revision='commit_id', at='name/with/slash')
285 revision='commit_id', at='name/with/slash')
286 assert result[0]['files_url'] == expected_url
286 assert result[0]['files_url'] == expected_url
287
287
288
288
289 @pytest.mark.usefixtures('pylonsapp')
289 @pytest.mark.usefixtures('pylonsapp')
290 class TestCreateReferenceData:
290 class TestCreateReferenceData:
291
291
292 @pytest.fixture
292 @pytest.fixture
293 def example_refs(self):
293 def example_refs(self):
294 section_1_refs = OrderedDict((('a', 'a_id'), ('b', 'b_id')))
294 section_1_refs = OrderedDict((('a', 'a_id'), ('b', 'b_id')))
295 example_refs = [
295 example_refs = [
296 ('section_1', section_1_refs, 't1'),
296 ('section_1', section_1_refs, 't1'),
297 ('section_2', {'c': 'c_id'}, 't2'),
297 ('section_2', {'c': 'c_id'}, 't2'),
298 ]
298 ]
299 return example_refs
299 return example_refs
300
300
301 def test_generates_refs_based_on_commit_ids(self, example_refs):
301 def test_generates_refs_based_on_commit_ids(self, example_refs):
302 repo = mock.Mock()
302 repo = mock.Mock()
303 repo.name = 'test-repo'
303 repo.name = 'test-repo'
304 repo.alias = 'git'
304 repo.alias = 'git'
305 full_repo_name = 'pytest-repo-group/' + repo.name
305 full_repo_name = 'pytest-repo-group/' + repo.name
306 controller = summary.SummaryController()
306 controller = summary.SummaryController()
307
307
308 result = controller._create_reference_data(
308 result = controller._create_reference_data(
309 repo, full_repo_name, example_refs)
309 repo, full_repo_name, example_refs)
310
310
311 expected_files_url = '/{}/files/'.format(full_repo_name)
311 expected_result = [
312 expected_result = [
312 {
313 {
313 'children': [
314 'children': [
314 {
315 {
315 'id': 'a', 'raw_id': 'a_id', 'text': 'a', 'type': 't1',
316 'id': 'a', 'raw_id': 'a_id', 'text': 'a', 'type': 't1',
316 'files_url': '/test-repo/files/a/?at=a'
317 'files_url': expected_files_url + 'a/?at=a',
317 },
318 },
318 {
319 {
319 'id': 'b', 'raw_id': 'b_id', 'text': 'b', 'type': 't1',
320 'id': 'b', 'raw_id': 'b_id', 'text': 'b', 'type': 't1',
320 'files_url': '/test-repo/files/b/?at=b'
321 'files_url': expected_files_url + 'b/?at=b',
321 }
322 }
322 ],
323 ],
323 'text': 'section_1'
324 'text': 'section_1'
324 },
325 },
325 {
326 {
326 'children': [
327 'children': [
327 {
328 {
328 'id': 'c', 'raw_id': 'c_id', 'text': 'c', 'type': 't2',
329 'id': 'c', 'raw_id': 'c_id', 'text': 'c', 'type': 't2',
329 'files_url': '/test-repo/files/c/?at=c'
330 'files_url': expected_files_url + 'c/?at=c',
330 }
331 }
331 ],
332 ],
332 'text': 'section_2'
333 'text': 'section_2'
333 }]
334 }]
334 assert result == expected_result
335 assert result == expected_result
335
336
336 def test_generates_refs_with_path_for_svn(self, example_refs):
337 def test_generates_refs_with_path_for_svn(self, example_refs):
337 repo = mock.Mock()
338 repo = mock.Mock()
338 repo.name = 'test-repo'
339 repo.name = 'test-repo'
339 repo.alias = 'svn'
340 repo.alias = 'svn'
340 full_repo_name = 'pytest-repo-group/' + repo.name
341 full_repo_name = 'pytest-repo-group/' + repo.name
341 controller = summary.SummaryController()
342 controller = summary.SummaryController()
342 result = controller._create_reference_data(
343 result = controller._create_reference_data(
343 repo, full_repo_name, example_refs)
344 repo, full_repo_name, example_refs)
344
345
346 expected_files_url = '/{}/files/'.format(full_repo_name)
345 expected_result = [
347 expected_result = [
346 {
348 {
347 'children': [
349 'children': [
348 {
350 {
349 'id': 'a@a_id', 'raw_id': 'a_id',
351 'id': 'a@a_id', 'raw_id': 'a_id',
350 'text': 'a', 'type': 't1',
352 'text': 'a', 'type': 't1',
351 'files_url': '/test-repo/files/a_id/a?at=a'
353 'files_url': expected_files_url + 'a_id/a?at=a',
352 },
354 },
353 {
355 {
354 'id': 'b@b_id', 'raw_id': 'b_id',
356 'id': 'b@b_id', 'raw_id': 'b_id',
355 'text': 'b', 'type': 't1',
357 'text': 'b', 'type': 't1',
356 'files_url': '/test-repo/files/b_id/b?at=b'
358 'files_url': expected_files_url + 'b_id/b?at=b',
357 }
359 }
358 ],
360 ],
359 'text': 'section_1'
361 'text': 'section_1'
360 },
362 },
361 {
363 {
362 'children': [
364 'children': [
363 {
365 {
364 'id': 'c@c_id', 'raw_id': 'c_id',
366 'id': 'c@c_id', 'raw_id': 'c_id',
365 'text': 'c', 'type': 't2',
367 'text': 'c', 'type': 't2',
366 'files_url': '/test-repo/files/c_id/c?at=c'
368 'files_url': expected_files_url + 'c_id/c?at=c',
367 }
369 }
368 ],
370 ],
369 'text': 'section_2'
371 'text': 'section_2'
370 }
372 }
371 ]
373 ]
372 assert result == expected_result
374 assert result == expected_result
373
375
374
376
375 @pytest.mark.usefixtures("app")
377 @pytest.mark.usefixtures("app")
376 class TestRepoLocation:
378 class TestRepoLocation:
377
379
378 @pytest.mark.parametrize("suffix", [u'', u'Δ…Δ™Ε‚'], ids=['', 'non-ascii'])
380 @pytest.mark.parametrize("suffix", [u'', u'Δ…Δ™Ε‚'], ids=['', 'non-ascii'])
379 def test_manual_delete(self, autologin_user, backend, suffix, csrf_token):
381 def test_manual_delete(self, autologin_user, backend, suffix, csrf_token):
380 repo = backend.create_repo(name_suffix=suffix)
382 repo = backend.create_repo(name_suffix=suffix)
381 repo_name = repo.repo_name
383 repo_name = repo.repo_name
382
384
383 # delete from file system
385 # delete from file system
384 RepoModel()._delete_filesystem_repo(repo)
386 RepoModel()._delete_filesystem_repo(repo)
385
387
386 # test if the repo is still in the database
388 # test if the repo is still in the database
387 new_repo = RepoModel().get_by_repo_name(repo_name)
389 new_repo = RepoModel().get_by_repo_name(repo_name)
388 assert new_repo.repo_name == repo_name
390 assert new_repo.repo_name == repo_name
389
391
390 # check if repo is not in the filesystem
392 # check if repo is not in the filesystem
391 assert not repo_on_filesystem(repo_name)
393 assert not repo_on_filesystem(repo_name)
392 self.assert_repo_not_found_redirect(repo_name)
394 self.assert_repo_not_found_redirect(repo_name)
393
395
394 def assert_repo_not_found_redirect(self, repo_name):
396 def assert_repo_not_found_redirect(self, repo_name):
395 # run the check page that triggers the other flash message
397 # run the check page that triggers the other flash message
396 response = self.app.get(url('repo_check_home', repo_name=repo_name))
398 response = self.app.get(url('repo_check_home', repo_name=repo_name))
397 assert_session_flash(
399 assert_session_flash(
398 response, 'The repository at %s cannot be located.' % repo_name)
400 response, 'The repository at %s cannot be located.' % repo_name)
399
401
400
402
401 def repo_on_filesystem(repo_name):
403 def repo_on_filesystem(repo_name):
402 try:
404 try:
403 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
405 vcs.get_repo(os.path.join(TESTS_TMP_PATH, repo_name))
404 return True
406 return True
405 except Exception:
407 except Exception:
406 return False
408 return False
407
409
408
410
409 class TestCreateFilesUrl(object):
411 class TestCreateFilesUrl(object):
410 def test_creates_non_svn_url(self):
412 def test_creates_non_svn_url(self):
411 controller = summary.SummaryController()
413 controller = summary.SummaryController()
412 repo = mock.Mock()
414 repo = mock.Mock()
413 repo.name = 'abcde'
415 repo.name = 'abcde'
414 full_repo_name = 'test-repo-group/' + repo.name
416 full_repo_name = 'test-repo-group/' + repo.name
415 ref_name = 'branch1'
417 ref_name = 'branch1'
416 raw_id = 'deadbeef0123456789'
418 raw_id = 'deadbeef0123456789'
417 is_svn = False
419 is_svn = False
418
420
419 with mock.patch.object(summary.h, 'url') as url_mock:
421 with mock.patch.object(summary.h, 'url') as url_mock:
420 result = controller._create_files_url(
422 result = controller._create_files_url(
421 repo, full_repo_name, ref_name, raw_id, is_svn)
423 repo, full_repo_name, ref_name, raw_id, is_svn)
422 url_mock.assert_called_once_with(
424 url_mock.assert_called_once_with(
423 'files_home', repo_name=full_repo_name, f_path='',
425 'files_home', repo_name=full_repo_name, f_path='',
424 revision=ref_name, at=ref_name)
426 revision=ref_name, at=ref_name)
425 assert result == url_mock.return_value
427 assert result == url_mock.return_value
426
428
427 def test_creates_svn_url(self):
429 def test_creates_svn_url(self):
428 controller = summary.SummaryController()
430 controller = summary.SummaryController()
429 repo = mock.Mock()
431 repo = mock.Mock()
430 repo.name = 'abcde'
432 repo.name = 'abcde'
431 full_repo_name = 'test-repo-group/' + repo.name
433 full_repo_name = 'test-repo-group/' + repo.name
432 ref_name = 'branch1'
434 ref_name = 'branch1'
433 raw_id = 'deadbeef0123456789'
435 raw_id = 'deadbeef0123456789'
434 is_svn = True
436 is_svn = True
435
437
436 with mock.patch.object(summary.h, 'url') as url_mock:
438 with mock.patch.object(summary.h, 'url') as url_mock:
437 result = controller._create_files_url(
439 result = controller._create_files_url(
438 repo, full_repo_name, ref_name, raw_id, is_svn)
440 repo, full_repo_name, ref_name, raw_id, is_svn)
439 url_mock.assert_called_once_with(
441 url_mock.assert_called_once_with(
440 'files_home', repo_name=full_repo_name, f_path=ref_name,
442 'files_home', repo_name=full_repo_name, f_path=ref_name,
441 revision=raw_id, at=ref_name)
443 revision=raw_id, at=ref_name)
442 assert result == url_mock.return_value
444 assert result == url_mock.return_value
443
445
444 def test_name_has_slashes(self):
446 def test_name_has_slashes(self):
445 controller = summary.SummaryController()
447 controller = summary.SummaryController()
446 repo = mock.Mock()
448 repo = mock.Mock()
447 repo.name = 'abcde'
449 repo.name = 'abcde'
448 full_repo_name = 'test-repo-group/' + repo.name
450 full_repo_name = 'test-repo-group/' + repo.name
449 ref_name = 'branch1/branch2'
451 ref_name = 'branch1/branch2'
450 raw_id = 'deadbeef0123456789'
452 raw_id = 'deadbeef0123456789'
451 is_svn = False
453 is_svn = False
452
454
453 with mock.patch.object(summary.h, 'url') as url_mock:
455 with mock.patch.object(summary.h, 'url') as url_mock:
454 result = controller._create_files_url(
456 result = controller._create_files_url(
455 repo, full_repo_name, ref_name, raw_id, is_svn)
457 repo, full_repo_name, ref_name, raw_id, is_svn)
456 url_mock.assert_called_once_with(
458 url_mock.assert_called_once_with(
457 'files_home', repo_name=full_repo_name, f_path='', revision=raw_id,
459 'files_home', repo_name=full_repo_name, f_path='', revision=raw_id,
458 at=ref_name)
460 at=ref_name)
459 assert result == url_mock.return_value
461 assert result == url_mock.return_value
460
462
461
463
462 class TestReferenceItems(object):
464 class TestReferenceItems(object):
463 repo = mock.Mock()
465 repo = mock.Mock()
464 repo.name = 'pytest-repo'
466 repo.name = 'pytest-repo'
465 repo_full_name = 'pytest-repo-group/' + repo.name
467 repo_full_name = 'pytest-repo-group/' + repo.name
466 ref_type = 'branch'
468 ref_type = 'branch'
467 fake_url = '/abcde/'
469 fake_url = '/abcde/'
468
470
469 @staticmethod
471 @staticmethod
470 def _format_function(name, id_):
472 def _format_function(name, id_):
471 return 'format_function_{}_{}'.format(name, id_)
473 return 'format_function_{}_{}'.format(name, id_)
472
474
473 def test_creates_required_amount_of_items(self):
475 def test_creates_required_amount_of_items(self):
474 amount = 100
476 amount = 100
475 refs = {
477 refs = {
476 'ref{}'.format(i): '{0:040d}'.format(i)
478 'ref{}'.format(i): '{0:040d}'.format(i)
477 for i in range(amount)
479 for i in range(amount)
478 }
480 }
479
481
480 controller = summary.SummaryController()
482 controller = summary.SummaryController()
481
483
482 url_patcher = mock.patch.object(
484 url_patcher = mock.patch.object(
483 controller, '_create_files_url')
485 controller, '_create_files_url')
484 svn_patcher = mock.patch.object(
486 svn_patcher = mock.patch.object(
485 summary.h, 'is_svn', return_value=False)
487 summary.h, 'is_svn', return_value=False)
486
488
487 with url_patcher as url_mock, svn_patcher:
489 with url_patcher as url_mock, svn_patcher:
488 result = controller._create_reference_items(
490 result = controller._create_reference_items(
489 self.repo, self.repo_full_name, refs, self.ref_type,
491 self.repo, self.repo_full_name, refs, self.ref_type,
490 self._format_function)
492 self._format_function)
491 assert len(result) == amount
493 assert len(result) == amount
492 assert url_mock.call_count == amount
494 assert url_mock.call_count == amount
493
495
494 def test_single_item_details(self):
496 def test_single_item_details(self):
495 ref_name = 'ref1'
497 ref_name = 'ref1'
496 ref_id = 'deadbeef'
498 ref_id = 'deadbeef'
497 refs = {
499 refs = {
498 ref_name: ref_id
500 ref_name: ref_id
499 }
501 }
500
502
501 controller = summary.SummaryController()
503 controller = summary.SummaryController()
502 url_patcher = mock.patch.object(
504 url_patcher = mock.patch.object(
503 controller, '_create_files_url', return_value=self.fake_url)
505 controller, '_create_files_url', return_value=self.fake_url)
504 svn_patcher = mock.patch.object(
506 svn_patcher = mock.patch.object(
505 summary.h, 'is_svn', return_value=False)
507 summary.h, 'is_svn', return_value=False)
506
508
507 with url_patcher as url_mock, svn_patcher:
509 with url_patcher as url_mock, svn_patcher:
508 result = controller._create_reference_items(
510 result = controller._create_reference_items(
509 self.repo, self.repo_full_name, refs, self.ref_type,
511 self.repo, self.repo_full_name, refs, self.ref_type,
510 self._format_function)
512 self._format_function)
511
513
512 url_mock.assert_called_once_with(self.repo, ref_name, ref_id, False)
514 url_mock.assert_called_once_with(
515 self.repo, self.repo_full_name, ref_name, ref_id, False)
513 expected_result = [
516 expected_result = [
514 {
517 {
515 'text': ref_name,
518 'text': ref_name,
516 'id': self._format_function(ref_name, ref_id),
519 'id': self._format_function(ref_name, ref_id),
517 'raw_id': ref_id,
520 'raw_id': ref_id,
518 'type': self.ref_type,
521 'type': self.ref_type,
519 'files_url': self.fake_url
522 'files_url': self.fake_url
520 }
523 }
521 ]
524 ]
522 assert result == expected_result
525 assert result == expected_result
General Comments 0
You need to be logged in to leave comments. Login now