Chris@119
|
1 # encoding: utf-8
|
Chris@119
|
2
|
Chris@245
|
3 # This file includes UTF-8 "Felix Schäfer".
|
Chris@245
|
4 # We need to consider Ruby 1.9 compatibility.
|
Chris@245
|
5
|
Chris@119
|
6 require File.expand_path('../../../../../../test_helper', __FILE__)
|
Chris@245
|
7 begin
|
Chris@245
|
8 require 'mocha'
|
Chris@0
|
9
|
Chris@245
|
10 class GitAdapterTest < ActiveSupport::TestCase
|
Chris@245
|
11 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/git_repository'
|
Chris@0
|
12
|
Chris@245
|
13 FELIX_UTF8 = "Felix Schäfer"
|
Chris@245
|
14 FELIX_HEX = "Felix Sch\xC3\xA4fer"
|
Chris@441
|
15 CHAR_1_HEX = "\xc3\x9c"
|
Chris@441
|
16
|
Chris@441
|
17 ## Ruby uses ANSI api to fork a process on Windows.
|
Chris@441
|
18 ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem
|
Chris@441
|
19 ## and these are incompatible with ASCII.
|
Chris@441
|
20 # WINDOWS_PASS = Redmine::Platform.mswin?
|
Chris@441
|
21 WINDOWS_PASS = false
|
Chris@245
|
22
|
Chris@245
|
23 if File.directory?(REPOSITORY_PATH)
|
Chris@245
|
24 def setup
|
Chris@441
|
25 adapter_class = Redmine::Scm::Adapters::GitAdapter
|
Chris@441
|
26 assert adapter_class
|
Chris@441
|
27 assert adapter_class.client_command
|
Chris@441
|
28 assert_equal true, adapter_class.client_available
|
Chris@441
|
29 assert_equal true, adapter_class.client_version_above?([1])
|
Chris@441
|
30 assert_equal true, adapter_class.client_version_above?([1, 0])
|
Chris@441
|
31
|
Chris@441
|
32 @adapter = Redmine::Scm::Adapters::GitAdapter.new(
|
Chris@441
|
33 REPOSITORY_PATH,
|
Chris@441
|
34 nil,
|
Chris@441
|
35 nil,
|
Chris@441
|
36 nil,
|
Chris@441
|
37 'ISO-8859-1'
|
Chris@441
|
38 )
|
Chris@441
|
39 assert @adapter
|
Chris@441
|
40 @char_1 = CHAR_1_HEX.dup
|
Chris@441
|
41 if @char_1.respond_to?(:force_encoding)
|
Chris@441
|
42 @char_1.force_encoding('UTF-8')
|
Chris@441
|
43 end
|
Chris@245
|
44 end
|
Chris@245
|
45
|
Chris@245
|
46 def test_scm_version
|
Chris@245
|
47 to_test = { "git version 1.7.3.4\n" => [1,7,3,4],
|
Chris@245
|
48 "1.6.1\n1.7\n1.8" => [1,6,1],
|
Chris@245
|
49 "1.6.2\r\n1.8.1\r\n1.9.1" => [1,6,2]}
|
Chris@245
|
50 to_test.each do |s, v|
|
Chris@245
|
51 test_scm_version_for(s, v)
|
Chris@245
|
52 end
|
Chris@245
|
53 end
|
Chris@245
|
54
|
Chris@245
|
55 def test_branches
|
Chris@441
|
56 assert_equal [
|
Chris@441
|
57 'latin-1-path-encoding',
|
Chris@441
|
58 'master',
|
Chris@441
|
59 'test-latin-1',
|
Chris@441
|
60 'test_branch',
|
Chris@441
|
61 ], @adapter.branches
|
Chris@441
|
62 end
|
Chris@441
|
63
|
Chris@441
|
64 def test_tags
|
Chris@441
|
65 assert_equal [
|
Chris@441
|
66 "tag00.lightweight",
|
Chris@441
|
67 "tag01.annotated",
|
Chris@441
|
68 ], @adapter.tags
|
Chris@245
|
69 end
|
Chris@245
|
70
|
Chris@245
|
71 def test_getting_all_revisions
|
Chris@441
|
72 assert_equal 21, @adapter.revisions('',nil,nil,:all => true).length
|
Chris@245
|
73 end
|
Chris@245
|
74
|
Chris@245
|
75 def test_getting_certain_revisions
|
Chris@245
|
76 assert_equal 1, @adapter.revisions('','899a15d^','899a15d').length
|
Chris@245
|
77 end
|
Chris@245
|
78
|
Chris@441
|
79 def test_revisions_reverse
|
Chris@441
|
80 revs1 = @adapter.revisions('',nil,nil,{:all => true, :reverse => true })
|
Chris@441
|
81 assert_equal 21, revs1.length
|
Chris@441
|
82 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[0].identifier
|
Chris@441
|
83 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[20].identifier
|
Chris@441
|
84 end
|
Chris@441
|
85
|
Chris@441
|
86 def test_revisions_reverse_with_time
|
Chris@441
|
87 since2 = Time.gm(2010, 9, 30, 0, 0, 0)
|
Chris@441
|
88 revs2 = @adapter.revisions('', nil, nil,
|
Chris@441
|
89 {:all => true, :since => since2, :reverse => true})
|
Chris@441
|
90 assert_equal 6, revs2.length
|
Chris@441
|
91 assert_equal '67e7792ce20ccae2e4bb73eed09bb397819c8834', revs2[0].identifier
|
Chris@441
|
92 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[5].identifier
|
Chris@441
|
93 end
|
Chris@441
|
94
|
Chris@441
|
95 def test_revisions_master_all
|
Chris@441
|
96 revs1 = []
|
Chris@441
|
97 @adapter.revisions('', nil, "master",{}) do |rev|
|
Chris@441
|
98 revs1 << rev
|
Chris@441
|
99 end
|
Chris@441
|
100 assert_equal 15, revs1.length
|
Chris@441
|
101 assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[ 0].identifier
|
Chris@441
|
102 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
|
Chris@441
|
103
|
Chris@441
|
104 revs2 = []
|
Chris@441
|
105 @adapter.revisions('', nil, "master",
|
Chris@441
|
106 {:reverse => true}) do |rev|
|
Chris@441
|
107 revs2 << rev
|
Chris@441
|
108 end
|
Chris@441
|
109 assert_equal 15, revs2.length
|
Chris@441
|
110 assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
|
Chris@441
|
111 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[ 0].identifier
|
Chris@441
|
112 end
|
Chris@441
|
113
|
Chris@441
|
114 def test_revisions_master_merged_rev
|
Chris@441
|
115 revs1 = []
|
Chris@441
|
116 @adapter.revisions('',
|
Chris@441
|
117 "713f4944648826f558cf548222f813dabe7cbb04",
|
Chris@441
|
118 "master",
|
Chris@441
|
119 {:reverse => true}) do |rev|
|
Chris@441
|
120 revs1 << rev
|
Chris@441
|
121 end
|
Chris@441
|
122 assert_equal 8, revs1.length
|
Chris@441
|
123 assert_equal 'fba357b886984ee71185ad2065e65fc0417d9b92', revs1[ 0].identifier
|
Chris@441
|
124 assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs1[ 1].identifier
|
Chris@441
|
125 # 4a07fe31b is not a child of 713f49446
|
Chris@441
|
126 assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs1[ 2].identifier
|
Chris@441
|
127 # Merged revision
|
Chris@441
|
128 assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs1[ 3].identifier
|
Chris@441
|
129 assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs1[-1].identifier
|
Chris@441
|
130
|
Chris@441
|
131 revs2 = []
|
Chris@441
|
132 @adapter.revisions('',
|
Chris@441
|
133 "fba357b886984ee71185ad2065e65fc0417d9b92",
|
Chris@441
|
134 "master",
|
Chris@441
|
135 {:reverse => true}) do |rev|
|
Chris@441
|
136 revs2 << rev
|
Chris@441
|
137 end
|
Chris@441
|
138 assert_equal 7, revs2.length
|
Chris@441
|
139 assert_equal '7e61ac704deecde634b51e59daa8110435dcb3da', revs2[ 0].identifier
|
Chris@441
|
140 # 4a07fe31b is not a child of fba357b8869
|
Chris@441
|
141 assert_equal '4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8', revs2[ 1].identifier
|
Chris@441
|
142 # Merged revision
|
Chris@441
|
143 assert_equal '32ae898b720c2f7eec2723d5bdd558b4cb2d3ddf', revs2[ 2].identifier
|
Chris@441
|
144 assert_equal '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', revs2[-1].identifier
|
Chris@441
|
145 end
|
Chris@441
|
146
|
Chris@441
|
147 def test_revisions_branch_latin_1_path_encoding_all
|
Chris@441
|
148 revs1 = []
|
Chris@441
|
149 @adapter.revisions('', nil, "latin-1-path-encoding",{}) do |rev|
|
Chris@441
|
150 revs1 << rev
|
Chris@441
|
151 end
|
Chris@441
|
152 assert_equal 8, revs1.length
|
Chris@441
|
153 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[ 0].identifier
|
Chris@441
|
154 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs1[-1].identifier
|
Chris@441
|
155
|
Chris@441
|
156 revs2 = []
|
Chris@441
|
157 @adapter.revisions('', nil, "latin-1-path-encoding",
|
Chris@441
|
158 {:reverse => true}) do |rev|
|
Chris@441
|
159 revs2 << rev
|
Chris@441
|
160 end
|
Chris@441
|
161 assert_equal 8, revs2.length
|
Chris@441
|
162 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
|
Chris@441
|
163 assert_equal '7234cb2750b63f47bff735edc50a1c0a433c2518', revs2[ 0].identifier
|
Chris@441
|
164 end
|
Chris@441
|
165
|
Chris@441
|
166 def test_revisions_branch_latin_1_path_encoding_with_rev
|
Chris@441
|
167 revs1 = []
|
Chris@441
|
168 @adapter.revisions('',
|
Chris@441
|
169 '7234cb2750b63f47bff735edc50a1c0a433c2518',
|
Chris@441
|
170 "latin-1-path-encoding",
|
Chris@441
|
171 {:reverse => true}) do |rev|
|
Chris@441
|
172 revs1 << rev
|
Chris@441
|
173 end
|
Chris@441
|
174 assert_equal 7, revs1.length
|
Chris@441
|
175 assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', revs1[ 0].identifier
|
Chris@441
|
176 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs1[-1].identifier
|
Chris@441
|
177
|
Chris@441
|
178 revs2 = []
|
Chris@441
|
179 @adapter.revisions('',
|
Chris@441
|
180 '57ca437c0acbbcb749821fdf3726a1367056d364',
|
Chris@441
|
181 "latin-1-path-encoding",
|
Chris@441
|
182 {:reverse => true}) do |rev|
|
Chris@441
|
183 revs2 << rev
|
Chris@441
|
184 end
|
Chris@441
|
185 assert_equal 3, revs2.length
|
Chris@441
|
186 assert_equal '4fc55c43bf3d3dc2efb66145365ddc17639ce81e', revs2[ 0].identifier
|
Chris@441
|
187 assert_equal '1ca7f5ed374f3cb31a93ae5215c2e25cc6ec5127', revs2[-1].identifier
|
Chris@441
|
188 end
|
Chris@441
|
189
|
Chris@441
|
190 def test_revisions_invalid_rev
|
Chris@441
|
191 revs1 = []
|
Chris@441
|
192 @adapter.revisions('',
|
Chris@441
|
193 '1234abcd',
|
Chris@441
|
194 "master",
|
Chris@441
|
195 {:reverse => true}) do |rev|
|
Chris@441
|
196 revs1 << rev
|
Chris@441
|
197 end
|
Chris@441
|
198 assert_equal [], revs1
|
Chris@441
|
199 end
|
Chris@441
|
200
|
Chris@245
|
201 def test_getting_revisions_with_spaces_in_filename
|
Chris@245
|
202 assert_equal 1, @adapter.revisions("filemane with spaces.txt",
|
Chris@245
|
203 nil, nil, :all => true).length
|
Chris@245
|
204 end
|
Chris@245
|
205
|
Chris@245
|
206 def test_getting_revisions_with_leading_and_trailing_spaces_in_filename
|
Chris@245
|
207 assert_equal " filename with a leading space.txt ",
|
Chris@245
|
208 @adapter.revisions(" filename with a leading space.txt ",
|
Chris@245
|
209 nil, nil, :all => true)[0].paths[0][:path]
|
Chris@245
|
210 end
|
Chris@245
|
211
|
Chris@245
|
212 def test_getting_entries_with_leading_and_trailing_spaces_in_filename
|
Chris@245
|
213 assert_equal " filename with a leading space.txt ",
|
Chris@245
|
214 @adapter.entries('',
|
Chris@245
|
215 '83ca5fd546063a3c7dc2e568ba3355661a9e2b2c')[3].name
|
Chris@245
|
216 end
|
Chris@245
|
217
|
Chris@245
|
218 def test_annotate
|
Chris@245
|
219 annotate = @adapter.annotate('sources/watchers_controller.rb')
|
Chris@245
|
220 assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
|
Chris@245
|
221 assert_equal 41, annotate.lines.size
|
Chris@441
|
222 assert_equal "# This program is free software; you can redistribute it and/or",
|
Chris@441
|
223 annotate.lines[4].strip
|
Chris@245
|
224 assert_equal "7234cb2750b63f47bff735edc50a1c0a433c2518",
|
Chris@245
|
225 annotate.revisions[4].identifier
|
Chris@245
|
226 assert_equal "jsmith", annotate.revisions[4].author
|
Chris@245
|
227 end
|
Chris@245
|
228
|
Chris@245
|
229 def test_annotate_moved_file
|
Chris@245
|
230 annotate = @adapter.annotate('renamed_test.txt')
|
Chris@245
|
231 assert_kind_of Redmine::Scm::Adapters::Annotate, annotate
|
Chris@245
|
232 assert_equal 2, annotate.lines.size
|
Chris@245
|
233 end
|
Chris@245
|
234
|
Chris@245
|
235 def test_last_rev
|
Chris@245
|
236 last_rev = @adapter.lastrev("README",
|
Chris@245
|
237 "4f26664364207fa8b1af9f8722647ab2d4ac5d43")
|
Chris@245
|
238 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.scmid
|
Chris@245
|
239 assert_equal "4a07fe31bffcf2888791f3e6cbc9c4545cefe3e8", last_rev.identifier
|
Chris@245
|
240 assert_equal "Adam Soltys <asoltys@gmail.com>", last_rev.author
|
Chris@245
|
241 assert_equal "2009-06-24 05:27:38".to_time, last_rev.time
|
Chris@245
|
242 end
|
Chris@245
|
243
|
Chris@245
|
244 def test_last_rev_with_spaces_in_filename
|
Chris@245
|
245 last_rev = @adapter.lastrev("filemane with spaces.txt",
|
Chris@245
|
246 "ed5bb786bbda2dee66a2d50faf51429dbc043a7b")
|
Chris@441
|
247 str_felix_utf8 = FELIX_UTF8.dup
|
Chris@441
|
248 str_felix_hex = FELIX_HEX.dup
|
Chris@245
|
249 last_rev_author = last_rev.author
|
Chris@245
|
250 if last_rev_author.respond_to?(:force_encoding)
|
Chris@245
|
251 last_rev_author.force_encoding('UTF-8')
|
Chris@245
|
252 end
|
Chris@245
|
253 assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.scmid
|
Chris@245
|
254 assert_equal "ed5bb786bbda2dee66a2d50faf51429dbc043a7b", last_rev.identifier
|
Chris@245
|
255 assert_equal "#{str_felix_utf8} <felix@fachschaften.org>",
|
Chris@245
|
256 last_rev.author
|
Chris@245
|
257 assert_equal "#{str_felix_hex} <felix@fachschaften.org>",
|
Chris@245
|
258 last_rev.author
|
Chris@245
|
259 assert_equal "2010-09-18 19:59:46".to_time, last_rev.time
|
Chris@245
|
260 end
|
Chris@245
|
261
|
Chris@441
|
262 def test_latin_1_path
|
Chris@441
|
263 if WINDOWS_PASS
|
Chris@441
|
264 #
|
Chris@441
|
265 else
|
Chris@441
|
266 p2 = "latin-1-dir/test-#{@char_1}-2.txt"
|
Chris@441
|
267 ['4fc55c43bf3d3dc2efb66145365ddc17639ce81e', '4fc55c43bf3'].each do |r1|
|
Chris@441
|
268 assert @adapter.diff(p2, r1)
|
Chris@441
|
269 assert @adapter.cat(p2, r1)
|
Chris@441
|
270 assert_equal 1, @adapter.annotate(p2, r1).lines.length
|
Chris@441
|
271 ['64f1f3e89ad1cb57976ff0ad99a107012ba3481d', '64f1f3e89ad1cb5797'].each do |r2|
|
Chris@441
|
272 assert @adapter.diff(p2, r1, r2)
|
Chris@441
|
273 end
|
Chris@441
|
274 end
|
Chris@441
|
275 end
|
Chris@441
|
276 end
|
Chris@441
|
277
|
Chris@441
|
278 def test_entries_tag
|
Chris@441
|
279 entries1 = @adapter.entries(nil, 'tag01.annotated',
|
Chris@441
|
280 options = {:report_last_commit => true})
|
Chris@441
|
281 assert entries1
|
Chris@441
|
282 assert_equal 3, entries1.size
|
Chris@441
|
283 assert_equal 'sources', entries1[1].name
|
Chris@441
|
284 assert_equal 'sources', entries1[1].path
|
Chris@441
|
285 assert_equal 'dir', entries1[1].kind
|
Chris@441
|
286 readme = entries1[2]
|
Chris@441
|
287 assert_equal 'README', readme.name
|
Chris@441
|
288 assert_equal 'README', readme.path
|
Chris@441
|
289 assert_equal 'file', readme.kind
|
Chris@441
|
290 assert_equal 27, readme.size
|
Chris@441
|
291 assert_equal '899a15dba03a3b350b89c3f537e4bbe02a03cdc9', readme.lastrev.identifier
|
Chris@441
|
292 assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time
|
Chris@441
|
293 end
|
Chris@441
|
294
|
Chris@441
|
295 def test_entries_branch
|
Chris@441
|
296 entries1 = @adapter.entries(nil, 'test_branch',
|
Chris@441
|
297 options = {:report_last_commit => true})
|
Chris@441
|
298 assert entries1
|
Chris@441
|
299 assert_equal 4, entries1.size
|
Chris@441
|
300 assert_equal 'sources', entries1[1].name
|
Chris@441
|
301 assert_equal 'sources', entries1[1].path
|
Chris@441
|
302 assert_equal 'dir', entries1[1].kind
|
Chris@441
|
303 readme = entries1[2]
|
Chris@441
|
304 assert_equal 'README', readme.name
|
Chris@441
|
305 assert_equal 'README', readme.path
|
Chris@441
|
306 assert_equal 'file', readme.kind
|
Chris@441
|
307 assert_equal 159, readme.size
|
Chris@441
|
308 assert_equal '713f4944648826f558cf548222f813dabe7cbb04', readme.lastrev.identifier
|
Chris@441
|
309 assert_equal Time.gm(2009, 6, 19, 4, 37, 23), readme.lastrev.time
|
Chris@441
|
310 end
|
Chris@441
|
311
|
Chris@441
|
312 def test_entries_latin_1_files
|
Chris@441
|
313 entries1 = @adapter.entries('latin-1-dir', '64f1f3e8')
|
Chris@441
|
314 assert entries1
|
Chris@441
|
315 assert_equal 3, entries1.size
|
Chris@441
|
316 f1 = entries1[1]
|
Chris@441
|
317 assert_equal "test-#{@char_1}-2.txt", f1.name
|
Chris@441
|
318 assert_equal "latin-1-dir/test-#{@char_1}-2.txt", f1.path
|
Chris@441
|
319 assert_equal 'file', f1.kind
|
Chris@441
|
320 end
|
Chris@441
|
321
|
Chris@441
|
322 def test_entries_latin_1_dir
|
Chris@441
|
323 if WINDOWS_PASS
|
Chris@441
|
324 #
|
Chris@441
|
325 else
|
Chris@441
|
326 entries1 = @adapter.entries("latin-1-dir/test-#{@char_1}-subdir",
|
Chris@441
|
327 '1ca7f5ed')
|
Chris@441
|
328 assert entries1
|
Chris@441
|
329 assert_equal 3, entries1.size
|
Chris@441
|
330 f1 = entries1[1]
|
Chris@441
|
331 assert_equal "test-#{@char_1}-2.txt", f1.name
|
Chris@441
|
332 assert_equal "latin-1-dir/test-#{@char_1}-subdir/test-#{@char_1}-2.txt", f1.path
|
Chris@441
|
333 assert_equal 'file', f1.kind
|
Chris@441
|
334 end
|
Chris@441
|
335 end
|
Chris@441
|
336
|
Chris@441
|
337 def test_path_encoding_default_utf8
|
Chris@441
|
338 adpt1 = Redmine::Scm::Adapters::GitAdapter.new(
|
Chris@441
|
339 REPOSITORY_PATH
|
Chris@441
|
340 )
|
Chris@441
|
341 assert_equal "UTF-8", adpt1.path_encoding
|
Chris@441
|
342 adpt2 = Redmine::Scm::Adapters::GitAdapter.new(
|
Chris@441
|
343 REPOSITORY_PATH,
|
Chris@441
|
344 nil,
|
Chris@441
|
345 nil,
|
Chris@441
|
346 nil,
|
Chris@441
|
347 ""
|
Chris@441
|
348 )
|
Chris@441
|
349 assert_equal "UTF-8", adpt2.path_encoding
|
Chris@441
|
350 end
|
Chris@441
|
351
|
Chris@245
|
352 private
|
Chris@245
|
353
|
Chris@245
|
354 def test_scm_version_for(scm_command_version, version)
|
Chris@245
|
355 @adapter.class.expects(:scm_version_from_command_line).returns(scm_command_version)
|
Chris@245
|
356 assert_equal version, @adapter.class.scm_command_version
|
Chris@245
|
357 end
|
Chris@245
|
358
|
Chris@245
|
359 else
|
Chris@245
|
360 puts "Git test repository NOT FOUND. Skipping unit tests !!!"
|
Chris@245
|
361 def test_fake; assert true end
|
Chris@0
|
362 end
|
Chris@245
|
363 end
|
Chris@0
|
364
|
Chris@245
|
365 rescue LoadError
|
Chris@245
|
366 class GitMochaFake < ActiveSupport::TestCase
|
Chris@245
|
367 def test_fake; assert(false, "Requires mocha to run those tests") end
|
Chris@0
|
368 end
|
Chris@0
|
369 end
|