##// END OF EJS Templates
scm: mercurial: check changesets size is greater than 0 in browse test in functional test....
Toshi MARUYAMA -
r5002:a5e55a90536b
parent child
Show More
@@ -1,322 +1,337
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2008 Jean-Philippe Lang
2 # Copyright (C) 2006-2008 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
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 General Public License
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
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.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19 require 'repositories_controller'
19 require 'repositories_controller'
20
20
21 # Re-raise errors caught by the controller.
21 # Re-raise errors caught by the controller.
22 class RepositoriesController; def rescue_action(e) raise e end; end
22 class RepositoriesController; def rescue_action(e) raise e end; end
23
23
24 class RepositoriesMercurialControllerTest < ActionController::TestCase
24 class RepositoriesMercurialControllerTest < ActionController::TestCase
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
25 fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
26
27 # No '..' in the repository path
27 # No '..' in the repository path
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
29 CHAR_1_HEX = "\xc3\x9c"
29 CHAR_1_HEX = "\xc3\x9c"
30
30
31 ruby19_non_utf8_pass = (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
31 ruby19_non_utf8_pass = (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
32
32
33 def setup
33 def setup
34 @controller = RepositoriesController.new
34 @controller = RepositoriesController.new
35 @request = ActionController::TestRequest.new
35 @request = ActionController::TestRequest.new
36 @response = ActionController::TestResponse.new
36 @response = ActionController::TestResponse.new
37 User.current = nil
37 User.current = nil
38 @repository = Repository::Mercurial.create(
38 @repository = Repository::Mercurial.create(
39 :project => Project.find(3),
39 :project => Project.find(3),
40 :url => REPOSITORY_PATH,
40 :url => REPOSITORY_PATH,
41 :path_encoding => 'ISO-8859-1'
41 :path_encoding => 'ISO-8859-1'
42 )
42 )
43 assert @repository
43 assert @repository
44 @diff_c_support = true
44 @diff_c_support = true
45 @char_1 = CHAR_1_HEX.dup
45 @char_1 = CHAR_1_HEX.dup
46 @tag_char_1 = "tag-#{CHAR_1_HEX}-00"
46 @tag_char_1 = "tag-#{CHAR_1_HEX}-00"
47 @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
47 @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
48 @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
48 @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
49 if @char_1.respond_to?(:force_encoding)
49 if @char_1.respond_to?(:force_encoding)
50 @char_1.force_encoding('UTF-8')
50 @char_1.force_encoding('UTF-8')
51 @tag_char_1.force_encoding('UTF-8')
51 @tag_char_1.force_encoding('UTF-8')
52 @branch_char_0.force_encoding('UTF-8')
52 @branch_char_0.force_encoding('UTF-8')
53 @branch_char_1.force_encoding('UTF-8')
53 @branch_char_1.force_encoding('UTF-8')
54 end
54 end
55 end
55 end
56
56
57 if ruby19_non_utf8_pass
57 if ruby19_non_utf8_pass
58 puts "TODO: Mercurial functional test fails in Ruby 1.9 " +
58 puts "TODO: Mercurial functional test fails in Ruby 1.9 " +
59 "and Encoding.default_external is not UTF-8. " +
59 "and Encoding.default_external is not UTF-8. " +
60 "Current value is '#{Encoding.default_external.to_s}'"
60 "Current value is '#{Encoding.default_external.to_s}'"
61 def test_fake; assert true end
61 def test_fake; assert true end
62 elsif File.directory?(REPOSITORY_PATH)
62 elsif File.directory?(REPOSITORY_PATH)
63 def test_show
63 def test_show
64 get :show, :id => 3
64 get :show, :id => 3
65 assert_response :success
65 assert_response :success
66 assert_template 'show'
66 assert_template 'show'
67 assert_not_nil assigns(:entries)
67 assert_not_nil assigns(:entries)
68 assert_not_nil assigns(:changesets)
68 assert_not_nil assigns(:changesets)
69 end
69 end
70
70
71 def test_show_root
71 def test_show_root
72 @repository.fetch_changesets
73 @repository.reload
72 get :show, :id => 3
74 get :show, :id => 3
73 assert_response :success
75 assert_response :success
74 assert_template 'show'
76 assert_template 'show'
75 assert_not_nil assigns(:entries)
77 assert_not_nil assigns(:entries)
76 assert_equal 4, assigns(:entries).size
78 assert_equal 4, assigns(:entries).size
77 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
79 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
78 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
80 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
79 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
81 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
82 assert_not_nil assigns(:changesets)
83 assigns(:changesets).size > 0
80 end
84 end
81
85
82 def test_show_directory
86 def test_show_directory
87 @repository.fetch_changesets
88 @repository.reload
83 get :show, :id => 3, :path => ['images']
89 get :show, :id => 3, :path => ['images']
84 assert_response :success
90 assert_response :success
85 assert_template 'show'
91 assert_template 'show'
86 assert_not_nil assigns(:entries)
92 assert_not_nil assigns(:entries)
87 assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
93 assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
88 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
94 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
89 assert_not_nil entry
95 assert_not_nil entry
90 assert_equal 'file', entry.kind
96 assert_equal 'file', entry.kind
91 assert_equal 'images/edit.png', entry.path
97 assert_equal 'images/edit.png', entry.path
98 assert_not_nil assigns(:changesets)
99 assigns(:changesets).size > 0
92 end
100 end
93
101
94 def test_show_at_given_revision
102 def test_show_at_given_revision
103 @repository.fetch_changesets
104 @repository.reload
95 [0, '0', '0885933ad4f6'].each do |r1|
105 [0, '0', '0885933ad4f6'].each do |r1|
96 get :show, :id => 3, :path => ['images'], :rev => r1
106 get :show, :id => 3, :path => ['images'], :rev => r1
97 assert_response :success
107 assert_response :success
98 assert_template 'show'
108 assert_template 'show'
99 assert_not_nil assigns(:entries)
109 assert_not_nil assigns(:entries)
100 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
110 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
111 assert_not_nil assigns(:changesets)
112 assigns(:changesets).size > 0
101 end
113 end
102 end
114 end
103
115
104 def test_show_directory_sql_escape_percent
116 def test_show_directory_sql_escape_percent
117 @repository.fetch_changesets
118 @repository.reload
105 [13, '13', '3a330eb32958'].each do |r1|
119 [13, '13', '3a330eb32958'].each do |r1|
106 get :show, :id => 3, :path => ['sql_escape', 'percent%dir'], :rev => r1
120 get :show, :id => 3, :path => ['sql_escape', 'percent%dir'], :rev => r1
107 assert_response :success
121 assert_response :success
108 assert_template 'show'
122 assert_template 'show'
109
123
110 assert_not_nil assigns(:entries)
124 assert_not_nil assigns(:entries)
111 assert_equal ['percent%file1.txt', 'percentfile1.txt'], assigns(:entries).collect(&:name)
125 assert_equal ['percent%file1.txt', 'percentfile1.txt'], assigns(:entries).collect(&:name)
112 changesets = assigns(:changesets)
126 changesets = assigns(:changesets)
127 assigns(:changesets).size > 0
113
128
114 ## This is not yet implemented.
129 ## This is not yet implemented.
115 # assert_not_nil changesets
130 # assert_not_nil changesets
116 # assert_equal %w(13 11 10 9), changesets.collect(&:revision)
131 # assert_equal %w(13 11 10 9), changesets.collect(&:revision)
117 end
132 end
118 end
133 end
119
134
120 def test_show_directory_latin_1
135 def test_show_directory_latin_1
121 @repository.fetch_changesets
136 @repository.fetch_changesets
122 @repository.reload
137 @repository.reload
123 [21, '21', 'adf805632193'].each do |r1|
138 [21, '21', 'adf805632193'].each do |r1|
124 get :show, :id => 3, :path => ['latin-1-dir'], :rev => r1
139 get :show, :id => 3, :path => ['latin-1-dir'], :rev => r1
125 assert_response :success
140 assert_response :success
126 assert_template 'show'
141 assert_template 'show'
127
142
128 assert_not_nil assigns(:entries)
143 assert_not_nil assigns(:entries)
129 assert_equal ["make-latin-1-file.rb",
144 assert_equal ["make-latin-1-file.rb",
130 "test-#{@char_1}-1.txt",
145 "test-#{@char_1}-1.txt",
131 "test-#{@char_1}-2.txt",
146 "test-#{@char_1}-2.txt",
132 "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
147 "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
133 changesets = assigns(:changesets)
148 changesets = assigns(:changesets)
134 assert_not_nil changesets
149 assert_not_nil changesets
135 assert_equal %w(27 21 20 19 18 17), changesets.collect(&:revision)
150 assert_equal %w(27 21 20 19 18 17), changesets.collect(&:revision)
136 end
151 end
137 end
152 end
138
153
139 def test_changes
154 def test_changes
140 get :changes, :id => 3, :path => ['images', 'edit.png']
155 get :changes, :id => 3, :path => ['images', 'edit.png']
141 assert_response :success
156 assert_response :success
142 assert_template 'changes'
157 assert_template 'changes'
143 assert_tag :tag => 'h2', :content => 'edit.png'
158 assert_tag :tag => 'h2', :content => 'edit.png'
144 end
159 end
145
160
146 def test_entry_show
161 def test_entry_show
147 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb']
162 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb']
148 assert_response :success
163 assert_response :success
149 assert_template 'entry'
164 assert_template 'entry'
150 # Line 10
165 # Line 10
151 assert_tag :tag => 'th',
166 assert_tag :tag => 'th',
152 :content => '10',
167 :content => '10',
153 :attributes => { :class => 'line-num' },
168 :attributes => { :class => 'line-num' },
154 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
169 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
155 end
170 end
156
171
157 def test_entry_show_latin_1
172 def test_entry_show_latin_1
158 [21, '21', 'adf805632193'].each do |r1|
173 [21, '21', 'adf805632193'].each do |r1|
159 get :entry, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
174 get :entry, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
160 assert_response :success
175 assert_response :success
161 assert_template 'entry'
176 assert_template 'entry'
162 assert_tag :tag => 'th',
177 assert_tag :tag => 'th',
163 :content => '1',
178 :content => '1',
164 :attributes => { :class => 'line-num' },
179 :attributes => { :class => 'line-num' },
165 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
180 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
166 end
181 end
167 end
182 end
168
183
169 def test_entry_download
184 def test_entry_download
170 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb'], :format => 'raw'
185 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb'], :format => 'raw'
171 assert_response :success
186 assert_response :success
172 # File content
187 # File content
173 assert @response.body.include?('WITHOUT ANY WARRANTY')
188 assert @response.body.include?('WITHOUT ANY WARRANTY')
174 end
189 end
175
190
176 def test_directory_entry
191 def test_directory_entry
177 get :entry, :id => 3, :path => ['sources']
192 get :entry, :id => 3, :path => ['sources']
178 assert_response :success
193 assert_response :success
179 assert_template 'show'
194 assert_template 'show'
180 assert_not_nil assigns(:entry)
195 assert_not_nil assigns(:entry)
181 assert_equal 'sources', assigns(:entry).name
196 assert_equal 'sources', assigns(:entry).name
182 end
197 end
183
198
184 def test_diff
199 def test_diff
185 @repository.fetch_changesets
200 @repository.fetch_changesets
186 @repository.reload
201 @repository.reload
187
202
188 [4, '4', 'def6d2f1254a'].each do |r1|
203 [4, '4', 'def6d2f1254a'].each do |r1|
189 # Full diff of changeset 4
204 # Full diff of changeset 4
190 get :diff, :id => 3, :rev => r1
205 get :diff, :id => 3, :rev => r1
191 assert_response :success
206 assert_response :success
192 assert_template 'diff'
207 assert_template 'diff'
193
208
194 if @diff_c_support
209 if @diff_c_support
195 # Line 22 removed
210 # Line 22 removed
196 assert_tag :tag => 'th',
211 assert_tag :tag => 'th',
197 :content => '22',
212 :content => '22',
198 :sibling => { :tag => 'td',
213 :sibling => { :tag => 'td',
199 :attributes => { :class => /diff_out/ },
214 :attributes => { :class => /diff_out/ },
200 :content => /def remove/ }
215 :content => /def remove/ }
201 assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
216 assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
202 end
217 end
203 end
218 end
204 end
219 end
205
220
206 def test_diff_two_revs
221 def test_diff_two_revs
207 @repository.fetch_changesets
222 @repository.fetch_changesets
208 @repository.reload
223 @repository.reload
209
224
210 [2, '400bb8672109', '400', 400].each do |r1|
225 [2, '400bb8672109', '400', 400].each do |r1|
211 [4, 'def6d2f1254a'].each do |r2|
226 [4, 'def6d2f1254a'].each do |r2|
212 get :diff, :id => 3, :rev => r1,
227 get :diff, :id => 3, :rev => r1,
213 :rev_to => r2
228 :rev_to => r2
214 assert_response :success
229 assert_response :success
215 assert_template 'diff'
230 assert_template 'diff'
216
231
217 diff = assigns(:diff)
232 diff = assigns(:diff)
218 assert_not_nil diff
233 assert_not_nil diff
219 assert_tag :tag => 'h2', :content => /4:def6d2f1254a 2:400bb8672109/
234 assert_tag :tag => 'h2', :content => /4:def6d2f1254a 2:400bb8672109/
220 end
235 end
221 end
236 end
222 end
237 end
223
238
224 def test_diff_latin_1
239 def test_diff_latin_1
225 [21, 'adf805632193'].each do |r1|
240 [21, 'adf805632193'].each do |r1|
226 get :diff, :id => 3, :rev => r1
241 get :diff, :id => 3, :rev => r1
227 assert_response :success
242 assert_response :success
228 assert_template 'diff'
243 assert_template 'diff'
229 assert_tag :tag => 'th',
244 assert_tag :tag => 'th',
230 :content => '2',
245 :content => '2',
231 :sibling => { :tag => 'td',
246 :sibling => { :tag => 'td',
232 :attributes => { :class => /diff_in/ },
247 :attributes => { :class => /diff_in/ },
233 :content => /It is written in Python/ }
248 :content => /It is written in Python/ }
234 end
249 end
235 end
250 end
236
251
237 def test_annotate
252 def test_annotate
238 get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb']
253 get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb']
239 assert_response :success
254 assert_response :success
240 assert_template 'annotate'
255 assert_template 'annotate'
241 # Line 23, revision 4:def6d2f1254a
256 # Line 23, revision 4:def6d2f1254a
242 assert_tag :tag => 'th',
257 assert_tag :tag => 'th',
243 :content => '23',
258 :content => '23',
244 :attributes => { :class => 'line-num' },
259 :attributes => { :class => 'line-num' },
245 :sibling =>
260 :sibling =>
246 {
261 {
247 :tag => 'td',
262 :tag => 'td',
248 :attributes => { :class => 'revision' },
263 :attributes => { :class => 'revision' },
249 :child => { :tag => 'a', :content => '4:def6d2f1254a' }
264 :child => { :tag => 'a', :content => '4:def6d2f1254a' }
250 }
265 }
251 assert_tag :tag => 'th',
266 assert_tag :tag => 'th',
252 :content => '23',
267 :content => '23',
253 :attributes => { :class => 'line-num' },
268 :attributes => { :class => 'line-num' },
254 :sibling =>
269 :sibling =>
255 {
270 {
256 :tag => 'td' ,
271 :tag => 'td' ,
257 :content => 'jsmith' ,
272 :content => 'jsmith' ,
258 :attributes => { :class => 'author' },
273 :attributes => { :class => 'author' },
259 }
274 }
260 assert_tag :tag => 'th',
275 assert_tag :tag => 'th',
261 :content => '23',
276 :content => '23',
262 :attributes => { :class => 'line-num' },
277 :attributes => { :class => 'line-num' },
263 :sibling => { :tag => 'td', :content => /watcher =/ }
278 :sibling => { :tag => 'td', :content => /watcher =/ }
264 end
279 end
265
280
266 def test_annotate_at_given_revision
281 def test_annotate_at_given_revision
267 @repository.fetch_changesets
282 @repository.fetch_changesets
268 @repository.reload
283 @repository.reload
269 [2, '400bb8672109', '400', 400].each do |r1|
284 [2, '400bb8672109', '400', 400].each do |r1|
270 get :annotate, :id => 3, :rev => r1, :path => ['sources', 'watchers_controller.rb']
285 get :annotate, :id => 3, :rev => r1, :path => ['sources', 'watchers_controller.rb']
271 assert_response :success
286 assert_response :success
272 assert_template 'annotate'
287 assert_template 'annotate'
273 assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
288 assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
274 end
289 end
275 end
290 end
276
291
277 def test_annotate_latin_1
292 def test_annotate_latin_1
278 [21, '21', 'adf805632193'].each do |r1|
293 [21, '21', 'adf805632193'].each do |r1|
279 get :annotate, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
294 get :annotate, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
280 assert_response :success
295 assert_response :success
281 assert_template 'annotate'
296 assert_template 'annotate'
282 assert_tag :tag => 'th',
297 assert_tag :tag => 'th',
283 :content => '1',
298 :content => '1',
284 :attributes => { :class => 'line-num' },
299 :attributes => { :class => 'line-num' },
285 :sibling =>
300 :sibling =>
286 {
301 {
287 :tag => 'td',
302 :tag => 'td',
288 :attributes => { :class => 'revision' },
303 :attributes => { :class => 'revision' },
289 :child => { :tag => 'a', :content => '20:709858aafd1b' }
304 :child => { :tag => 'a', :content => '20:709858aafd1b' }
290 }
305 }
291 assert_tag :tag => 'th',
306 assert_tag :tag => 'th',
292 :content => '1',
307 :content => '1',
293 :attributes => { :class => 'line-num' },
308 :attributes => { :class => 'line-num' },
294 :sibling =>
309 :sibling =>
295 {
310 {
296 :tag => 'td' ,
311 :tag => 'td' ,
297 :content => 'jsmith' ,
312 :content => 'jsmith' ,
298 :attributes => { :class => 'author' },
313 :attributes => { :class => 'author' },
299
314
300 }
315 }
301 assert_tag :tag => 'th',
316 assert_tag :tag => 'th',
302 :content => '1',
317 :content => '1',
303 :attributes => { :class => 'line-num' },
318 :attributes => { :class => 'line-num' },
304 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
319 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
305
320
306 end
321 end
307 end
322 end
308
323
309 def test_empty_revision
324 def test_empty_revision
310 @repository.fetch_changesets
325 @repository.fetch_changesets
311 @repository.reload
326 @repository.reload
312 ['', ' ', nil].each do |r|
327 ['', ' ', nil].each do |r|
313 get :revision, :id => 3, :rev => r
328 get :revision, :id => 3, :rev => r
314 assert_response 404
329 assert_response 404
315 assert_error_tag :content => /was not found/
330 assert_error_tag :content => /was not found/
316 end
331 end
317 end
332 end
318 else
333 else
319 puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
334 puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
320 def test_fake; assert true end
335 def test_fake; assert true end
321 end
336 end
322 end
337 end
General Comments 0
You need to be logged in to leave comments. Login now