comparison test/unit/repository_mercurial_test.rb @ 524:1248a47e81b3 feature_36

Merge from branch "luisf"
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Mon, 25 Jul 2011 14:39:38 +0100
parents 753f1380d6bc
children 5e80956cc792
comparison
equal deleted inserted replaced
519:3be6bc3c2a17 524:1248a47e81b3
1 # redMine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2007 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.dirname(__FILE__) + '/../test_helper' 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 class RepositoryMercurialTest < ActiveSupport::TestCase 20 class RepositoryMercurialTest < ActiveSupport::TestCase
21 fixtures :projects 21 fixtures :projects
22 22
23 # No '..' in the repository path 23 # No '..' in the repository path
24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository' 24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
25 25
26 def setup 26 CHAR_1_HEX = "\xc3\x9c"
27 @project = Project.find(1) 27
28 assert @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH) 28 if File.directory?(REPOSITORY_PATH)
29 end 29
30 30 def setup
31 if File.directory?(REPOSITORY_PATH) 31 klass = Repository::Mercurial
32 assert_equal "Mercurial", klass.scm_name
33 assert klass.scm_adapter_class
34 assert_not_equal "", klass.scm_command
35 assert_equal true, klass.scm_available
36
37 @project = Project.find(3)
38 @repository = Repository::Mercurial.create(
39 :project => @project,
40 :url => REPOSITORY_PATH,
41 :path_encoding => 'ISO-8859-1'
42 )
43 assert @repository
44 @char_1 = CHAR_1_HEX.dup
45 @tag_char_1 = "tag-#{CHAR_1_HEX}-00"
46 @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
47 @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
48 if @char_1.respond_to?(:force_encoding)
49 @char_1.force_encoding('UTF-8')
50 @tag_char_1.force_encoding('UTF-8')
51 @branch_char_0.force_encoding('UTF-8')
52 @branch_char_1.force_encoding('UTF-8')
53 end
54 end
55
32 def test_fetch_changesets_from_scratch 56 def test_fetch_changesets_from_scratch
33 @repository.fetch_changesets 57 @repository.fetch_changesets
34 @repository.reload 58 @repository.reload
35 59 assert_equal 29, @repository.changesets.count
36 assert_equal 6, @repository.changesets.count 60 assert_equal 37, @repository.changes.count
37 assert_equal 11, @repository.changes.count 61 assert_equal "Initial import.\nThe repository contains 3 files.",
38 assert_equal "Initial import.\nThe repository contains 3 files.", @repository.changesets.find_by_revision('0').comments 62 @repository.changesets.find_by_revision('0').comments
39 end 63 end
40 64
41 def test_fetch_changesets_incremental 65 def test_fetch_changesets_incremental
42 @repository.fetch_changesets 66 @repository.fetch_changesets
43 # Remove changesets with revision > 2 67 # Remove changesets with revision > 2
44 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2} 68 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2}
45 @repository.reload 69 @repository.reload
46 assert_equal 3, @repository.changesets.count 70 assert_equal 3, @repository.changesets.count
47 71
48 @repository.fetch_changesets 72 @repository.fetch_changesets
49 assert_equal 6, @repository.changesets.count 73 assert_equal 29, @repository.changesets.count
50 end 74 end
51 75
52 def test_entries 76 def test_isodatesec
53 assert_equal 2, @repository.entries("sources", 2).size 77 # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
54 assert_equal 1, @repository.entries("sources", 3).size 78 if @repository.scm.class.client_version_above?([1, 0])
55 end 79 @repository.fetch_changesets
56 80 @repository.reload
57 def test_locate_on_outdated_repository 81 rev0_committed_on = Time.gm(2007, 12, 14, 9, 22, 52)
58 # Change the working dir state 82 assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
59 %x{hg -R #{REPOSITORY_PATH} up -r 0} 83 end
60 assert_equal 1, @repository.entries("images", 0).size 84 end
61 assert_equal 2, @repository.entries("images").size 85
62 assert_equal 2, @repository.entries("images", 2).size 86 def test_changeset_order_by_revision
63 end 87 @repository.fetch_changesets
64 88 @repository.reload
65 89
66 def test_cat 90 c0 = @repository.latest_changeset
67 assert @repository.scm.cat("sources/welcome_controller.rb", 2) 91 c1 = @repository.changesets.find_by_revision('0')
68 assert_nil @repository.scm.cat("sources/welcome_controller.rb") 92 # sorted by revision (id), not by date
69 end 93 assert c0.revision.to_i > c1.revision.to_i
70 94 assert c0.committed_on < c1.committed_on
95 end
96
97 def test_latest_changesets
98 @repository.fetch_changesets
99 @repository.reload
100
101 # with_limit
102 changesets = @repository.latest_changesets('', nil, 2)
103 assert_equal %w|28 27|, changesets.collect(&:revision)
104
105 # with_filepath
106 changesets = @repository.latest_changesets(
107 '/sql_escape/percent%dir/percent%file1.txt', nil)
108 assert_equal %w|11 10 9|, changesets.collect(&:revision)
109
110 changesets = @repository.latest_changesets(
111 '/sql_escape/underscore_dir/understrike_file.txt', nil)
112 assert_equal %w|12 9|, changesets.collect(&:revision)
113
114 changesets = @repository.latest_changesets('README', nil)
115 assert_equal %w|28 17 8 6 1 0|, changesets.collect(&:revision)
116
117 changesets = @repository.latest_changesets('README','8')
118 assert_equal %w|8 6 1 0|, changesets.collect(&:revision)
119
120 changesets = @repository.latest_changesets('README','8', 2)
121 assert_equal %w|8 6|, changesets.collect(&:revision)
122
123 # with_dirpath
124 changesets = @repository.latest_changesets('images', nil)
125 assert_equal %w|1 0|, changesets.collect(&:revision)
126
127 path = 'sql_escape/percent%dir'
128 changesets = @repository.latest_changesets(path, nil)
129 assert_equal %w|13 11 10 9|, changesets.collect(&:revision)
130
131 changesets = @repository.latest_changesets(path, '11')
132 assert_equal %w|11 10 9|, changesets.collect(&:revision)
133
134 changesets = @repository.latest_changesets(path, '11', 2)
135 assert_equal %w|11 10|, changesets.collect(&:revision)
136
137 path = 'sql_escape/underscore_dir'
138 changesets = @repository.latest_changesets(path, nil)
139 assert_equal %w|13 12 9|, changesets.collect(&:revision)
140
141 changesets = @repository.latest_changesets(path, '12')
142 assert_equal %w|12 9|, changesets.collect(&:revision)
143
144 changesets = @repository.latest_changesets(path, '12', 1)
145 assert_equal %w|12|, changesets.collect(&:revision)
146
147 # tag
148 changesets = @repository.latest_changesets('', 'tag_test.00')
149 assert_equal %w|5 4 3 2 1 0|, changesets.collect(&:revision)
150
151 changesets = @repository.latest_changesets('', 'tag_test.00', 2)
152 assert_equal %w|5 4|, changesets.collect(&:revision)
153
154 changesets = @repository.latest_changesets('sources', 'tag_test.00')
155 assert_equal %w|4 3 2 1 0|, changesets.collect(&:revision)
156
157 changesets = @repository.latest_changesets('sources', 'tag_test.00', 2)
158 assert_equal %w|4 3|, changesets.collect(&:revision)
159
160 # named branch
161 changesets = @repository.latest_changesets('', @branch_char_1)
162 assert_equal %w|27 26|, changesets.collect(&:revision)
163
164 changesets = @repository.latest_changesets("latin-1-dir/test-#{@char_1}-subdir", @branch_char_1)
165 assert_equal %w|27|, changesets.collect(&:revision)
166 end
167
168 def test_copied_files
169 @repository.fetch_changesets
170 @repository.reload
171
172 cs1 = @repository.changesets.find_by_revision('13')
173 assert_not_nil cs1
174 c1 = cs1.changes.sort_by(&:path)
175 assert_equal 2, c1.size
176
177 assert_equal 'A', c1[0].action
178 assert_equal '/sql_escape/percent%dir/percentfile1.txt', c1[0].path
179 assert_equal '/sql_escape/percent%dir/percent%file1.txt', c1[0].from_path
180 assert_equal '3a330eb32958', c1[0].from_revision
181
182 assert_equal 'A', c1[1].action
183 assert_equal '/sql_escape/underscore_dir/understrike-file.txt', c1[1].path
184 assert_equal '/sql_escape/underscore_dir/understrike_file.txt', c1[1].from_path
185
186 cs2 = @repository.changesets.find_by_revision('15')
187 c2 = cs2.changes
188 assert_equal 1, c2.size
189
190 assert_equal 'A', c2[0].action
191 assert_equal '/README (1)[2]&,%.-3_4', c2[0].path
192 assert_equal '/README', c2[0].from_path
193 assert_equal '933ca60293d7', c2[0].from_revision
194
195 cs3 = @repository.changesets.find_by_revision('19')
196 c3 = cs3.changes
197 assert_equal 1, c3.size
198 assert_equal 'A', c3[0].action
199 assert_equal "/latin-1-dir/test-#{@char_1}-1.txt", c3[0].path
200 assert_equal "/latin-1-dir/test-#{@char_1}.txt", c3[0].from_path
201 assert_equal '5d9891a1b425', c3[0].from_revision
202 end
203
204 def test_find_changeset_by_name
205 @repository.fetch_changesets
206 @repository.reload
207 %w|2 400bb8672109 400|.each do |r|
208 assert_equal '2', @repository.find_changeset_by_name(r).revision
209 end
210 end
211
212 def test_find_changeset_by_invalid_name
213 @repository.fetch_changesets
214 @repository.reload
215 assert_nil @repository.find_changeset_by_name('100000')
216 end
217
218 def test_identifier
219 @repository.fetch_changesets
220 @repository.reload
221 c = @repository.changesets.find_by_revision('2')
222 assert_equal c.scmid, c.identifier
223 end
224
225 def test_format_identifier
226 @repository.fetch_changesets
227 @repository.reload
228 c = @repository.changesets.find_by_revision('2')
229 assert_equal '2:400bb8672109', c.format_identifier
230 end
231
232 def test_find_changeset_by_empty_name
233 @repository.fetch_changesets
234 @repository.reload
235 ['', ' ', nil].each do |r|
236 assert_nil @repository.find_changeset_by_name(r)
237 end
238 end
239
240 def test_activities
241 c = Changeset.new(:repository => @repository,
242 :committed_on => Time.now,
243 :revision => '123',
244 :scmid => 'abc400bb8672',
245 :comments => 'test')
246 assert c.event_title.include?('123:abc400bb8672:')
247 assert_equal 'abc400bb8672', c.event_url[:rev]
248 end
249
250 def test_previous
251 @repository.fetch_changesets
252 @repository.reload
253 %w|28 3ae45e2d177d 3ae45|.each do |r1|
254 changeset = @repository.find_changeset_by_name(r1)
255 %w|27 7bbf4c738e71 7bbf|.each do |r2|
256 assert_equal @repository.find_changeset_by_name(r2), changeset.previous
257 end
258 end
259 end
260
261 def test_previous_nil
262 @repository.fetch_changesets
263 @repository.reload
264 %w|0 0885933ad4f6 0885|.each do |r1|
265 changeset = @repository.find_changeset_by_name(r1)
266 assert_nil changeset.previous
267 end
268 end
269
270 def test_next
271 @repository.fetch_changesets
272 @repository.reload
273 %w|27 7bbf4c738e71 7bbf|.each do |r2|
274 changeset = @repository.find_changeset_by_name(r2)
275 %w|28 3ae45e2d177d 3ae45|.each do |r1|
276 assert_equal @repository.find_changeset_by_name(r1), changeset.next
277 end
278 end
279 end
280
281 def test_next_nil
282 @repository.fetch_changesets
283 @repository.reload
284 %w|28 3ae45e2d177d 3ae45|.each do |r1|
285 changeset = @repository.find_changeset_by_name(r1)
286 assert_nil changeset.next
287 end
288 end
71 else 289 else
72 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!" 290 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
73 def test_fake; assert true end 291 def test_fake; assert true end
74 end 292 end
75 end 293 end