annotate test/unit/repository_mercurial_test.rb @ 1082:997f6d7738f7 bug_531

In repo controller entry action, show the page for the file even if it's binary (so user still has access to history etc links). This makes it possible to use the entry action as the default when a file is clicked on
author Chris Cannam <chris.cannam@soundsoftware.ac.uk>
date Thu, 22 Nov 2012 18:04:17 +0000
parents 5e80956cc792
children bb32da3bea34
rev   line source
Chris@441 1 # Redmine - project management software
Chris@441 2 # Copyright (C) 2006-2011 Jean-Philippe Lang
Chris@0 3 #
Chris@0 4 # This program is free software; you can redistribute it and/or
Chris@0 5 # modify it under the terms of the GNU General Public License
Chris@0 6 # as published by the Free Software Foundation; either version 2
Chris@0 7 # of the License, or (at your option) any later version.
Chris@441 8 #
Chris@0 9 # This program is distributed in the hope that it will be useful,
Chris@0 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 # GNU General Public License for more details.
Chris@441 13 #
Chris@0 14 # You should have received a copy of the GNU General Public License
Chris@0 15 # along with this program; if not, write to the Free Software
Chris@0 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Chris@0 17
Chris@119 18 require File.expand_path('../../test_helper', __FILE__)
Chris@0 19
Chris@0 20 class RepositoryMercurialTest < ActiveSupport::TestCase
Chris@0 21 fixtures :projects
Chris@441 22
Chris@909 23 REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s
Chris@909 24 NUM_REV = 32
Chris@441 25 CHAR_1_HEX = "\xc3\x9c"
Chris@245 26
Chris@441 27 if File.directory?(REPOSITORY_PATH)
Chris@441 28 def setup
Chris@441 29 klass = Repository::Mercurial
Chris@441 30 assert_equal "Mercurial", klass.scm_name
Chris@441 31 assert klass.scm_adapter_class
Chris@441 32 assert_not_equal "", klass.scm_command
Chris@441 33 assert_equal true, klass.scm_available
Chris@441 34
Chris@909 35 @project = Project.find(3)
Chris@441 36 @repository = Repository::Mercurial.create(
Chris@441 37 :project => @project,
Chris@441 38 :url => REPOSITORY_PATH,
Chris@441 39 :path_encoding => 'ISO-8859-1'
Chris@441 40 )
Chris@441 41 assert @repository
Chris@441 42 @char_1 = CHAR_1_HEX.dup
Chris@441 43 @tag_char_1 = "tag-#{CHAR_1_HEX}-00"
Chris@441 44 @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
Chris@441 45 @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
Chris@441 46 if @char_1.respond_to?(:force_encoding)
Chris@441 47 @char_1.force_encoding('UTF-8')
Chris@441 48 @tag_char_1.force_encoding('UTF-8')
Chris@441 49 @branch_char_0.force_encoding('UTF-8')
Chris@441 50 @branch_char_1.force_encoding('UTF-8')
Chris@441 51 end
Chris@441 52 end
Chris@441 53
Chris@0 54 def test_fetch_changesets_from_scratch
Chris@909 55 assert_equal 0, @repository.changesets.count
Chris@0 56 @repository.fetch_changesets
Chris@909 57 @project.reload
Chris@909 58 assert_equal NUM_REV, @repository.changesets.count
Chris@909 59 assert_equal 46, @repository.changes.count
Chris@119 60 assert_equal "Initial import.\nThe repository contains 3 files.",
Chris@119 61 @repository.changesets.find_by_revision('0').comments
Chris@0 62 end
Chris@245 63
Chris@0 64 def test_fetch_changesets_incremental
Chris@909 65 assert_equal 0, @repository.changesets.count
Chris@0 66 @repository.fetch_changesets
Chris@909 67 @project.reload
Chris@909 68 assert_equal NUM_REV, @repository.changesets.count
Chris@0 69 # Remove changesets with revision > 2
Chris@0 70 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2}
Chris@909 71 @project.reload
Chris@0 72 assert_equal 3, @repository.changesets.count
Chris@441 73
Chris@0 74 @repository.fetch_changesets
Chris@909 75 @project.reload
Chris@909 76 assert_equal NUM_REV, @repository.changesets.count
Chris@0 77 end
Chris@0 78
Chris@119 79 def test_isodatesec
Chris@119 80 # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
Chris@119 81 if @repository.scm.class.client_version_above?([1, 0])
Chris@909 82 assert_equal 0, @repository.changesets.count
Chris@119 83 @repository.fetch_changesets
Chris@909 84 @project.reload
Chris@909 85 assert_equal NUM_REV, @repository.changesets.count
Chris@119 86 rev0_committed_on = Time.gm(2007, 12, 14, 9, 22, 52)
Chris@119 87 assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
Chris@119 88 end
Chris@0 89 end
Chris@0 90
Chris@119 91 def test_changeset_order_by_revision
Chris@909 92 assert_equal 0, @repository.changesets.count
Chris@119 93 @repository.fetch_changesets
Chris@909 94 @project.reload
Chris@909 95 assert_equal NUM_REV, @repository.changesets.count
Chris@119 96
Chris@119 97 c0 = @repository.latest_changeset
Chris@119 98 c1 = @repository.changesets.find_by_revision('0')
Chris@119 99 # sorted by revision (id), not by date
Chris@119 100 assert c0.revision.to_i > c1.revision.to_i
Chris@119 101 assert c0.committed_on < c1.committed_on
Chris@119 102 end
Chris@119 103
Chris@119 104 def test_latest_changesets
Chris@909 105 assert_equal 0, @repository.changesets.count
Chris@119 106 @repository.fetch_changesets
Chris@909 107 @project.reload
Chris@909 108 assert_equal NUM_REV, @repository.changesets.count
Chris@119 109
Chris@119 110 # with_limit
Chris@119 111 changesets = @repository.latest_changesets('', nil, 2)
Chris@909 112 assert_equal %w|31 30|, changesets.collect(&:revision)
Chris@119 113
Chris@119 114 # with_filepath
Chris@441 115 changesets = @repository.latest_changesets(
Chris@441 116 '/sql_escape/percent%dir/percent%file1.txt', nil)
Chris@909 117 assert_equal %w|30 11 10 9|, changesets.collect(&:revision)
Chris@119 118
Chris@441 119 changesets = @repository.latest_changesets(
Chris@441 120 '/sql_escape/underscore_dir/understrike_file.txt', nil)
Chris@909 121 assert_equal %w|30 12 9|, changesets.collect(&:revision)
Chris@441 122
Chris@441 123 changesets = @repository.latest_changesets('README', nil)
Chris@909 124 assert_equal %w|31 30 28 17 8 6 1 0|, changesets.collect(&:revision)
Chris@441 125
Chris@441 126 changesets = @repository.latest_changesets('README','8')
Chris@441 127 assert_equal %w|8 6 1 0|, changesets.collect(&:revision)
Chris@441 128
Chris@441 129 changesets = @repository.latest_changesets('README','8', 2)
Chris@441 130 assert_equal %w|8 6|, changesets.collect(&:revision)
Chris@441 131
Chris@441 132 # with_dirpath
Chris@441 133 changesets = @repository.latest_changesets('images', nil)
Chris@441 134 assert_equal %w|1 0|, changesets.collect(&:revision)
Chris@441 135
Chris@441 136 path = 'sql_escape/percent%dir'
Chris@441 137 changesets = @repository.latest_changesets(path, nil)
Chris@909 138 assert_equal %w|30 13 11 10 9|, changesets.collect(&:revision)
Chris@441 139
Chris@441 140 changesets = @repository.latest_changesets(path, '11')
Chris@441 141 assert_equal %w|11 10 9|, changesets.collect(&:revision)
Chris@441 142
Chris@441 143 changesets = @repository.latest_changesets(path, '11', 2)
Chris@441 144 assert_equal %w|11 10|, changesets.collect(&:revision)
Chris@441 145
Chris@441 146 path = 'sql_escape/underscore_dir'
Chris@441 147 changesets = @repository.latest_changesets(path, nil)
Chris@909 148 assert_equal %w|30 13 12 9|, changesets.collect(&:revision)
Chris@441 149
Chris@441 150 changesets = @repository.latest_changesets(path, '12')
Chris@441 151 assert_equal %w|12 9|, changesets.collect(&:revision)
Chris@441 152
Chris@441 153 changesets = @repository.latest_changesets(path, '12', 1)
Chris@441 154 assert_equal %w|12|, changesets.collect(&:revision)
Chris@441 155
Chris@441 156 # tag
Chris@441 157 changesets = @repository.latest_changesets('', 'tag_test.00')
Chris@441 158 assert_equal %w|5 4 3 2 1 0|, changesets.collect(&:revision)
Chris@441 159
Chris@441 160 changesets = @repository.latest_changesets('', 'tag_test.00', 2)
Chris@441 161 assert_equal %w|5 4|, changesets.collect(&:revision)
Chris@441 162
Chris@441 163 changesets = @repository.latest_changesets('sources', 'tag_test.00')
Chris@441 164 assert_equal %w|4 3 2 1 0|, changesets.collect(&:revision)
Chris@441 165
Chris@441 166 changesets = @repository.latest_changesets('sources', 'tag_test.00', 2)
Chris@441 167 assert_equal %w|4 3|, changesets.collect(&:revision)
Chris@441 168
Chris@441 169 # named branch
Chris@909 170 if @repository.scm.class.client_version_above?([1, 6])
Chris@909 171 changesets = @repository.latest_changesets('', @branch_char_1)
Chris@909 172 assert_equal %w|27 26|, changesets.collect(&:revision)
Chris@909 173 end
Chris@441 174
Chris@441 175 changesets = @repository.latest_changesets("latin-1-dir/test-#{@char_1}-subdir", @branch_char_1)
Chris@441 176 assert_equal %w|27|, changesets.collect(&:revision)
Chris@119 177 end
Chris@119 178
Chris@119 179 def test_copied_files
Chris@909 180 assert_equal 0, @repository.changesets.count
Chris@119 181 @repository.fetch_changesets
Chris@909 182 @project.reload
Chris@909 183 assert_equal NUM_REV, @repository.changesets.count
Chris@119 184
Chris@119 185 cs1 = @repository.changesets.find_by_revision('13')
Chris@119 186 assert_not_nil cs1
Chris@119 187 c1 = cs1.changes.sort_by(&:path)
Chris@119 188 assert_equal 2, c1.size
Chris@119 189
Chris@119 190 assert_equal 'A', c1[0].action
Chris@119 191 assert_equal '/sql_escape/percent%dir/percentfile1.txt', c1[0].path
Chris@119 192 assert_equal '/sql_escape/percent%dir/percent%file1.txt', c1[0].from_path
Chris@441 193 assert_equal '3a330eb32958', c1[0].from_revision
Chris@119 194
Chris@119 195 assert_equal 'A', c1[1].action
Chris@119 196 assert_equal '/sql_escape/underscore_dir/understrike-file.txt', c1[1].path
Chris@119 197 assert_equal '/sql_escape/underscore_dir/understrike_file.txt', c1[1].from_path
Chris@119 198
Chris@119 199 cs2 = @repository.changesets.find_by_revision('15')
Chris@119 200 c2 = cs2.changes
Chris@119 201 assert_equal 1, c2.size
Chris@119 202
Chris@119 203 assert_equal 'A', c2[0].action
Chris@119 204 assert_equal '/README (1)[2]&,%.-3_4', c2[0].path
Chris@119 205 assert_equal '/README', c2[0].from_path
Chris@441 206 assert_equal '933ca60293d7', c2[0].from_revision
Chris@441 207
Chris@441 208 cs3 = @repository.changesets.find_by_revision('19')
Chris@441 209 c3 = cs3.changes
Chris@441 210 assert_equal 1, c3.size
Chris@441 211 assert_equal 'A', c3[0].action
Chris@441 212 assert_equal "/latin-1-dir/test-#{@char_1}-1.txt", c3[0].path
Chris@441 213 assert_equal "/latin-1-dir/test-#{@char_1}.txt", c3[0].from_path
Chris@441 214 assert_equal '5d9891a1b425', c3[0].from_revision
Chris@119 215 end
Chris@119 216
Chris@119 217 def test_find_changeset_by_name
Chris@909 218 assert_equal 0, @repository.changesets.count
Chris@119 219 @repository.fetch_changesets
Chris@909 220 @project.reload
Chris@909 221 assert_equal NUM_REV, @repository.changesets.count
Chris@119 222 %w|2 400bb8672109 400|.each do |r|
Chris@119 223 assert_equal '2', @repository.find_changeset_by_name(r).revision
Chris@119 224 end
Chris@119 225 end
Chris@119 226
Chris@119 227 def test_find_changeset_by_invalid_name
Chris@909 228 assert_equal 0, @repository.changesets.count
Chris@119 229 @repository.fetch_changesets
Chris@909 230 @project.reload
Chris@909 231 assert_equal NUM_REV, @repository.changesets.count
Chris@119 232 assert_nil @repository.find_changeset_by_name('100000')
Chris@119 233 end
Chris@119 234
Chris@119 235 def test_identifier
Chris@909 236 assert_equal 0, @repository.changesets.count
Chris@119 237 @repository.fetch_changesets
Chris@909 238 @project.reload
Chris@909 239 assert_equal NUM_REV, @repository.changesets.count
Chris@119 240 c = @repository.changesets.find_by_revision('2')
Chris@119 241 assert_equal c.scmid, c.identifier
Chris@119 242 end
Chris@119 243
Chris@119 244 def test_format_identifier
Chris@909 245 assert_equal 0, @repository.changesets.count
Chris@119 246 @repository.fetch_changesets
Chris@909 247 @project.reload
Chris@909 248 assert_equal NUM_REV, @repository.changesets.count
Chris@119 249 c = @repository.changesets.find_by_revision('2')
Chris@119 250 assert_equal '2:400bb8672109', c.format_identifier
Chris@119 251 end
Chris@119 252
Chris@119 253 def test_find_changeset_by_empty_name
Chris@909 254 assert_equal 0, @repository.changesets.count
Chris@119 255 @repository.fetch_changesets
Chris@909 256 @project.reload
Chris@909 257 assert_equal NUM_REV, @repository.changesets.count
Chris@119 258 ['', ' ', nil].each do |r|
Chris@119 259 assert_nil @repository.find_changeset_by_name(r)
Chris@119 260 end
Chris@119 261 end
Chris@119 262
Chris@909 263 def test_parents
Chris@909 264 assert_equal 0, @repository.changesets.count
Chris@909 265 @repository.fetch_changesets
Chris@909 266 @project.reload
Chris@909 267 assert_equal NUM_REV, @repository.changesets.count
Chris@909 268 r1 = @repository.changesets.find_by_revision('0')
Chris@909 269 assert_equal [], r1.parents
Chris@909 270 r2 = @repository.changesets.find_by_revision('1')
Chris@909 271 assert_equal 1, r2.parents.length
Chris@909 272 assert_equal "0885933ad4f6",
Chris@909 273 r2.parents[0].identifier
Chris@909 274 r3 = @repository.changesets.find_by_revision('30')
Chris@909 275 assert_equal 2, r3.parents.length
Chris@909 276 r4 = [r3.parents[0].identifier, r3.parents[1].identifier].sort
Chris@909 277 assert_equal "3a330eb32958", r4[0]
Chris@909 278 assert_equal "a94b0528f24f", r4[1]
Chris@909 279 end
Chris@909 280
Chris@119 281 def test_activities
Chris@119 282 c = Changeset.new(:repository => @repository,
Chris@119 283 :committed_on => Time.now,
Chris@119 284 :revision => '123',
Chris@119 285 :scmid => 'abc400bb8672',
Chris@119 286 :comments => 'test')
Chris@119 287 assert c.event_title.include?('123:abc400bb8672:')
Chris@119 288 assert_equal 'abc400bb8672', c.event_url[:rev]
Chris@119 289 end
Chris@245 290
Chris@441 291 def test_previous
Chris@909 292 assert_equal 0, @repository.changesets.count
Chris@245 293 @repository.fetch_changesets
Chris@909 294 @project.reload
Chris@909 295 assert_equal NUM_REV, @repository.changesets.count
Chris@441 296 %w|28 3ae45e2d177d 3ae45|.each do |r1|
Chris@441 297 changeset = @repository.find_changeset_by_name(r1)
Chris@441 298 %w|27 7bbf4c738e71 7bbf|.each do |r2|
Chris@441 299 assert_equal @repository.find_changeset_by_name(r2), changeset.previous
Chris@441 300 end
Chris@441 301 end
Chris@245 302 end
Chris@245 303
Chris@441 304 def test_previous_nil
Chris@909 305 assert_equal 0, @repository.changesets.count
Chris@245 306 @repository.fetch_changesets
Chris@909 307 @project.reload
Chris@909 308 assert_equal NUM_REV, @repository.changesets.count
Chris@441 309 %w|0 0885933ad4f6 0885|.each do |r1|
Chris@441 310 changeset = @repository.find_changeset_by_name(r1)
Chris@441 311 assert_nil changeset.previous
Chris@441 312 end
Chris@245 313 end
Chris@245 314
Chris@441 315 def test_next
Chris@909 316 assert_equal 0, @repository.changesets.count
Chris@245 317 @repository.fetch_changesets
Chris@909 318 @project.reload
Chris@909 319 assert_equal NUM_REV, @repository.changesets.count
Chris@441 320 %w|27 7bbf4c738e71 7bbf|.each do |r2|
Chris@441 321 changeset = @repository.find_changeset_by_name(r2)
Chris@441 322 %w|28 3ae45e2d177d 3ae45|.each do |r1|
Chris@441 323 assert_equal @repository.find_changeset_by_name(r1), changeset.next
Chris@441 324 end
Chris@441 325 end
Chris@441 326 end
Chris@245 327
Chris@441 328 def test_next_nil
Chris@909 329 assert_equal 0, @repository.changesets.count
Chris@441 330 @repository.fetch_changesets
Chris@909 331 @project.reload
Chris@909 332 assert_equal NUM_REV, @repository.changesets.count
Chris@909 333 %w|31 31eeee7395c8 31eee|.each do |r1|
Chris@441 334 changeset = @repository.find_changeset_by_name(r1)
Chris@441 335 assert_nil changeset.next
Chris@441 336 end
Chris@245 337 end
Chris@0 338 else
Chris@0 339 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
Chris@0 340 def test_fake; assert true end
Chris@0 341 end
Chris@0 342 end