##// END OF EJS Templates
scm: mercurial: add latest changesets improvement test in functional test....
Toshi MARUYAMA -
r5004:29c1aadbb558
parent child
Show More
@@ -1,337 +1,335
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
72 @repository.fetch_changesets
73 @repository.reload
73 @repository.reload
74 get :show, :id => 3
74 get :show, :id => 3
75 assert_response :success
75 assert_response :success
76 assert_template 'show'
76 assert_template 'show'
77 assert_not_nil assigns(:entries)
77 assert_not_nil assigns(:entries)
78 assert_equal 4, assigns(:entries).size
78 assert_equal 4, assigns(:entries).size
79 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
79 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
80 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
80 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
81 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)
82 assert_not_nil assigns(:changesets)
83 assigns(:changesets).size > 0
83 assigns(:changesets).size > 0
84 end
84 end
85
85
86 def test_show_directory
86 def test_show_directory
87 @repository.fetch_changesets
87 @repository.fetch_changesets
88 @repository.reload
88 @repository.reload
89 get :show, :id => 3, :path => ['images']
89 get :show, :id => 3, :path => ['images']
90 assert_response :success
90 assert_response :success
91 assert_template 'show'
91 assert_template 'show'
92 assert_not_nil assigns(:entries)
92 assert_not_nil assigns(:entries)
93 assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
93 assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
94 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
94 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
95 assert_not_nil entry
95 assert_not_nil entry
96 assert_equal 'file', entry.kind
96 assert_equal 'file', entry.kind
97 assert_equal 'images/edit.png', entry.path
97 assert_equal 'images/edit.png', entry.path
98 assert_not_nil assigns(:changesets)
98 assert_not_nil assigns(:changesets)
99 assigns(:changesets).size > 0
99 assigns(:changesets).size > 0
100 end
100 end
101
101
102 def test_show_at_given_revision
102 def test_show_at_given_revision
103 @repository.fetch_changesets
103 @repository.fetch_changesets
104 @repository.reload
104 @repository.reload
105 [0, '0', '0885933ad4f6'].each do |r1|
105 [0, '0', '0885933ad4f6'].each do |r1|
106 get :show, :id => 3, :path => ['images'], :rev => r1
106 get :show, :id => 3, :path => ['images'], :rev => r1
107 assert_response :success
107 assert_response :success
108 assert_template 'show'
108 assert_template 'show'
109 assert_not_nil assigns(:entries)
109 assert_not_nil assigns(:entries)
110 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
110 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
111 assert_not_nil assigns(:changesets)
111 assert_not_nil assigns(:changesets)
112 assigns(:changesets).size > 0
112 assigns(:changesets).size > 0
113 end
113 end
114 end
114 end
115
115
116 def test_show_directory_sql_escape_percent
116 def test_show_directory_sql_escape_percent
117 @repository.fetch_changesets
117 @repository.fetch_changesets
118 @repository.reload
118 @repository.reload
119 [13, '13', '3a330eb32958'].each do |r1|
119 [13, '13', '3a330eb32958'].each do |r1|
120 get :show, :id => 3, :path => ['sql_escape', 'percent%dir'], :rev => r1
120 get :show, :id => 3, :path => ['sql_escape', 'percent%dir'], :rev => r1
121 assert_response :success
121 assert_response :success
122 assert_template 'show'
122 assert_template 'show'
123
123
124 assert_not_nil assigns(:entries)
124 assert_not_nil assigns(:entries)
125 assert_equal ['percent%file1.txt', 'percentfile1.txt'], assigns(:entries).collect(&:name)
125 assert_equal ['percent%file1.txt', 'percentfile1.txt'], assigns(:entries).collect(&:name)
126 changesets = assigns(:changesets)
126 changesets = assigns(:changesets)
127 assert_not_nil changesets
127 assigns(:changesets).size > 0
128 assigns(:changesets).size > 0
128
129 assert_equal %w(13 11 10 9), changesets.collect(&:revision)
129 ## This is not yet implemented.
130 # assert_not_nil changesets
131 # assert_equal %w(13 11 10 9), changesets.collect(&:revision)
132 end
130 end
133 end
131 end
134
132
135 def test_show_directory_latin_1
133 def test_show_directory_latin_1
136 @repository.fetch_changesets
134 @repository.fetch_changesets
137 @repository.reload
135 @repository.reload
138 [21, '21', 'adf805632193'].each do |r1|
136 [21, '21', 'adf805632193'].each do |r1|
139 get :show, :id => 3, :path => ['latin-1-dir'], :rev => r1
137 get :show, :id => 3, :path => ['latin-1-dir'], :rev => r1
140 assert_response :success
138 assert_response :success
141 assert_template 'show'
139 assert_template 'show'
142
140
143 assert_not_nil assigns(:entries)
141 assert_not_nil assigns(:entries)
144 assert_equal ["make-latin-1-file.rb",
142 assert_equal ["make-latin-1-file.rb",
145 "test-#{@char_1}-1.txt",
143 "test-#{@char_1}-1.txt",
146 "test-#{@char_1}-2.txt",
144 "test-#{@char_1}-2.txt",
147 "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
145 "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
148 changesets = assigns(:changesets)
146 changesets = assigns(:changesets)
149 assert_not_nil changesets
147 assert_not_nil changesets
150 assert_equal %w(21 20 19 18 17), changesets.collect(&:revision)
148 assert_equal %w(21 20 19 18 17), changesets.collect(&:revision)
151 end
149 end
152 end
150 end
153
151
154 def test_changes
152 def test_changes
155 get :changes, :id => 3, :path => ['images', 'edit.png']
153 get :changes, :id => 3, :path => ['images', 'edit.png']
156 assert_response :success
154 assert_response :success
157 assert_template 'changes'
155 assert_template 'changes'
158 assert_tag :tag => 'h2', :content => 'edit.png'
156 assert_tag :tag => 'h2', :content => 'edit.png'
159 end
157 end
160
158
161 def test_entry_show
159 def test_entry_show
162 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb']
160 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb']
163 assert_response :success
161 assert_response :success
164 assert_template 'entry'
162 assert_template 'entry'
165 # Line 10
163 # Line 10
166 assert_tag :tag => 'th',
164 assert_tag :tag => 'th',
167 :content => '10',
165 :content => '10',
168 :attributes => { :class => 'line-num' },
166 :attributes => { :class => 'line-num' },
169 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
167 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
170 end
168 end
171
169
172 def test_entry_show_latin_1
170 def test_entry_show_latin_1
173 [21, '21', 'adf805632193'].each do |r1|
171 [21, '21', 'adf805632193'].each do |r1|
174 get :entry, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
172 get :entry, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
175 assert_response :success
173 assert_response :success
176 assert_template 'entry'
174 assert_template 'entry'
177 assert_tag :tag => 'th',
175 assert_tag :tag => 'th',
178 :content => '1',
176 :content => '1',
179 :attributes => { :class => 'line-num' },
177 :attributes => { :class => 'line-num' },
180 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
178 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
181 end
179 end
182 end
180 end
183
181
184 def test_entry_download
182 def test_entry_download
185 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb'], :format => 'raw'
183 get :entry, :id => 3, :path => ['sources', 'watchers_controller.rb'], :format => 'raw'
186 assert_response :success
184 assert_response :success
187 # File content
185 # File content
188 assert @response.body.include?('WITHOUT ANY WARRANTY')
186 assert @response.body.include?('WITHOUT ANY WARRANTY')
189 end
187 end
190
188
191 def test_directory_entry
189 def test_directory_entry
192 get :entry, :id => 3, :path => ['sources']
190 get :entry, :id => 3, :path => ['sources']
193 assert_response :success
191 assert_response :success
194 assert_template 'show'
192 assert_template 'show'
195 assert_not_nil assigns(:entry)
193 assert_not_nil assigns(:entry)
196 assert_equal 'sources', assigns(:entry).name
194 assert_equal 'sources', assigns(:entry).name
197 end
195 end
198
196
199 def test_diff
197 def test_diff
200 @repository.fetch_changesets
198 @repository.fetch_changesets
201 @repository.reload
199 @repository.reload
202
200
203 [4, '4', 'def6d2f1254a'].each do |r1|
201 [4, '4', 'def6d2f1254a'].each do |r1|
204 # Full diff of changeset 4
202 # Full diff of changeset 4
205 get :diff, :id => 3, :rev => r1
203 get :diff, :id => 3, :rev => r1
206 assert_response :success
204 assert_response :success
207 assert_template 'diff'
205 assert_template 'diff'
208
206
209 if @diff_c_support
207 if @diff_c_support
210 # Line 22 removed
208 # Line 22 removed
211 assert_tag :tag => 'th',
209 assert_tag :tag => 'th',
212 :content => '22',
210 :content => '22',
213 :sibling => { :tag => 'td',
211 :sibling => { :tag => 'td',
214 :attributes => { :class => /diff_out/ },
212 :attributes => { :class => /diff_out/ },
215 :content => /def remove/ }
213 :content => /def remove/ }
216 assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
214 assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
217 end
215 end
218 end
216 end
219 end
217 end
220
218
221 def test_diff_two_revs
219 def test_diff_two_revs
222 @repository.fetch_changesets
220 @repository.fetch_changesets
223 @repository.reload
221 @repository.reload
224
222
225 [2, '400bb8672109', '400', 400].each do |r1|
223 [2, '400bb8672109', '400', 400].each do |r1|
226 [4, 'def6d2f1254a'].each do |r2|
224 [4, 'def6d2f1254a'].each do |r2|
227 get :diff, :id => 3, :rev => r1,
225 get :diff, :id => 3, :rev => r1,
228 :rev_to => r2
226 :rev_to => r2
229 assert_response :success
227 assert_response :success
230 assert_template 'diff'
228 assert_template 'diff'
231
229
232 diff = assigns(:diff)
230 diff = assigns(:diff)
233 assert_not_nil diff
231 assert_not_nil diff
234 assert_tag :tag => 'h2', :content => /4:def6d2f1254a 2:400bb8672109/
232 assert_tag :tag => 'h2', :content => /4:def6d2f1254a 2:400bb8672109/
235 end
233 end
236 end
234 end
237 end
235 end
238
236
239 def test_diff_latin_1
237 def test_diff_latin_1
240 [21, 'adf805632193'].each do |r1|
238 [21, 'adf805632193'].each do |r1|
241 get :diff, :id => 3, :rev => r1
239 get :diff, :id => 3, :rev => r1
242 assert_response :success
240 assert_response :success
243 assert_template 'diff'
241 assert_template 'diff'
244 assert_tag :tag => 'th',
242 assert_tag :tag => 'th',
245 :content => '2',
243 :content => '2',
246 :sibling => { :tag => 'td',
244 :sibling => { :tag => 'td',
247 :attributes => { :class => /diff_in/ },
245 :attributes => { :class => /diff_in/ },
248 :content => /It is written in Python/ }
246 :content => /It is written in Python/ }
249 end
247 end
250 end
248 end
251
249
252 def test_annotate
250 def test_annotate
253 get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb']
251 get :annotate, :id => 3, :path => ['sources', 'watchers_controller.rb']
254 assert_response :success
252 assert_response :success
255 assert_template 'annotate'
253 assert_template 'annotate'
256 # Line 23, revision 4:def6d2f1254a
254 # Line 23, revision 4:def6d2f1254a
257 assert_tag :tag => 'th',
255 assert_tag :tag => 'th',
258 :content => '23',
256 :content => '23',
259 :attributes => { :class => 'line-num' },
257 :attributes => { :class => 'line-num' },
260 :sibling =>
258 :sibling =>
261 {
259 {
262 :tag => 'td',
260 :tag => 'td',
263 :attributes => { :class => 'revision' },
261 :attributes => { :class => 'revision' },
264 :child => { :tag => 'a', :content => '4:def6d2f1254a' }
262 :child => { :tag => 'a', :content => '4:def6d2f1254a' }
265 }
263 }
266 assert_tag :tag => 'th',
264 assert_tag :tag => 'th',
267 :content => '23',
265 :content => '23',
268 :attributes => { :class => 'line-num' },
266 :attributes => { :class => 'line-num' },
269 :sibling =>
267 :sibling =>
270 {
268 {
271 :tag => 'td' ,
269 :tag => 'td' ,
272 :content => 'jsmith' ,
270 :content => 'jsmith' ,
273 :attributes => { :class => 'author' },
271 :attributes => { :class => 'author' },
274 }
272 }
275 assert_tag :tag => 'th',
273 assert_tag :tag => 'th',
276 :content => '23',
274 :content => '23',
277 :attributes => { :class => 'line-num' },
275 :attributes => { :class => 'line-num' },
278 :sibling => { :tag => 'td', :content => /watcher =/ }
276 :sibling => { :tag => 'td', :content => /watcher =/ }
279 end
277 end
280
278
281 def test_annotate_at_given_revision
279 def test_annotate_at_given_revision
282 @repository.fetch_changesets
280 @repository.fetch_changesets
283 @repository.reload
281 @repository.reload
284 [2, '400bb8672109', '400', 400].each do |r1|
282 [2, '400bb8672109', '400', 400].each do |r1|
285 get :annotate, :id => 3, :rev => r1, :path => ['sources', 'watchers_controller.rb']
283 get :annotate, :id => 3, :rev => r1, :path => ['sources', 'watchers_controller.rb']
286 assert_response :success
284 assert_response :success
287 assert_template 'annotate'
285 assert_template 'annotate'
288 assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
286 assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
289 end
287 end
290 end
288 end
291
289
292 def test_annotate_latin_1
290 def test_annotate_latin_1
293 [21, '21', 'adf805632193'].each do |r1|
291 [21, '21', 'adf805632193'].each do |r1|
294 get :annotate, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
292 get :annotate, :id => 3, :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
295 assert_response :success
293 assert_response :success
296 assert_template 'annotate'
294 assert_template 'annotate'
297 assert_tag :tag => 'th',
295 assert_tag :tag => 'th',
298 :content => '1',
296 :content => '1',
299 :attributes => { :class => 'line-num' },
297 :attributes => { :class => 'line-num' },
300 :sibling =>
298 :sibling =>
301 {
299 {
302 :tag => 'td',
300 :tag => 'td',
303 :attributes => { :class => 'revision' },
301 :attributes => { :class => 'revision' },
304 :child => { :tag => 'a', :content => '20:709858aafd1b' }
302 :child => { :tag => 'a', :content => '20:709858aafd1b' }
305 }
303 }
306 assert_tag :tag => 'th',
304 assert_tag :tag => 'th',
307 :content => '1',
305 :content => '1',
308 :attributes => { :class => 'line-num' },
306 :attributes => { :class => 'line-num' },
309 :sibling =>
307 :sibling =>
310 {
308 {
311 :tag => 'td' ,
309 :tag => 'td' ,
312 :content => 'jsmith' ,
310 :content => 'jsmith' ,
313 :attributes => { :class => 'author' },
311 :attributes => { :class => 'author' },
314
312
315 }
313 }
316 assert_tag :tag => 'th',
314 assert_tag :tag => 'th',
317 :content => '1',
315 :content => '1',
318 :attributes => { :class => 'line-num' },
316 :attributes => { :class => 'line-num' },
319 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
317 :sibling => { :tag => 'td', :content => /Mercurial is a distributed version control system/ }
320
318
321 end
319 end
322 end
320 end
323
321
324 def test_empty_revision
322 def test_empty_revision
325 @repository.fetch_changesets
323 @repository.fetch_changesets
326 @repository.reload
324 @repository.reload
327 ['', ' ', nil].each do |r|
325 ['', ' ', nil].each do |r|
328 get :revision, :id => 3, :rev => r
326 get :revision, :id => 3, :rev => r
329 assert_response 404
327 assert_response 404
330 assert_error_tag :content => /was not found/
328 assert_error_tag :content => /was not found/
331 end
329 end
332 end
330 end
333 else
331 else
334 puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
332 puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
335 def test_fake; assert true end
333 def test_fake; assert true end
336 end
334 end
337 end
335 end
General Comments 0
You need to be logged in to leave comments. Login now