##// END OF EJS Templates
scm: git: add test of showing non ASCII contents of non ASCII path in functional test....
Toshi MARUYAMA -
r5577:6eb8b5fb4a4a
parent child
Show More
@@ -1,257 +1,293
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang
2 # Copyright (C) 2006-2011 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 RepositoriesGitControllerTest < ActionController::TestCase
24 class RepositoriesGitControllerTest < 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/git_repository'
28 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
29 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
29 REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
30 PRJ_ID = 3
30 PRJ_ID = 3
31 CHAR_1_HEX = "\xc3\x9c"
31
32
32 def setup
33 def setup
34 @ruby19_non_utf8_pass =
35 (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
36
33 @controller = RepositoriesController.new
37 @controller = RepositoriesController.new
34 @request = ActionController::TestRequest.new
38 @request = ActionController::TestRequest.new
35 @response = ActionController::TestResponse.new
39 @response = ActionController::TestResponse.new
36 User.current = nil
40 User.current = nil
37 @repository = Repository::Git.create(
41 @repository = Repository::Git.create(
38 :project => Project.find(3),
42 :project => Project.find(3),
39 :url => REPOSITORY_PATH,
43 :url => REPOSITORY_PATH,
40 :path_encoding => 'ISO-8859-1'
44 :path_encoding => 'ISO-8859-1'
41 )
45 )
42 assert @repository
46 assert @repository
47 @char_1 = CHAR_1_HEX.dup
48 if @char_1.respond_to?(:force_encoding)
49 @char_1.force_encoding('UTF-8')
50 end
43 end
51 end
44
52
45 if File.directory?(REPOSITORY_PATH)
53 if File.directory?(REPOSITORY_PATH)
46 def test_browse_root
54 def test_browse_root
47 @repository.fetch_changesets
55 @repository.fetch_changesets
48 @repository.reload
56 @repository.reload
49 get :show, :id => PRJ_ID
57 get :show, :id => PRJ_ID
50 assert_response :success
58 assert_response :success
51 assert_template 'show'
59 assert_template 'show'
52 assert_not_nil assigns(:entries)
60 assert_not_nil assigns(:entries)
53 assert_equal 9, assigns(:entries).size
61 assert_equal 9, assigns(:entries).size
54 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
62 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
55 assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'}
63 assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'}
56 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
64 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
57 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
65 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
58 assert assigns(:entries).detect {|e| e.name == 'copied_README' && e.kind == 'file'}
66 assert assigns(:entries).detect {|e| e.name == 'copied_README' && e.kind == 'file'}
59 assert assigns(:entries).detect {|e| e.name == 'new_file.txt' && e.kind == 'file'}
67 assert assigns(:entries).detect {|e| e.name == 'new_file.txt' && e.kind == 'file'}
60 assert assigns(:entries).detect {|e| e.name == 'renamed_test.txt' && e.kind == 'file'}
68 assert assigns(:entries).detect {|e| e.name == 'renamed_test.txt' && e.kind == 'file'}
61 assert assigns(:entries).detect {|e| e.name == 'filemane with spaces.txt' && e.kind == 'file'}
69 assert assigns(:entries).detect {|e| e.name == 'filemane with spaces.txt' && e.kind == 'file'}
62 assert assigns(:entries).detect {|e| e.name == ' filename with a leading space.txt ' && e.kind == 'file'}
70 assert assigns(:entries).detect {|e| e.name == ' filename with a leading space.txt ' && e.kind == 'file'}
63 assert_not_nil assigns(:changesets)
71 assert_not_nil assigns(:changesets)
64 assigns(:changesets).size > 0
72 assigns(:changesets).size > 0
65 end
73 end
66
74
67 def test_browse_branch
75 def test_browse_branch
68 @repository.fetch_changesets
76 @repository.fetch_changesets
69 @repository.reload
77 @repository.reload
70 get :show, :id => PRJ_ID, :rev => 'test_branch'
78 get :show, :id => PRJ_ID, :rev => 'test_branch'
71 assert_response :success
79 assert_response :success
72 assert_template 'show'
80 assert_template 'show'
73 assert_not_nil assigns(:entries)
81 assert_not_nil assigns(:entries)
74 assert_equal 4, assigns(:entries).size
82 assert_equal 4, assigns(:entries).size
75 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
83 assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'}
76 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
84 assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
77 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
85 assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'}
78 assert assigns(:entries).detect {|e| e.name == 'test.txt' && e.kind == 'file'}
86 assert assigns(:entries).detect {|e| e.name == 'test.txt' && e.kind == 'file'}
79 assert_not_nil assigns(:changesets)
87 assert_not_nil assigns(:changesets)
80 assigns(:changesets).size > 0
88 assigns(:changesets).size > 0
81 end
89 end
82
90
83 def test_browse_tag
91 def test_browse_tag
84 @repository.fetch_changesets
92 @repository.fetch_changesets
85 @repository.reload
93 @repository.reload
86 [
94 [
87 "tag00.lightweight",
95 "tag00.lightweight",
88 "tag01.annotated",
96 "tag01.annotated",
89 ].each do |t1|
97 ].each do |t1|
90 get :show, :id => PRJ_ID, :rev => t1
98 get :show, :id => PRJ_ID, :rev => t1
91 assert_response :success
99 assert_response :success
92 assert_template 'show'
100 assert_template 'show'
93 assert_not_nil assigns(:entries)
101 assert_not_nil assigns(:entries)
94 assigns(:entries).size > 0
102 assigns(:entries).size > 0
95 assert_not_nil assigns(:changesets)
103 assert_not_nil assigns(:changesets)
96 assigns(:changesets).size > 0
104 assigns(:changesets).size > 0
97 end
105 end
98 end
106 end
99
107
100 def test_browse_directory
108 def test_browse_directory
101 @repository.fetch_changesets
109 @repository.fetch_changesets
102 @repository.reload
110 @repository.reload
103 get :show, :id => PRJ_ID, :path => ['images']
111 get :show, :id => PRJ_ID, :path => ['images']
104 assert_response :success
112 assert_response :success
105 assert_template 'show'
113 assert_template 'show'
106 assert_not_nil assigns(:entries)
114 assert_not_nil assigns(:entries)
107 assert_equal ['edit.png'], assigns(:entries).collect(&:name)
115 assert_equal ['edit.png'], assigns(:entries).collect(&:name)
108 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
116 entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
109 assert_not_nil entry
117 assert_not_nil entry
110 assert_equal 'file', entry.kind
118 assert_equal 'file', entry.kind
111 assert_equal 'images/edit.png', entry.path
119 assert_equal 'images/edit.png', entry.path
112 assert_not_nil assigns(:changesets)
120 assert_not_nil assigns(:changesets)
113 assigns(:changesets).size > 0
121 assigns(:changesets).size > 0
114 end
122 end
115
123
116 def test_browse_at_given_revision
124 def test_browse_at_given_revision
117 @repository.fetch_changesets
125 @repository.fetch_changesets
118 @repository.reload
126 @repository.reload
119 get :show, :id => PRJ_ID, :path => ['images'],
127 get :show, :id => PRJ_ID, :path => ['images'],
120 :rev => '7234cb2750b63f47bff735edc50a1c0a433c2518'
128 :rev => '7234cb2750b63f47bff735edc50a1c0a433c2518'
121 assert_response :success
129 assert_response :success
122 assert_template 'show'
130 assert_template 'show'
123 assert_not_nil assigns(:entries)
131 assert_not_nil assigns(:entries)
124 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
132 assert_equal ['delete.png'], assigns(:entries).collect(&:name)
125 assert_not_nil assigns(:changesets)
133 assert_not_nil assigns(:changesets)
126 assigns(:changesets).size > 0
134 assigns(:changesets).size > 0
127 end
135 end
128
136
129 def test_changes
137 def test_changes
130 get :changes, :id => PRJ_ID, :path => ['images', 'edit.png']
138 get :changes, :id => PRJ_ID, :path => ['images', 'edit.png']
131 assert_response :success
139 assert_response :success
132 assert_template 'changes'
140 assert_template 'changes'
133 assert_tag :tag => 'h2', :content => 'edit.png'
141 assert_tag :tag => 'h2', :content => 'edit.png'
134 end
142 end
135
143
136 def test_entry_show
144 def test_entry_show
137 get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
145 get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
138 assert_response :success
146 assert_response :success
139 assert_template 'entry'
147 assert_template 'entry'
140 # Line 19
148 # Line 19
141 assert_tag :tag => 'th',
149 assert_tag :tag => 'th',
142 :content => '11',
150 :content => '11',
143 :attributes => { :class => 'line-num' },
151 :attributes => { :class => 'line-num' },
144 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
152 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
145 end
153 end
146
154
155 def test_entry_show_latin_1
156 if @ruby19_non_utf8_pass
157 puts_ruby19_non_utf8_pass()
158 else
159 with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
160 ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|
161 get :entry, :id => PRJ_ID,
162 :path => ['latin-1-dir', "test-#{@char_1}.txt"], :rev => r1
163 assert_response :success
164 assert_template 'entry'
165 assert_tag :tag => 'th',
166 :content => '1',
167 :attributes => { :class => 'line-num' },
168 :sibling => { :tag => 'td',
169 :content => /test-#{@char_1}.txt/ }
170 end
171 end
172 end
173 end
174
147 def test_entry_download
175 def test_entry_download
148 get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb'],
176 get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb'],
149 :format => 'raw'
177 :format => 'raw'
150 assert_response :success
178 assert_response :success
151 # File content
179 # File content
152 assert @response.body.include?('WITHOUT ANY WARRANTY')
180 assert @response.body.include?('WITHOUT ANY WARRANTY')
153 end
181 end
154
182
155 def test_directory_entry
183 def test_directory_entry
156 get :entry, :id => PRJ_ID, :path => ['sources']
184 get :entry, :id => PRJ_ID, :path => ['sources']
157 assert_response :success
185 assert_response :success
158 assert_template 'show'
186 assert_template 'show'
159 assert_not_nil assigns(:entry)
187 assert_not_nil assigns(:entry)
160 assert_equal 'sources', assigns(:entry).name
188 assert_equal 'sources', assigns(:entry).name
161 end
189 end
162
190
163 def test_diff
191 def test_diff
164 @repository.fetch_changesets
192 @repository.fetch_changesets
165 @repository.reload
193 @repository.reload
166 # Full diff of changeset 2f9c0091
194 # Full diff of changeset 2f9c0091
167 get :diff, :id => PRJ_ID, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
195 get :diff, :id => PRJ_ID, :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
168 assert_response :success
196 assert_response :success
169 assert_template 'diff'
197 assert_template 'diff'
170 # Line 22 removed
198 # Line 22 removed
171 assert_tag :tag => 'th',
199 assert_tag :tag => 'th',
172 :content => /22/,
200 :content => /22/,
173 :sibling => { :tag => 'td',
201 :sibling => { :tag => 'td',
174 :attributes => { :class => /diff_out/ },
202 :attributes => { :class => /diff_out/ },
175 :content => /def remove/ }
203 :content => /def remove/ }
176 assert_tag :tag => 'h2', :content => /2f9c0091/
204 assert_tag :tag => 'h2', :content => /2f9c0091/
177 end
205 end
178
206
179 def test_diff_two_revs
207 def test_diff_two_revs
180 @repository.fetch_changesets
208 @repository.fetch_changesets
181 @repository.reload
209 @repository.reload
182 get :diff, :id => PRJ_ID,
210 get :diff, :id => PRJ_ID,
183 :rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
211 :rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
184 :rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
212 :rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
185 assert_response :success
213 assert_response :success
186 assert_template 'diff'
214 assert_template 'diff'
187 diff = assigns(:diff)
215 diff = assigns(:diff)
188 assert_not_nil diff
216 assert_not_nil diff
189 assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
217 assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/
190 end
218 end
191
219
192 def test_annotate
220 def test_annotate
193 get :annotate, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
221 get :annotate, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
194 assert_response :success
222 assert_response :success
195 assert_template 'annotate'
223 assert_template 'annotate'
196 # Line 23, changeset 2f9c0091
224 # Line 23, changeset 2f9c0091
197 assert_tag :tag => 'th', :content => '24',
225 assert_tag :tag => 'th', :content => '24',
198 :sibling => {
226 :sibling => {
199 :tag => 'td',
227 :tag => 'td',
200 :child => {
228 :child => {
201 :tag => 'a',
229 :tag => 'a',
202 :content => /2f9c0091c754a91af7a9c478e36556b4bde8dcf7/
230 :content => /2f9c0091c754a91af7a9c478e36556b4bde8dcf7/
203 }
231 }
204 },
232 },
205 :sibling => { :tag => 'td', :content => /jsmith/ }
233 :sibling => { :tag => 'td', :content => /jsmith/ }
206 assert_tag :tag => 'th', :content => '24',
234 assert_tag :tag => 'th', :content => '24',
207 :sibling => {
235 :sibling => {
208 :tag => 'td',
236 :tag => 'td',
209 :child => {
237 :child => {
210 :tag => 'a',
238 :tag => 'a',
211 :content => /2f9c0091c754a91af7a9c478e36556b4bde8dcf7/
239 :content => /2f9c0091c754a91af7a9c478e36556b4bde8dcf7/
212 }
240 }
213 },
241 },
214 :sibling => { :tag => 'td', :content => /watcher =/ }
242 :sibling => { :tag => 'td', :content => /watcher =/ }
215 end
243 end
216
244
217 def test_annotate_at_given_revision
245 def test_annotate_at_given_revision
218 @repository.fetch_changesets
246 @repository.fetch_changesets
219 @repository.reload
247 @repository.reload
220 get :annotate, :id => PRJ_ID, :rev => 'deff7',
248 get :annotate, :id => PRJ_ID, :rev => 'deff7',
221 :path => ['sources', 'watchers_controller.rb']
249 :path => ['sources', 'watchers_controller.rb']
222 assert_response :success
250 assert_response :success
223 assert_template 'annotate'
251 assert_template 'annotate'
224 assert_tag :tag => 'h2', :content => /@ deff712f/
252 assert_tag :tag => 'h2', :content => /@ deff712f/
225 end
253 end
226
254
227 def test_annotate_binary_file
255 def test_annotate_binary_file
228 get :annotate, :id => PRJ_ID, :path => ['images', 'edit.png']
256 get :annotate, :id => PRJ_ID, :path => ['images', 'edit.png']
229 assert_response 500
257 assert_response 500
230 assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
258 assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
231 :content => /cannot be annotated/
259 :content => /cannot be annotated/
232 end
260 end
233
261
234 def test_revision
262 def test_revision
235 @repository.fetch_changesets
263 @repository.fetch_changesets
236 @repository.reload
264 @repository.reload
237 ['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r|
265 ['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r|
238 get :revision, :id => PRJ_ID, :rev => r
266 get :revision, :id => PRJ_ID, :rev => r
239 assert_response :success
267 assert_response :success
240 assert_template 'revision'
268 assert_template 'revision'
241 end
269 end
242 end
270 end
243
271
244 def test_empty_revision
272 def test_empty_revision
245 @repository.fetch_changesets
273 @repository.fetch_changesets
246 @repository.reload
274 @repository.reload
247 ['', ' ', nil].each do |r|
275 ['', ' ', nil].each do |r|
248 get :revision, :id => PRJ_ID, :rev => r
276 get :revision, :id => PRJ_ID, :rev => r
249 assert_response 404
277 assert_response 404
250 assert_error_tag :content => /was not found/
278 assert_error_tag :content => /was not found/
251 end
279 end
252 end
280 end
281
282 private
283
284 def puts_ruby19_non_utf8_pass
285 puts "TODO: This test fails in Ruby 1.9 " +
286 "and Encoding.default_external is not UTF-8. " +
287 "Current value is '#{Encoding.default_external.to_s}'"
288 end
253 else
289 else
254 puts "Git test repository NOT FOUND. Skipping functional tests !!!"
290 puts "Git test repository NOT FOUND. Skipping functional tests !!!"
255 def test_fake; assert true end
291 def test_fake; assert true end
256 end
292 end
257 end
293 end
General Comments 0
You need to be logged in to leave comments. Login now