comparison test/unit/repository_bazaar_test.rb @ 1115:433d4f72a19b redmine-2.2

Update to Redmine SVN revision 11137 on 2.2-stable branch
author Chris Cannam
date Mon, 07 Jan 2013 12:01:42 +0000
parents cbb26bc654de
children 622f24f53b42
comparison
equal deleted inserted replaced
929:5f33065ddc4b 1115:433d4f72a19b
1 # Redmine - project management software 1 # Redmine - project management software
2 # Copyright (C) 2006-2011 Jean-Philippe Lang 2 # Copyright (C) 2006-2012 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.
18 require File.expand_path('../../test_helper', __FILE__) 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 class RepositoryBazaarTest < ActiveSupport::TestCase 20 class RepositoryBazaarTest < ActiveSupport::TestCase
21 fixtures :projects 21 fixtures :projects
22 22
23 REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository/trunk').to_s 23 include Redmine::I18n
24 REPOSITORY_PATH.gsub!(/\/+/, '/') 24
25 REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s
26 REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk")
25 NUM_REV = 4 27 NUM_REV = 4
28
29 REPOSITORY_PATH_NON_ASCII = Rails.root.join(REPOSITORY_PATH + '/' + 'non_ascii').to_s
30
31 # Bazaar core does not support xml output such as Subversion and Mercurial.
32 # "bzr" command output and command line parameter depend on locale.
33 # So, non ASCII path tests cannot run independent locale.
34 #
35 # If you want to run Bazaar non ASCII path tests on Linux *Ruby 1.9*,
36 # you need to set locale character set "ISO-8859-1".
37 # E.g. "LANG=en_US.ISO-8859-1".
38 # On Linux other platforms (e.g. Ruby 1.8, JRuby),
39 # you need to set "RUN_LATIN1_OUTPUT_TEST = true" manually.
40 #
41 # On Windows, because it is too hard to change system locale,
42 # you cannot run Bazaar non ASCII path tests.
43 #
44 RUN_LATIN1_OUTPUT_TEST = (RUBY_PLATFORM != 'java' &&
45 REPOSITORY_PATH.respond_to?(:force_encoding) &&
46 Encoding.locale_charmap == "ISO-8859-1")
47
48 CHAR_1_UTF8_HEX = "\xc3\x9c"
49 CHAR_1_LATIN1_HEX = "\xdc"
26 50
27 def setup 51 def setup
28 @project = Project.find(3) 52 @project = Project.find(3)
29 @repository = Repository::Bazaar.create( 53 @repository = Repository::Bazaar.create(
30 :project => @project, :url => "file:///#{REPOSITORY_PATH}", 54 :project => @project, :url => REPOSITORY_PATH_TRUNK,
31 :log_encoding => 'UTF-8') 55 :log_encoding => 'UTF-8')
32 assert @repository 56 assert @repository
57 @char_1_utf8 = CHAR_1_UTF8_HEX.dup
58 @char_1_ascii8bit = CHAR_1_LATIN1_HEX.dup
59 if @char_1_utf8.respond_to?(:force_encoding)
60 @char_1_utf8.force_encoding('UTF-8')
61 @char_1_ascii8bit.force_encoding('ASCII-8BIT')
62 end
33 end 63 end
34 64
35 if File.directory?(REPOSITORY_PATH) 65 def test_blank_path_to_repository_error_message
66 set_language_if_valid 'en'
67 repo = Repository::Bazaar.new(
68 :project => @project,
69 :identifier => 'test',
70 :log_encoding => 'UTF-8'
71 )
72 assert !repo.save
73 assert_include "Path to repository can't be blank",
74 repo.errors.full_messages
75 end
76
77 def test_blank_path_to_repository_error_message_fr
78 set_language_if_valid 'fr'
79 str = "Chemin du d\xc3\xa9p\xc3\xb4t doit \xc3\xaatre renseign\xc3\xa9(e)"
80 str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
81 repo = Repository::Bazaar.new(
82 :project => @project,
83 :url => "",
84 :identifier => 'test',
85 :log_encoding => 'UTF-8'
86 )
87 assert !repo.save
88 assert_include str, repo.errors.full_messages
89 end
90
91 if File.directory?(REPOSITORY_PATH_TRUNK)
36 def test_fetch_changesets_from_scratch 92 def test_fetch_changesets_from_scratch
37 assert_equal 0, @repository.changesets.count 93 assert_equal 0, @repository.changesets.count
38 @repository.fetch_changesets 94 @repository.fetch_changesets
39 @project.reload 95 @project.reload
40 96
41 assert_equal NUM_REV, @repository.changesets.count 97 assert_equal NUM_REV, @repository.changesets.count
42 assert_equal 9, @repository.changes.count 98 assert_equal 9, @repository.filechanges.count
43 assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments 99 assert_equal 'Initial import', @repository.changesets.find_by_revision('1').comments
44 end 100 end
45 101
46 def test_fetch_changesets_incremental 102 def test_fetch_changesets_incremental
47 assert_equal 0, @repository.changesets.count 103 assert_equal 0, @repository.changesets.count
58 assert_equal NUM_REV, @repository.changesets.count 114 assert_equal NUM_REV, @repository.changesets.count
59 end 115 end
60 116
61 def test_entries 117 def test_entries
62 entries = @repository.entries 118 entries = @repository.entries
119 assert_kind_of Redmine::Scm::Adapters::Entries, entries
63 assert_equal 2, entries.size 120 assert_equal 2, entries.size
64 121
65 assert_equal 'dir', entries[0].kind 122 assert_equal 'dir', entries[0].kind
66 assert_equal 'directory', entries[0].name 123 assert_equal 'directory', entries[0].name
124 assert_equal 'directory', entries[0].path
67 125
68 assert_equal 'file', entries[1].kind 126 assert_equal 'file', entries[1].kind
69 assert_equal 'doc-mkdir.txt', entries[1].name 127 assert_equal 'doc-mkdir.txt', entries[1].name
128 assert_equal 'doc-mkdir.txt', entries[1].path
70 end 129 end
71 130
72 def test_entries_in_subdirectory 131 def test_entries_in_subdirectory
73 entries = @repository.entries('directory') 132 entries = @repository.entries('directory')
74 assert_equal 3, entries.size 133 assert_equal 3, entries.size
75 134
76 assert_equal 'file', entries.last.kind 135 assert_equal 'file', entries.last.kind
77 assert_equal 'edit.png', entries.last.name 136 assert_equal 'edit.png', entries.last.name
137 assert_equal 'directory/edit.png', entries.last.path
78 end 138 end
79 139
80 def test_previous 140 def test_previous
81 assert_equal 0, @repository.changesets.count 141 assert_equal 0, @repository.changesets.count
82 @repository.fetch_changesets 142 @repository.fetch_changesets
109 @repository.fetch_changesets 169 @repository.fetch_changesets
110 @project.reload 170 @project.reload
111 assert_equal NUM_REV, @repository.changesets.count 171 assert_equal NUM_REV, @repository.changesets.count
112 changeset = @repository.find_changeset_by_name('4') 172 changeset = @repository.find_changeset_by_name('4')
113 assert_nil changeset.next 173 assert_nil changeset.next
174 end
175
176 if File.directory?(REPOSITORY_PATH_NON_ASCII) && RUN_LATIN1_OUTPUT_TEST
177 def test_cat_latin1_path
178 latin1_repo = create_latin1_repo
179 buf = latin1_repo.cat(
180 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", 2)
181 assert buf
182 lines = buf.split("\n")
183 assert_equal 2, lines.length
184 assert_equal 'It is written in Python.', lines[1]
185
186 buf = latin1_repo.cat(
187 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2)
188 assert buf
189 lines = buf.split("\n")
190 assert_equal 1, lines.length
191 assert_equal "test-#{@char_1_ascii8bit}.txt", lines[0]
192 end
193
194 def test_annotate_latin1_path
195 latin1_repo = create_latin1_repo
196 ann1 = latin1_repo.annotate(
197 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", 2)
198 assert_equal 2, ann1.lines.size
199 assert_equal '2', ann1.revisions[0].identifier
200 assert_equal 'test00@', ann1.revisions[0].author
201 assert_equal 'It is written in Python.', ann1.lines[1]
202 ann2 = latin1_repo.annotate(
203 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2)
204 assert_equal 1, ann2.lines.size
205 assert_equal '2', ann2.revisions[0].identifier
206 assert_equal 'test00@', ann2.revisions[0].author
207 assert_equal "test-#{@char_1_ascii8bit}.txt", ann2.lines[0]
208 end
209
210 def test_diff_latin1_path
211 latin1_repo = create_latin1_repo
212 diff1 = latin1_repo.diff(
213 "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", 2, 1)
214 assert_equal 7, diff1.size
215 buf = diff1[5].gsub(/\r\n|\r|\n/, "")
216 assert_equal "+test-#{@char_1_ascii8bit}.txt", buf
217 end
218
219 def test_entries_latin1_path
220 latin1_repo = create_latin1_repo
221 entries = latin1_repo.entries("test-#{@char_1_utf8}-dir", 2)
222 assert_kind_of Redmine::Scm::Adapters::Entries, entries
223 assert_equal 3, entries.size
224 assert_equal 'file', entries[1].kind
225 assert_equal "test-#{@char_1_utf8}-1.txt", entries[0].name
226 assert_equal "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", entries[0].path
227 end
228
229 def test_entry_latin1_path
230 latin1_repo = create_latin1_repo
231 ["test-#{@char_1_utf8}-dir",
232 "/test-#{@char_1_utf8}-dir",
233 "/test-#{@char_1_utf8}-dir/"
234 ].each do |path|
235 entry = latin1_repo.entry(path, 2)
236 assert_equal "test-#{@char_1_utf8}-dir", entry.path
237 assert_equal "dir", entry.kind
238 end
239 ["test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt",
240 "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt"
241 ].each do |path|
242 entry = latin1_repo.entry(path, 2)
243 assert_equal "test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt",
244 entry.path
245 assert_equal "file", entry.kind
246 end
247 end
248
249 def test_changeset_latin1_path
250 latin1_repo = create_latin1_repo
251 assert_equal 0, latin1_repo.changesets.count
252 latin1_repo.fetch_changesets
253 @project.reload
254 assert_equal 3, latin1_repo.changesets.count
255
256 cs2 = latin1_repo.changesets.find_by_revision('2')
257 assert_not_nil cs2
258 assert_equal "test-#{@char_1_utf8}", cs2.comments
259 c2 = cs2.filechanges.sort_by(&:path)
260 assert_equal 4, c2.size
261 assert_equal 'A', c2[0].action
262 assert_equal "/test-#{@char_1_utf8}-dir/", c2[0].path
263 assert_equal 'A', c2[1].action
264 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-1.txt", c2[1].path
265 assert_equal 'A', c2[2].action
266 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", c2[2].path
267 assert_equal 'A', c2[3].action
268 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}.txt", c2[3].path
269
270 cs3 = latin1_repo.changesets.find_by_revision('3')
271 assert_not_nil cs3
272 assert_equal "modify, move and delete #{@char_1_utf8} files", cs3.comments
273 c3 = cs3.filechanges.sort_by(&:path)
274 assert_equal 3, c3.size
275 assert_equal 'M', c3[0].action
276 assert_equal "/test-#{@char_1_utf8}-1.txt", c3[0].path
277 assert_equal 'D', c3[1].action
278 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}-2.txt", c3[1].path
279 assert_equal 'M', c3[2].action
280 assert_equal "/test-#{@char_1_utf8}-dir/test-#{@char_1_utf8}.txt", c3[2].path
281 end
282 else
283 msg = "Bazaar non ASCII output test cannot run this environment." + "\n"
284 if msg.respond_to?(:force_encoding)
285 msg += "Encoding.locale_charmap: " + Encoding.locale_charmap + "\n"
286 end
287 puts msg
288 end
289
290 private
291
292 def create_latin1_repo
293 repo = Repository::Bazaar.create(
294 :project => @project,
295 :identifier => 'latin1',
296 :url => REPOSITORY_PATH_NON_ASCII,
297 :log_encoding => 'ISO-8859-1'
298 )
299 assert repo
300 repo
114 end 301 end
115 else 302 else
116 puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!" 303 puts "Bazaar test repository NOT FOUND. Skipping unit tests !!!"
117 def test_fake; assert true end 304 def test_fake; assert true end
118 end 305 end