To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / test / unit / lib / redmine / scm / adapters / mercurial_adapter_test.rb @ 441:cbce1fd3b1b7
History | View | Annotate | Download (13.6 KB)
| 1 | 119:8661b858af72 | Chris | require File.expand_path('../../../../../../test_helper', __FILE__) |
|---|---|---|---|
| 2 | 0:513646585e45 | Chris | begin
|
| 3 | require 'mocha'
|
||
| 4 | 119:8661b858af72 | Chris | |
| 5 | 0:513646585e45 | Chris | class MercurialAdapterTest < ActiveSupport::TestCase |
| 6 | 119:8661b858af72 | Chris | |
| 7 | 441:cbce1fd3b1b7 | Chris | HELPERS_DIR = Redmine::Scm::Adapters::MercurialAdapter::HELPERS_DIR |
| 8 | TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME |
||
| 9 | 0:513646585e45 | Chris | TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION |
| 10 | 119:8661b858af72 | Chris | |
| 11 | 441:cbce1fd3b1b7 | Chris | REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + |
| 12 | '/tmp/test/mercurial_repository'
|
||
| 13 | |||
| 14 | CHAR_1_HEX = "\xc3\x9c" |
||
| 15 | 119:8661b858af72 | Chris | |
| 16 | if File.directory?(REPOSITORY_PATH) |
||
| 17 | def setup |
||
| 18 | 441:cbce1fd3b1b7 | Chris | adapter_class = Redmine::Scm::Adapters::MercurialAdapter |
| 19 | assert adapter_class |
||
| 20 | assert adapter_class.client_command |
||
| 21 | assert_equal true, adapter_class.client_available
|
||
| 22 | assert_equal true, adapter_class.client_version_above?([0, 9, 5]) |
||
| 23 | |||
| 24 | @adapter = Redmine::Scm::Adapters::MercurialAdapter.new( |
||
| 25 | REPOSITORY_PATH,
|
||
| 26 | nil,
|
||
| 27 | nil,
|
||
| 28 | nil,
|
||
| 29 | 'ISO-8859-1')
|
||
| 30 | 245:051f544170fe | Chris | @diff_c_support = true |
| 31 | 441:cbce1fd3b1b7 | Chris | @char_1 = CHAR_1_HEX.dup |
| 32 | @tag_char_1 = "tag-#{CHAR_1_HEX}-00" |
||
| 33 | @branch_char_0 = "branch-#{CHAR_1_HEX}-00" |
||
| 34 | @branch_char_1 = "branch-#{CHAR_1_HEX}-01" |
||
| 35 | if @tag_char_1.respond_to?(:force_encoding) |
||
| 36 | @char_1.force_encoding('UTF-8') |
||
| 37 | @tag_char_1.force_encoding('UTF-8') |
||
| 38 | @branch_char_0.force_encoding('UTF-8') |
||
| 39 | @branch_char_1.force_encoding('UTF-8') |
||
| 40 | end
|
||
| 41 | 0:513646585e45 | Chris | end
|
| 42 | 119:8661b858af72 | Chris | |
| 43 | def test_hgversion |
||
| 44 | to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
|
||
| 45 | "Mercurial Distributed SCM (1.0)\n" => [1,0], |
||
| 46 | "Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil, |
||
| 47 | "Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1], |
||
| 48 | "Mercurial Distributed SCM (1916e629a29d)\n" => nil, |
||
| 49 | "Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5], |
||
| 50 | "(1.6)\n(1.7)\n(1.8)" => [1,6], |
||
| 51 | "(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]} |
||
| 52 | |||
| 53 | to_test.each do |s, v|
|
||
| 54 | test_hgversion_for(s, v) |
||
| 55 | end
|
||
| 56 | 0:513646585e45 | Chris | end
|
| 57 | 119:8661b858af72 | Chris | |
| 58 | def test_template_path |
||
| 59 | to_test = { [0,9,5] => "0.9.5",
|
||
| 60 | [1,0] => "1.0", |
||
| 61 | [] => "1.0",
|
||
| 62 | [1,0,1] => "1.0", |
||
| 63 | [1,7] => "1.0", |
||
| 64 | [1,7,1] => "1.0" } |
||
| 65 | to_test.each do |v, template|
|
||
| 66 | test_template_path_for(v, template) |
||
| 67 | end
|
||
| 68 | end
|
||
| 69 | |||
| 70 | 245:051f544170fe | Chris | def test_info |
| 71 | [REPOSITORY_PATH, REPOSITORY_PATH + "/", |
||
| 72 | REPOSITORY_PATH + "//"].each do |repo| |
||
| 73 | adp = Redmine::Scm::Adapters::MercurialAdapter.new(repo) |
||
| 74 | repo_path = adp.info.root_url.gsub(/\\/, "/") |
||
| 75 | assert_equal REPOSITORY_PATH, repo_path
|
||
| 76 | 441:cbce1fd3b1b7 | Chris | assert_equal '28', adp.info.lastrev.revision
|
| 77 | assert_equal '3ae45e2d177d',adp.info.lastrev.scmid
|
||
| 78 | 245:051f544170fe | Chris | end
|
| 79 | end
|
||
| 80 | |||
| 81 | def test_revisions |
||
| 82 | revisions = @adapter.revisions(nil, 2, 4) |
||
| 83 | assert_equal 3, revisions.size
|
||
| 84 | assert_equal '2', revisions[0].revision |
||
| 85 | assert_equal '400bb8672109', revisions[0].scmid |
||
| 86 | assert_equal '4', revisions[2].revision |
||
| 87 | assert_equal 'def6d2f1254a', revisions[2].scmid |
||
| 88 | |||
| 89 | revisions = @adapter.revisions(nil, 2, 4, {:limit => 2}) |
||
| 90 | assert_equal 2, revisions.size
|
||
| 91 | assert_equal '2', revisions[0].revision |
||
| 92 | assert_equal '400bb8672109', revisions[0].scmid |
||
| 93 | end
|
||
| 94 | |||
| 95 | 119:8661b858af72 | Chris | def test_diff |
| 96 | if @adapter.class.client_version_above?([1, 2]) |
||
| 97 | assert_nil @adapter.diff(nil, '100000') |
||
| 98 | end
|
||
| 99 | assert_nil @adapter.diff(nil, '100000', '200000') |
||
| 100 | [2, '400bb8672109', '400', 400].each do |r1| |
||
| 101 | diff1 = @adapter.diff(nil, r1) |
||
| 102 | 245:051f544170fe | Chris | if @diff_c_support |
| 103 | 119:8661b858af72 | Chris | assert_equal 28, diff1.size
|
| 104 | buf = diff1[24].gsub(/\r\n|\r|\n/, "") |
||
| 105 | assert_equal "+ return true unless klass.respond_to?('watched_by')", buf
|
||
| 106 | else
|
||
| 107 | assert_equal 0, diff1.size
|
||
| 108 | end
|
||
| 109 | [4, 'def6d2f1254a'].each do |r2| |
||
| 110 | diff2 = @adapter.diff(nil,r1,r2) |
||
| 111 | assert_equal 49, diff2.size
|
||
| 112 | buf = diff2[41].gsub(/\r\n|\r|\n/, "") |
||
| 113 | assert_equal "+class WelcomeController < ApplicationController", buf
|
||
| 114 | diff3 = @adapter.diff('sources/watchers_controller.rb', r1, r2) |
||
| 115 | assert_equal 20, diff3.size
|
||
| 116 | buf = diff3[12].gsub(/\r\n|\r|\n/, "") |
||
| 117 | assert_equal "+ @watched.remove_watcher(user)", buf
|
||
| 118 | end
|
||
| 119 | end
|
||
| 120 | end
|
||
| 121 | |||
| 122 | 210:0579821a129a | Chris | def test_diff_made_by_revision |
| 123 | 245:051f544170fe | Chris | if @diff_c_support |
| 124 | 441:cbce1fd3b1b7 | Chris | [24, '24', '4cddb4e45f52'].each do |r1| |
| 125 | 210:0579821a129a | Chris | diff1 = @adapter.diff(nil, r1) |
| 126 | assert_equal 5, diff1.size
|
||
| 127 | buf = diff1[4].gsub(/\r\n|\r|\n/, "") |
||
| 128 | assert_equal '+0885933ad4f68d77c2649cd11f8311276e7ef7ce tag-init-revision', buf
|
||
| 129 | end
|
||
| 130 | end
|
||
| 131 | end
|
||
| 132 | |||
| 133 | 119:8661b858af72 | Chris | def test_cat |
| 134 | [2, '400bb8672109', '400', 400].each do |r| |
||
| 135 | buf = @adapter.cat('sources/welcome_controller.rb', r) |
||
| 136 | assert buf |
||
| 137 | lines = buf.split("\r\n")
|
||
| 138 | assert_equal 25, lines.length
|
||
| 139 | assert_equal 'class WelcomeController < ApplicationController', lines[17] |
||
| 140 | end
|
||
| 141 | assert_nil @adapter.cat('sources/welcome_controller.rb') |
||
| 142 | end
|
||
| 143 | |||
| 144 | def test_annotate |
||
| 145 | assert_equal [], @adapter.annotate("sources/welcome_controller.rb").lines |
||
| 146 | [2, '400bb8672109', '400', 400].each do |r| |
||
| 147 | ann = @adapter.annotate('sources/welcome_controller.rb', r) |
||
| 148 | assert ann |
||
| 149 | assert_equal '1', ann.revisions[17].revision |
||
| 150 | assert_equal '9d5b5b004199', ann.revisions[17].identifier |
||
| 151 | assert_equal 'jsmith', ann.revisions[0].author |
||
| 152 | assert_equal 25, ann.lines.length
|
||
| 153 | assert_equal 'class WelcomeController < ApplicationController', ann.lines[17] |
||
| 154 | end
|
||
| 155 | end
|
||
| 156 | |||
| 157 | def test_entries |
||
| 158 | assert_nil @adapter.entries(nil, '100000') |
||
| 159 | 245:051f544170fe | Chris | |
| 160 | assert_equal 1, @adapter.entries("sources", 3).size |
||
| 161 | assert_equal 1, @adapter.entries("sources", 'b3a615152df8').size |
||
| 162 | |||
| 163 | 119:8661b858af72 | Chris | [2, '400bb8672109', '400', 400].each do |r| |
| 164 | entries1 = @adapter.entries(nil, r) |
||
| 165 | assert entries1 |
||
| 166 | assert_equal 3, entries1.size
|
||
| 167 | assert_equal 'sources', entries1[1].name |
||
| 168 | assert_equal 'sources', entries1[1].path |
||
| 169 | assert_equal 'dir', entries1[1].kind |
||
| 170 | 245:051f544170fe | Chris | readme = entries1[2]
|
| 171 | assert_equal 'README', readme.name
|
||
| 172 | assert_equal 'README', readme.path
|
||
| 173 | assert_equal 'file', readme.kind
|
||
| 174 | assert_equal 27, readme.size
|
||
| 175 | assert_equal '1', readme.lastrev.revision
|
||
| 176 | assert_equal '9d5b5b004199', readme.lastrev.identifier
|
||
| 177 | # 2007-12-14 10:24:01 +0100
|
||
| 178 | assert_equal Time.gm(2007, 12, 14, 9, 24, 1), readme.lastrev.time |
||
| 179 | 119:8661b858af72 | Chris | |
| 180 | entries2 = @adapter.entries('sources', r) |
||
| 181 | assert entries2 |
||
| 182 | assert_equal 2, entries2.size
|
||
| 183 | assert_equal 'watchers_controller.rb', entries2[0].name |
||
| 184 | assert_equal 'sources/watchers_controller.rb', entries2[0].path |
||
| 185 | assert_equal 'file', entries2[0].kind |
||
| 186 | assert_equal 'welcome_controller.rb', entries2[1].name |
||
| 187 | assert_equal 'sources/welcome_controller.rb', entries2[1].path |
||
| 188 | assert_equal 'file', entries2[1].kind |
||
| 189 | end
|
||
| 190 | end
|
||
| 191 | |||
| 192 | 245:051f544170fe | Chris | def test_entries_tag |
| 193 | entries1 = @adapter.entries(nil, 'tag_test.00') |
||
| 194 | assert entries1 |
||
| 195 | assert_equal 3, entries1.size
|
||
| 196 | assert_equal 'sources', entries1[1].name |
||
| 197 | assert_equal 'sources', entries1[1].path |
||
| 198 | assert_equal 'dir', entries1[1].kind |
||
| 199 | readme = entries1[2]
|
||
| 200 | assert_equal 'README', readme.name
|
||
| 201 | assert_equal 'README', readme.path
|
||
| 202 | assert_equal 'file', readme.kind
|
||
| 203 | assert_equal 21, readme.size
|
||
| 204 | assert_equal '0', readme.lastrev.revision
|
||
| 205 | assert_equal '0885933ad4f6', readme.lastrev.identifier
|
||
| 206 | # 2007-12-14 10:22:52 +0100
|
||
| 207 | assert_equal Time.gm(2007, 12, 14, 9, 22, 52), readme.lastrev.time |
||
| 208 | end
|
||
| 209 | |||
| 210 | def test_entries_branch |
||
| 211 | entries1 = @adapter.entries(nil, 'test-branch-00') |
||
| 212 | assert entries1 |
||
| 213 | assert_equal 5, entries1.size
|
||
| 214 | assert_equal 'sql_escape', entries1[2].name |
||
| 215 | assert_equal 'sql_escape', entries1[2].path |
||
| 216 | assert_equal 'dir', entries1[2].kind |
||
| 217 | readme = entries1[4]
|
||
| 218 | assert_equal 'README', readme.name
|
||
| 219 | assert_equal 'README', readme.path
|
||
| 220 | assert_equal 'file', readme.kind
|
||
| 221 | assert_equal 365, readme.size
|
||
| 222 | assert_equal '8', readme.lastrev.revision
|
||
| 223 | assert_equal 'c51f5bb613cd', readme.lastrev.identifier
|
||
| 224 | # 2001-02-01 00:00:00 -0900
|
||
| 225 | assert_equal Time.gm(2001, 2, 1, 9, 0, 0), readme.lastrev.time |
||
| 226 | end
|
||
| 227 | |||
| 228 | def test_locate_on_outdated_repository |
||
| 229 | assert_equal 1, @adapter.entries("images", 0).size |
||
| 230 | assert_equal 2, @adapter.entries("images").size |
||
| 231 | assert_equal 2, @adapter.entries("images", 2).size |
||
| 232 | end
|
||
| 233 | |||
| 234 | 119:8661b858af72 | Chris | def test_access_by_nodeid |
| 235 | path = 'sources/welcome_controller.rb'
|
||
| 236 | assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109') |
||
| 237 | end
|
||
| 238 | |||
| 239 | def test_access_by_fuzzy_nodeid |
||
| 240 | path = 'sources/welcome_controller.rb'
|
||
| 241 | # falls back to nodeid
|
||
| 242 | assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400') |
||
| 243 | end
|
||
| 244 | |||
| 245 | 245:051f544170fe | Chris | def test_tags |
| 246 | 441:cbce1fd3b1b7 | Chris | assert_equal [@tag_char_1, 'tag_test.00', 'tag-init-revision'], @adapter.tags |
| 247 | 245:051f544170fe | Chris | end
|
| 248 | |||
| 249 | def test_tagmap |
||
| 250 | 441:cbce1fd3b1b7 | Chris | tm = {
|
| 251 | @tag_char_1 => 'adf805632193', |
||
| 252 | 'tag_test.00' => '6987191f453a', |
||
| 253 | 'tag-init-revision' => '0885933ad4f6', |
||
| 254 | } |
||
| 255 | 245:051f544170fe | Chris | assert_equal tm, @adapter.tagmap
|
| 256 | end
|
||
| 257 | |||
| 258 | def test_branches |
||
| 259 | 441:cbce1fd3b1b7 | Chris | assert_equal [ |
| 260 | 'default',
|
||
| 261 | @branch_char_1,
|
||
| 262 | 'branch (1)[2]&,%.-3_4',
|
||
| 263 | @branch_char_0,
|
||
| 264 | 'test_branch.latin-1',
|
||
| 265 | 'test-branch-00',
|
||
| 266 | ], @adapter.branches
|
||
| 267 | 245:051f544170fe | Chris | end
|
| 268 | |||
| 269 | def test_branchmap |
||
| 270 | 441:cbce1fd3b1b7 | Chris | bm = {
|
| 271 | 'default' => '3ae45e2d177d', |
||
| 272 | 'test_branch.latin-1' => 'c2ffe7da686a', |
||
| 273 | 'branch (1)[2]&,%.-3_4' => 'afc61e85bde7', |
||
| 274 | 'test-branch-00' => '3a330eb32958', |
||
| 275 | @branch_char_0 => 'c8d3e4887474', |
||
| 276 | @branch_char_1 => '7bbf4c738e71', |
||
| 277 | } |
||
| 278 | 245:051f544170fe | Chris | assert_equal bm, @adapter.branchmap
|
| 279 | end
|
||
| 280 | |||
| 281 | 441:cbce1fd3b1b7 | Chris | def test_path_space |
| 282 | p = 'README (1)[2]&,%.-3_4'
|
||
| 283 | [15, '933ca60293d7'].each do |r1| |
||
| 284 | assert @adapter.diff(p, r1)
|
||
| 285 | assert @adapter.cat(p, r1)
|
||
| 286 | assert_equal 1, @adapter.annotate(p, r1).lines.length |
||
| 287 | [25, 'afc61e85bde7'].each do |r2| |
||
| 288 | assert @adapter.diff(p, r1, r2)
|
||
| 289 | end
|
||
| 290 | end
|
||
| 291 | end
|
||
| 292 | |||
| 293 | def test_tag_non_ascii |
||
| 294 | p = "latin-1-dir/test-#{@char_1}-1.txt"
|
||
| 295 | assert @adapter.cat(p, @tag_char_1) |
||
| 296 | assert_equal 1, @adapter.annotate(p, @tag_char_1).lines.length |
||
| 297 | end
|
||
| 298 | |||
| 299 | def test_branch_non_ascii |
||
| 300 | p = "latin-1-dir/test-#{@char_1}-subdir/test-#{@char_1}-1.txt"
|
||
| 301 | assert @adapter.cat(p, @branch_char_1) |
||
| 302 | assert_equal 1, @adapter.annotate(p, @branch_char_1).lines.length |
||
| 303 | end
|
||
| 304 | |||
| 305 | def test_nodes_in_branch |
||
| 306 | [ |
||
| 307 | 'default',
|
||
| 308 | @branch_char_1,
|
||
| 309 | 'branch (1)[2]&,%.-3_4',
|
||
| 310 | @branch_char_0,
|
||
| 311 | 'test_branch.latin-1',
|
||
| 312 | 'test-branch-00',
|
||
| 313 | ].each do |bra|
|
||
| 314 | nib0 = @adapter.nodes_in_branch(bra)
|
||
| 315 | assert nib0 |
||
| 316 | nib1 = @adapter.nodes_in_branch(bra, :limit => 1) |
||
| 317 | assert_equal 1, nib1.size
|
||
| 318 | case bra
|
||
| 319 | when 'branch (1)[2]&,%.-3_4' |
||
| 320 | assert_equal 3, nib0.size
|
||
| 321 | assert_equal nib0[0], 'afc61e85bde7' |
||
| 322 | nib2 = @adapter.nodes_in_branch(bra, :limit => 2) |
||
| 323 | assert_equal 2, nib2.size
|
||
| 324 | assert_equal nib2[1], '933ca60293d7' |
||
| 325 | when @branch_char_1 |
||
| 326 | assert_equal 2, nib0.size
|
||
| 327 | assert_equal nib0[1], '08ff3227303e' |
||
| 328 | nib2 = @adapter.nodes_in_branch(bra, :limit => 1) |
||
| 329 | assert_equal 1, nib2.size
|
||
| 330 | assert_equal nib2[0], '7bbf4c738e71' |
||
| 331 | end
|
||
| 332 | end
|
||
| 333 | end
|
||
| 334 | |||
| 335 | def test_path_encoding_default_utf8 |
||
| 336 | adpt1 = Redmine::Scm::Adapters::MercurialAdapter.new( |
||
| 337 | REPOSITORY_PATH
|
||
| 338 | ) |
||
| 339 | assert_equal "UTF-8", adpt1.path_encoding
|
||
| 340 | adpt2 = Redmine::Scm::Adapters::MercurialAdapter.new( |
||
| 341 | REPOSITORY_PATH,
|
||
| 342 | nil,
|
||
| 343 | nil,
|
||
| 344 | nil,
|
||
| 345 | ""
|
||
| 346 | ) |
||
| 347 | assert_equal "UTF-8", adpt2.path_encoding
|
||
| 348 | end
|
||
| 349 | |||
| 350 | 119:8661b858af72 | Chris | private |
| 351 | |||
| 352 | def test_hgversion_for(hgversion, version) |
||
| 353 | @adapter.class.expects(:hgversion_from_command_line).returns(hgversion) |
||
| 354 | assert_equal version, @adapter.class.hgversion
|
||
| 355 | end
|
||
| 356 | |||
| 357 | def test_template_path_for(version, template) |
||
| 358 | 245:051f544170fe | Chris | assert_equal "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
|
| 359 | 119:8661b858af72 | Chris | @adapter.class.template_path_for(version)
|
| 360 | assert File.exist?(@adapter.class.template_path_for(version)) |
||
| 361 | end
|
||
| 362 | else
|
||
| 363 | puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
|
||
| 364 | def test_fake; assert true end |
||
| 365 | 0:513646585e45 | Chris | end
|
| 366 | end
|
||
| 367 | rescue LoadError |
||
| 368 | 119:8661b858af72 | Chris | class MercurialMochaFake < ActiveSupport::TestCase |
| 369 | def test_fake; assert(false, "Requires mocha to run those tests") end |
||
| 370 | end
|
||
| 371 | 0:513646585e45 | Chris | end |