Mercurial > hg > soundsoftware-site
comparison .svn/pristine/e0/e05aa95bf99a3917bb79c084e2f744f98528a8e7.svn-base @ 909:cbb26bc654de redmine-1.3
Update to Redmine 1.3-stable branch (Redmine SVN rev 8964)
author | Chris Cannam |
---|---|
date | Fri, 24 Feb 2012 19:09:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
908:c6c2cbd0afee | 909:cbb26bc654de |
---|---|
1 # Redmine - project management software | |
2 # Copyright (C) 2006-2011 Jean-Philippe Lang | |
3 # | |
4 # This program is free software; you can redistribute it and/or | |
5 # modify it under the terms of the GNU General Public License | |
6 # as published by the Free Software Foundation; either version 2 | |
7 # of the License, or (at your option) any later version. | |
8 # | |
9 # This program is distributed in the hope that it will be useful, | |
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 # GNU General Public License for more details. | |
13 # | |
14 # You should have received a copy of the GNU General Public License | |
15 # along with this program; if not, write to the Free Software | |
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |
17 | |
18 require File.expand_path('../../test_helper', __FILE__) | |
19 require 'repositories_controller' | |
20 | |
21 # Re-raise errors caught by the controller. | |
22 class RepositoriesController; def rescue_action(e) raise e end; end | |
23 | |
24 class RepositoriesMercurialControllerTest < ActionController::TestCase | |
25 fixtures :projects, :users, :roles, :members, :member_roles, | |
26 :repositories, :enabled_modules | |
27 | |
28 REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s | |
29 CHAR_1_HEX = "\xc3\x9c" | |
30 PRJ_ID = 3 | |
31 NUM_REV = 32 | |
32 | |
33 ruby19_non_utf8_pass = | |
34 (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8') | |
35 | |
36 def setup | |
37 @controller = RepositoriesController.new | |
38 @request = ActionController::TestRequest.new | |
39 @response = ActionController::TestResponse.new | |
40 User.current = nil | |
41 @project = Project.find(PRJ_ID) | |
42 @repository = Repository::Mercurial.create( | |
43 :project => @project, | |
44 :url => REPOSITORY_PATH, | |
45 :path_encoding => 'ISO-8859-1' | |
46 ) | |
47 assert @repository | |
48 @diff_c_support = true | |
49 @char_1 = CHAR_1_HEX.dup | |
50 @tag_char_1 = "tag-#{CHAR_1_HEX}-00" | |
51 @branch_char_0 = "branch-#{CHAR_1_HEX}-00" | |
52 @branch_char_1 = "branch-#{CHAR_1_HEX}-01" | |
53 if @char_1.respond_to?(:force_encoding) | |
54 @char_1.force_encoding('UTF-8') | |
55 @tag_char_1.force_encoding('UTF-8') | |
56 @branch_char_0.force_encoding('UTF-8') | |
57 @branch_char_1.force_encoding('UTF-8') | |
58 end | |
59 end | |
60 | |
61 if ruby19_non_utf8_pass | |
62 puts "TODO: Mercurial functional test fails in Ruby 1.9 " + | |
63 "and Encoding.default_external is not UTF-8. " + | |
64 "Current value is '#{Encoding.default_external.to_s}'" | |
65 def test_fake; assert true end | |
66 elsif File.directory?(REPOSITORY_PATH) | |
67 def test_show_root | |
68 assert_equal 0, @repository.changesets.count | |
69 @repository.fetch_changesets | |
70 @project.reload | |
71 assert_equal NUM_REV, @repository.changesets.count | |
72 get :show, :id => PRJ_ID | |
73 assert_response :success | |
74 assert_template 'show' | |
75 assert_not_nil assigns(:entries) | |
76 assert_equal 4, assigns(:entries).size | |
77 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} | |
78 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} | |
79 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} | |
80 assert_not_nil assigns(:changesets) | |
81 assert assigns(:changesets).size > 0 | |
82 end | |
83 | |
84 def test_show_directory | |
85 assert_equal 0, @repository.changesets.count | |
86 @repository.fetch_changesets | |
87 @project.reload | |
88 assert_equal NUM_REV, @repository.changesets.count | |
89 get :show, :id => PRJ_ID, :path => ['images'] | |
90 assert_response :success | |
91 assert_template 'show' | |
92 assert_not_nil assigns(:entries) | |
93 assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name) | |
94 entry = assigns(:entries).detect {|e| e.name == 'edit.png'} | |
95 assert_not_nil entry | |
96 assert_equal 'file', entry.kind | |
97 assert_equal 'images/edit.png', entry.path | |
98 assert_not_nil assigns(:changesets) | |
99 assert assigns(:changesets).size > 0 | |
100 end | |
101 | |
102 def test_show_at_given_revision | |
103 assert_equal 0, @repository.changesets.count | |
104 @repository.fetch_changesets | |
105 @project.reload | |
106 assert_equal NUM_REV, @repository.changesets.count | |
107 [0, '0', '0885933ad4f6'].each do |r1| | |
108 get :show, :id => PRJ_ID, :path => ['images'], :rev => r1 | |
109 assert_response :success | |
110 assert_template 'show' | |
111 assert_not_nil assigns(:entries) | |
112 assert_equal ['delete.png'], assigns(:entries).collect(&:name) | |
113 assert_not_nil assigns(:changesets) | |
114 assert assigns(:changesets).size > 0 | |
115 end | |
116 end | |
117 | |
118 def test_show_directory_sql_escape_percent | |
119 assert_equal 0, @repository.changesets.count | |
120 @repository.fetch_changesets | |
121 @project.reload | |
122 assert_equal NUM_REV, @repository.changesets.count | |
123 [13, '13', '3a330eb32958'].each do |r1| | |
124 get :show, :id => PRJ_ID, :path => ['sql_escape', 'percent%dir'], | |
125 :rev => r1 | |
126 assert_response :success | |
127 assert_template 'show' | |
128 | |
129 assert_not_nil assigns(:entries) | |
130 assert_equal ['percent%file1.txt', 'percentfile1.txt'], | |
131 assigns(:entries).collect(&:name) | |
132 changesets = assigns(:changesets) | |
133 assert_not_nil changesets | |
134 assert assigns(:changesets).size > 0 | |
135 assert_equal %w(13 11 10 9), changesets.collect(&:revision) | |
136 end | |
137 end | |
138 | |
139 def test_show_directory_latin_1_path | |
140 assert_equal 0, @repository.changesets.count | |
141 @repository.fetch_changesets | |
142 @project.reload | |
143 assert_equal NUM_REV, @repository.changesets.count | |
144 [21, '21', 'adf805632193'].each do |r1| | |
145 get :show, :id => PRJ_ID, :path => ['latin-1-dir'], :rev => r1 | |
146 assert_response :success | |
147 assert_template 'show' | |
148 | |
149 assert_not_nil assigns(:entries) | |
150 assert_equal ["make-latin-1-file.rb", | |
151 "test-#{@char_1}-1.txt", | |
152 "test-#{@char_1}-2.txt", | |
153 "test-#{@char_1}.txt"], assigns(:entries).collect(&:name) | |
154 changesets = assigns(:changesets) | |
155 assert_not_nil changesets | |
156 assert_equal %w(21 20 19 18 17), changesets.collect(&:revision) | |
157 end | |
158 end | |
159 | |
160 def test_show_branch | |
161 assert_equal 0, @repository.changesets.count | |
162 @repository.fetch_changesets | |
163 @project.reload | |
164 assert_equal NUM_REV, @repository.changesets.count | |
165 [ | |
166 'default', | |
167 @branch_char_1, | |
168 'branch (1)[2]&,%.-3_4', | |
169 @branch_char_0, | |
170 'test_branch.latin-1', | |
171 'test-branch-00', | |
172 ].each do |bra| | |
173 get :show, :id => PRJ_ID, :rev => bra | |
174 assert_response :success | |
175 assert_template 'show' | |
176 assert_not_nil assigns(:entries) | |
177 assert assigns(:entries).size > 0 | |
178 assert_not_nil assigns(:changesets) | |
179 assert assigns(:changesets).size > 0 | |
180 end | |
181 end | |
182 | |
183 def test_show_tag | |
184 assert_equal 0, @repository.changesets.count | |
185 @repository.fetch_changesets | |
186 @project.reload | |
187 assert_equal NUM_REV, @repository.changesets.count | |
188 [ | |
189 @tag_char_1, | |
190 'tag_test.00', | |
191 'tag-init-revision' | |
192 ].each do |tag| | |
193 get :show, :id => PRJ_ID, :rev => tag | |
194 assert_response :success | |
195 assert_template 'show' | |
196 assert_not_nil assigns(:entries) | |
197 assert assigns(:entries).size > 0 | |
198 assert_not_nil assigns(:changesets) | |
199 assert assigns(:changesets).size > 0 | |
200 end | |
201 end | |
202 | |
203 def test_changes | |
204 get :changes, :id => PRJ_ID, :path => ['images', 'edit.png'] | |
205 assert_response :success | |
206 assert_template 'changes' | |
207 assert_tag :tag => 'h2', :content => 'edit.png' | |
208 end | |
209 | |
210 def test_entry_show | |
211 get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb'] | |
212 assert_response :success | |
213 assert_template 'entry' | |
214 # Line 10 | |
215 assert_tag :tag => 'th', | |
216 :content => '10', | |
217 :attributes => { :class => 'line-num' }, | |
218 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ } | |
219 end | |
220 | |
221 def test_entry_show_latin_1_path | |
222 [21, '21', 'adf805632193'].each do |r1| | |
223 get :entry, :id => PRJ_ID, | |
224 :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1 | |
225 assert_response :success | |
226 assert_template 'entry' | |
227 assert_tag :tag => 'th', | |
228 :content => '1', | |
229 :attributes => { :class => 'line-num' }, | |
230 :sibling => { :tag => 'td', | |
231 :content => /Mercurial is a distributed version control system/ } | |
232 end | |
233 end | |
234 | |
235 def test_entry_show_latin_1_contents | |
236 with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do | |
237 [27, '27', '7bbf4c738e71'].each do |r1| | |
238 get :entry, :id => PRJ_ID, | |
239 :path => ['latin-1-dir', "test-#{@char_1}.txt"], :rev => r1 | |
240 assert_response :success | |
241 assert_template 'entry' | |
242 assert_tag :tag => 'th', | |
243 :content => '1', | |
244 :attributes => { :class => 'line-num' }, | |
245 :sibling => { :tag => 'td', | |
246 :content => /test-#{@char_1}.txt/ } | |
247 end | |
248 end | |
249 end | |
250 | |
251 def test_entry_download | |
252 get :entry, :id => PRJ_ID, | |
253 :path => ['sources', 'watchers_controller.rb'], :format => 'raw' | |
254 assert_response :success | |
255 # File content | |
256 assert @response.body.include?('WITHOUT ANY WARRANTY') | |
257 end | |
258 | |
259 def test_entry_binary_force_download | |
260 get :entry, :id => PRJ_ID, :rev => 1, :path => ['images', 'edit.png'] | |
261 assert_response :success | |
262 assert_equal 'image/png', @response.content_type | |
263 end | |
264 | |
265 def test_directory_entry | |
266 get :entry, :id => PRJ_ID, :path => ['sources'] | |
267 assert_response :success | |
268 assert_template 'show' | |
269 assert_not_nil assigns(:entry) | |
270 assert_equal 'sources', assigns(:entry).name | |
271 end | |
272 | |
273 def test_diff | |
274 assert_equal 0, @repository.changesets.count | |
275 @repository.fetch_changesets | |
276 @project.reload | |
277 assert_equal NUM_REV, @repository.changesets.count | |
278 [4, '4', 'def6d2f1254a'].each do |r1| | |
279 # Full diff of changeset 4 | |
280 ['inline', 'sbs'].each do |dt| | |
281 get :diff, :id => PRJ_ID, :rev => r1, :type => dt | |
282 assert_response :success | |
283 assert_template 'diff' | |
284 if @diff_c_support | |
285 # Line 22 removed | |
286 assert_tag :tag => 'th', | |
287 :content => '22', | |
288 :sibling => { :tag => 'td', | |
289 :attributes => { :class => /diff_out/ }, | |
290 :content => /def remove/ } | |
291 assert_tag :tag => 'h2', :content => /4:def6d2f1254a/ | |
292 end | |
293 end | |
294 end | |
295 end | |
296 | |
297 def test_diff_two_revs | |
298 assert_equal 0, @repository.changesets.count | |
299 @repository.fetch_changesets | |
300 @project.reload | |
301 assert_equal NUM_REV, @repository.changesets.count | |
302 [2, '400bb8672109', '400', 400].each do |r1| | |
303 [4, 'def6d2f1254a'].each do |r2| | |
304 ['inline', 'sbs'].each do |dt| | |
305 get :diff, | |
306 :id => PRJ_ID, | |
307 :rev => r1, | |
308 :rev_to => r2, | |
309 :type => dt | |
310 assert_response :success | |
311 assert_template 'diff' | |
312 diff = assigns(:diff) | |
313 assert_not_nil diff | |
314 assert_tag :tag => 'h2', | |
315 :content => /4:def6d2f1254a 2:400bb8672109/ | |
316 end | |
317 end | |
318 end | |
319 end | |
320 | |
321 def test_diff_latin_1_path | |
322 with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do | |
323 [21, 'adf805632193'].each do |r1| | |
324 ['inline', 'sbs'].each do |dt| | |
325 get :diff, :id => PRJ_ID, :rev => r1, :type => dt | |
326 assert_response :success | |
327 assert_template 'diff' | |
328 assert_tag :tag => 'thead', | |
329 :descendant => { | |
330 :tag => 'th', | |
331 :attributes => { :class => 'filename' } , | |
332 :content => /latin-1-dir\/test-#{@char_1}-2.txt/ , | |
333 }, | |
334 :sibling => { | |
335 :tag => 'tbody', | |
336 :descendant => { | |
337 :tag => 'td', | |
338 :attributes => { :class => /diff_in/ }, | |
339 :content => /It is written in Python/ | |
340 } | |
341 } | |
342 end | |
343 end | |
344 end | |
345 end | |
346 | |
347 def test_annotate | |
348 get :annotate, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb'] | |
349 assert_response :success | |
350 assert_template 'annotate' | |
351 # Line 23, revision 4:def6d2f1254a | |
352 assert_tag :tag => 'th', | |
353 :content => '23', | |
354 :attributes => { :class => 'line-num' }, | |
355 :sibling => | |
356 { | |
357 :tag => 'td', | |
358 :attributes => { :class => 'revision' }, | |
359 :child => { :tag => 'a', :content => '4:def6d2f1254a' } | |
360 } | |
361 assert_tag :tag => 'th', | |
362 :content => '23', | |
363 :attributes => { :class => 'line-num' }, | |
364 :sibling => | |
365 { | |
366 :tag => 'td' , | |
367 :content => 'jsmith' , | |
368 :attributes => { :class => 'author' }, | |
369 } | |
370 assert_tag :tag => 'th', | |
371 :content => '23', | |
372 :attributes => { :class => 'line-num' }, | |
373 :sibling => { :tag => 'td', :content => /watcher =/ } | |
374 end | |
375 | |
376 def test_annotate_not_in_tip | |
377 assert_equal 0, @repository.changesets.count | |
378 @repository.fetch_changesets | |
379 @project.reload | |
380 assert_equal NUM_REV, @repository.changesets.count | |
381 | |
382 get :annotate, :id => PRJ_ID, | |
383 :path => ['sources', 'welcome_controller.rb'] | |
384 assert_response 404 | |
385 assert_error_tag :content => /was not found/ | |
386 end | |
387 | |
388 def test_annotate_at_given_revision | |
389 assert_equal 0, @repository.changesets.count | |
390 @repository.fetch_changesets | |
391 @project.reload | |
392 assert_equal NUM_REV, @repository.changesets.count | |
393 [2, '400bb8672109', '400', 400].each do |r1| | |
394 get :annotate, :id => PRJ_ID, :rev => r1, | |
395 :path => ['sources', 'watchers_controller.rb'] | |
396 assert_response :success | |
397 assert_template 'annotate' | |
398 assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/ | |
399 end | |
400 end | |
401 | |
402 def test_annotate_latin_1_path | |
403 [21, '21', 'adf805632193'].each do |r1| | |
404 get :annotate, :id => PRJ_ID, | |
405 :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1 | |
406 assert_response :success | |
407 assert_template 'annotate' | |
408 assert_tag :tag => 'th', | |
409 :content => '1', | |
410 :attributes => { :class => 'line-num' }, | |
411 :sibling => | |
412 { | |
413 :tag => 'td', | |
414 :attributes => { :class => 'revision' }, | |
415 :child => { :tag => 'a', :content => '20:709858aafd1b' } | |
416 } | |
417 assert_tag :tag => 'th', | |
418 :content => '1', | |
419 :attributes => { :class => 'line-num' }, | |
420 :sibling => | |
421 { | |
422 :tag => 'td' , | |
423 :content => 'jsmith' , | |
424 :attributes => { :class => 'author' }, | |
425 } | |
426 assert_tag :tag => 'th', | |
427 :content => '1', | |
428 :attributes => { :class => 'line-num' }, | |
429 :sibling => { :tag => 'td', | |
430 :content => /Mercurial is a distributed version control system/ } | |
431 | |
432 end | |
433 end | |
434 | |
435 def test_annotate_latin_1_contents | |
436 with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do | |
437 [27, '7bbf4c738e71'].each do |r1| | |
438 get :annotate, :id => PRJ_ID, | |
439 :path => ['latin-1-dir', "test-#{@char_1}.txt"], :rev => r1 | |
440 assert_tag :tag => 'th', | |
441 :content => '1', | |
442 :attributes => { :class => 'line-num' }, | |
443 :sibling => { :tag => 'td', | |
444 :content => /test-#{@char_1}.txt/ } | |
445 end | |
446 end | |
447 end | |
448 | |
449 def test_empty_revision | |
450 assert_equal 0, @repository.changesets.count | |
451 @repository.fetch_changesets | |
452 @project.reload | |
453 assert_equal NUM_REV, @repository.changesets.count | |
454 ['', ' ', nil].each do |r| | |
455 get :revision, :id => PRJ_ID, :rev => r | |
456 assert_response 404 | |
457 assert_error_tag :content => /was not found/ | |
458 end | |
459 end | |
460 | |
461 def test_destroy_valid_repository | |
462 @request.session[:user_id] = 1 # admin | |
463 assert_equal 0, @repository.changesets.count | |
464 @repository.fetch_changesets | |
465 @project.reload | |
466 assert_equal NUM_REV, @repository.changesets.count | |
467 | |
468 get :destroy, :id => PRJ_ID | |
469 assert_response 302 | |
470 @project.reload | |
471 assert_nil @project.repository | |
472 end | |
473 | |
474 def test_destroy_invalid_repository | |
475 @request.session[:user_id] = 1 # admin | |
476 assert_equal 0, @repository.changesets.count | |
477 @repository.fetch_changesets | |
478 @project.reload | |
479 assert_equal NUM_REV, @repository.changesets.count | |
480 | |
481 get :destroy, :id => PRJ_ID | |
482 assert_response 302 | |
483 @project.reload | |
484 assert_nil @project.repository | |
485 | |
486 @repository = Repository::Mercurial.create( | |
487 :project => Project.find(PRJ_ID), | |
488 :url => "/invalid", | |
489 :path_encoding => 'ISO-8859-1' | |
490 ) | |
491 assert @repository | |
492 @repository.fetch_changesets | |
493 @project.reload | |
494 assert_equal 0, @repository.changesets.count | |
495 | |
496 get :destroy, :id => PRJ_ID | |
497 assert_response 302 | |
498 @project.reload | |
499 assert_nil @project.repository | |
500 end | |
501 else | |
502 puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!" | |
503 def test_fake; assert true end | |
504 end | |
505 end |