annotate test/unit/lib/redmine/scm/adapters/git_adapter_test.rb @ 1176:7d9db6065048 bug_352

Close obsolete branch bug_352
author Chris Cannam
date Wed, 01 Feb 2012 16:09:00 +0000
parents cbce1fd3b1b7
children cbb26bc654de
rev   line source
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