##// END OF EJS Templates
scm: mercurial: move entries unit test from app to lib....
Toshi MARUYAMA -
r4743:a3a9661da6fc
parent child
Show More
@@ -1,193 +1,203
1 1 require File.expand_path('../../../../../../test_helper', __FILE__)
2 2 begin
3 3 require 'mocha'
4 4
5 5 class MercurialAdapterTest < ActiveSupport::TestCase
6 6
7 7 HELPERS_DIR = Redmine::Scm::Adapters::MercurialAdapter::HELPERS_DIR
8 8 TEMPLATE_NAME = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_NAME
9 9 TEMPLATE_EXTENSION = Redmine::Scm::Adapters::MercurialAdapter::TEMPLATE_EXTENSION
10 10
11 11 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
12 12
13 13 if File.directory?(REPOSITORY_PATH)
14 14 def setup
15 15 @adapter = Redmine::Scm::Adapters::MercurialAdapter.new(REPOSITORY_PATH)
16 16 @diff_c_support = true
17 17 end
18 18
19 19 def test_hgversion
20 20 to_test = { "Mercurial Distributed SCM (version 0.9.5)\n" => [0,9,5],
21 21 "Mercurial Distributed SCM (1.0)\n" => [1,0],
22 22 "Mercurial Distributed SCM (1e4ddc9ac9f7+20080325)\n" => nil,
23 23 "Mercurial Distributed SCM (1.0.1+20080525)\n" => [1,0,1],
24 24 "Mercurial Distributed SCM (1916e629a29d)\n" => nil,
25 25 "Mercurial SCM Distribuito (versione 0.9.5)\n" => [0,9,5],
26 26 "(1.6)\n(1.7)\n(1.8)" => [1,6],
27 27 "(1.7.1)\r\n(1.8.1)\r\n(1.9.1)" => [1,7,1]}
28 28
29 29 to_test.each do |s, v|
30 30 test_hgversion_for(s, v)
31 31 end
32 32 end
33 33
34 34 def test_template_path
35 35 to_test = { [0,9,5] => "0.9.5",
36 36 [1,0] => "1.0",
37 37 [] => "1.0",
38 38 [1,0,1] => "1.0",
39 39 [1,7] => "1.0",
40 40 [1,7,1] => "1.0" }
41 41 to_test.each do |v, template|
42 42 test_template_path_for(v, template)
43 43 end
44 44 end
45 45
46 46 def test_info
47 47 [REPOSITORY_PATH, REPOSITORY_PATH + "/",
48 48 REPOSITORY_PATH + "//"].each do |repo|
49 49 adp = Redmine::Scm::Adapters::MercurialAdapter.new(repo)
50 50 repo_path = adp.info.root_url.gsub(/\\/, "/")
51 51 assert_equal REPOSITORY_PATH, repo_path
52 52 assert_equal '16', adp.info.lastrev.revision
53 53 assert_equal '4cddb4e45f52',adp.info.lastrev.scmid
54 54 end
55 55 end
56 56
57 57 def test_revisions
58 58 revisions = @adapter.revisions(nil, 2, 4)
59 59 assert_equal 3, revisions.size
60 60 assert_equal '2', revisions[0].revision
61 61 assert_equal '400bb8672109', revisions[0].scmid
62 62 assert_equal '4', revisions[2].revision
63 63 assert_equal 'def6d2f1254a', revisions[2].scmid
64 64
65 65 revisions = @adapter.revisions(nil, 2, 4, {:limit => 2})
66 66 assert_equal 2, revisions.size
67 67 assert_equal '2', revisions[0].revision
68 68 assert_equal '400bb8672109', revisions[0].scmid
69 69 end
70 70
71 71 def test_diff
72 72 if @adapter.class.client_version_above?([1, 2])
73 73 assert_nil @adapter.diff(nil, '100000')
74 74 end
75 75 assert_nil @adapter.diff(nil, '100000', '200000')
76 76 [2, '400bb8672109', '400', 400].each do |r1|
77 77 diff1 = @adapter.diff(nil, r1)
78 78 if @diff_c_support
79 79 assert_equal 28, diff1.size
80 80 buf = diff1[24].gsub(/\r\n|\r|\n/, "")
81 81 assert_equal "+ return true unless klass.respond_to?('watched_by')", buf
82 82 else
83 83 assert_equal 0, diff1.size
84 84 end
85 85 [4, 'def6d2f1254a'].each do |r2|
86 86 diff2 = @adapter.diff(nil,r1,r2)
87 87 assert_equal 49, diff2.size
88 88 buf = diff2[41].gsub(/\r\n|\r|\n/, "")
89 89 assert_equal "+class WelcomeController < ApplicationController", buf
90 90 diff3 = @adapter.diff('sources/watchers_controller.rb', r1, r2)
91 91 assert_equal 20, diff3.size
92 92 buf = diff3[12].gsub(/\r\n|\r|\n/, "")
93 93 assert_equal "+ @watched.remove_watcher(user)", buf
94 94 end
95 95 end
96 96 end
97 97
98 98 def test_diff_made_by_revision
99 99 if @diff_c_support
100 100 [16, '16', '4cddb4e45f52'].each do |r1|
101 101 diff1 = @adapter.diff(nil, r1)
102 102 assert_equal 5, diff1.size
103 103 buf = diff1[4].gsub(/\r\n|\r|\n/, "")
104 104 assert_equal '+0885933ad4f68d77c2649cd11f8311276e7ef7ce tag-init-revision', buf
105 105 end
106 106 end
107 107 end
108 108
109 109 def test_cat
110 110 [2, '400bb8672109', '400', 400].each do |r|
111 111 buf = @adapter.cat('sources/welcome_controller.rb', r)
112 112 assert buf
113 113 lines = buf.split("\r\n")
114 114 assert_equal 25, lines.length
115 115 assert_equal 'class WelcomeController < ApplicationController', lines[17]
116 116 end
117 117 assert_nil @adapter.cat('sources/welcome_controller.rb')
118 118 end
119 119
120 120 def test_annotate
121 121 assert_equal [], @adapter.annotate("sources/welcome_controller.rb").lines
122 122 [2, '400bb8672109', '400', 400].each do |r|
123 123 ann = @adapter.annotate('sources/welcome_controller.rb', r)
124 124 assert ann
125 125 assert_equal '1', ann.revisions[17].revision
126 126 assert_equal '9d5b5b004199', ann.revisions[17].identifier
127 127 assert_equal 'jsmith', ann.revisions[0].author
128 128 assert_equal 25, ann.lines.length
129 129 assert_equal 'class WelcomeController < ApplicationController', ann.lines[17]
130 130 end
131 131 end
132 132
133 133 # TODO filesize etc.
134 134 def test_entries
135 135 assert_nil @adapter.entries(nil, '100000')
136
137 assert_equal 1, @adapter.entries("sources", 3).size
138 assert_equal 1, @adapter.entries("sources", 'b3a615152df8').size
139
136 140 [2, '400bb8672109', '400', 400].each do |r|
137 141 entries1 = @adapter.entries(nil, r)
138 142 assert entries1
139 143 assert_equal 3, entries1.size
140 144 assert_equal 'sources', entries1[1].name
141 145 assert_equal 'sources', entries1[1].path
142 146 assert_equal 'dir', entries1[1].kind
143 147 assert_equal 'README', entries1[2].name
144 148 assert_equal 'README', entries1[2].path
145 149 assert_equal 'file', entries1[2].kind
146 150
147 151 entries2 = @adapter.entries('sources', r)
148 152 assert entries2
149 153 assert_equal 2, entries2.size
150 154 assert_equal 'watchers_controller.rb', entries2[0].name
151 155 assert_equal 'sources/watchers_controller.rb', entries2[0].path
152 156 assert_equal 'file', entries2[0].kind
153 157 assert_equal 'welcome_controller.rb', entries2[1].name
154 158 assert_equal 'sources/welcome_controller.rb', entries2[1].path
155 159 assert_equal 'file', entries2[1].kind
156 160 end
157 161 end
158 162
163 def test_locate_on_outdated_repository
164 assert_equal 1, @adapter.entries("images", 0).size
165 assert_equal 2, @adapter.entries("images").size
166 assert_equal 2, @adapter.entries("images", 2).size
167 end
168
159 169 def test_access_by_nodeid
160 170 path = 'sources/welcome_controller.rb'
161 171 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400bb8672109')
162 172 end
163 173
164 174 def test_access_by_fuzzy_nodeid
165 175 path = 'sources/welcome_controller.rb'
166 176 # falls back to nodeid
167 177 assert_equal @adapter.cat(path, 2), @adapter.cat(path, '400')
168 178 end
169 179
170 180 private
171 181
172 182 def test_hgversion_for(hgversion, version)
173 183 @adapter.class.expects(:hgversion_from_command_line).returns(hgversion)
174 184 assert_equal version, @adapter.class.hgversion
175 185 end
176 186
177 187 def test_template_path_for(version, template)
178 188 assert_equal "#{HELPERS_DIR}/#{TEMPLATE_NAME}-#{template}.#{TEMPLATE_EXTENSION}",
179 189 @adapter.class.template_path_for(version)
180 190 assert File.exist?(@adapter.class.template_path_for(version))
181 191 end
182 192 else
183 193 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
184 194 def test_fake; assert true end
185 195 end
186 196 end
187 197
188 198 rescue LoadError
189 199 class MercurialMochaFake < ActiveSupport::TestCase
190 200 def test_fake; assert(false, "Requires mocha to run those tests") end
191 201 end
192 202 end
193 203
@@ -1,178 +1,165
1 1 # redMine - project management software
2 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class RepositoryMercurialTest < ActiveSupport::TestCase
21 21 fixtures :projects
22 22
23 23 # No '..' in the repository path
24 24 REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') + '/tmp/test/mercurial_repository'
25 25
26 26 def setup
27 27 @project = Project.find(1)
28 28 @repository = Repository::Mercurial.create(:project => @project, :url => REPOSITORY_PATH)
29 29 assert @repository
30 30 end
31 31
32 32 if File.directory?(REPOSITORY_PATH)
33 33 def test_fetch_changesets_from_scratch
34 34 @repository.fetch_changesets
35 35 @repository.reload
36 36 assert_equal 17, @repository.changesets.count
37 37 assert_equal 25, @repository.changes.count
38 38 assert_equal "Initial import.\nThe repository contains 3 files.",
39 39 @repository.changesets.find_by_revision('0').comments
40 40 end
41 41
42 42 def test_fetch_changesets_incremental
43 43 @repository.fetch_changesets
44 44 # Remove changesets with revision > 2
45 45 @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 2}
46 46 @repository.reload
47 47 assert_equal 3, @repository.changesets.count
48 48
49 49 @repository.fetch_changesets
50 50 assert_equal 17, @repository.changesets.count
51 51 end
52 52
53 def test_entries
54 assert_equal 2, @repository.entries("sources", 2).size
55 assert_equal 2, @repository.entries("sources", '400bb8672109').size
56 assert_equal 1, @repository.entries("sources", 3).size
57 assert_equal 1, @repository.entries("sources", 'b3a615152df8').size
58 end
59
60 def test_locate_on_outdated_repository
61 assert_equal 1, @repository.entries("images", 0).size
62 assert_equal 2, @repository.entries("images").size
63 assert_equal 2, @repository.entries("images", 2).size
64 end
65
66 53 def test_isodatesec
67 54 # Template keyword 'isodatesec' supported in Mercurial 1.0 and higher
68 55 if @repository.scm.class.client_version_above?([1, 0])
69 56 @repository.fetch_changesets
70 57 @repository.reload
71 58 rev0_committed_on = Time.gm(2007, 12, 14, 9, 22, 52)
72 59 assert_equal @repository.changesets.find_by_revision('0').committed_on, rev0_committed_on
73 60 end
74 61 end
75 62
76 63 def test_changeset_order_by_revision
77 64 @repository.fetch_changesets
78 65 @repository.reload
79 66
80 67 c0 = @repository.latest_changeset
81 68 c1 = @repository.changesets.find_by_revision('0')
82 69 # sorted by revision (id), not by date
83 70 assert c0.revision.to_i > c1.revision.to_i
84 71 assert c0.committed_on < c1.committed_on
85 72 end
86 73
87 74 def test_latest_changesets
88 75 @repository.fetch_changesets
89 76 @repository.reload
90 77
91 78 # with_limit
92 79 changesets = @repository.latest_changesets('', nil, 2)
93 80 assert_equal @repository.latest_changesets('', nil)[0, 2], changesets
94 81
95 82 # with_filepath
96 83 changesets = @repository.latest_changesets('/sql_escape/percent%dir/percent%file1.txt', nil)
97 84 assert_equal %w|11 10 9|, changesets.collect(&:revision)
98 85
99 86 changesets = @repository.latest_changesets('/sql_escape/underscore_dir/understrike_file.txt', nil)
100 87 assert_equal %w|12 9|, changesets.collect(&:revision)
101 88 end
102 89
103 90 def test_copied_files
104 91 @repository.fetch_changesets
105 92 @repository.reload
106 93
107 94 cs1 = @repository.changesets.find_by_revision('13')
108 95 assert_not_nil cs1
109 96 c1 = cs1.changes.sort_by(&:path)
110 97 assert_equal 2, c1.size
111 98
112 99 assert_equal 'A', c1[0].action
113 100 assert_equal '/sql_escape/percent%dir/percentfile1.txt', c1[0].path
114 101 assert_equal '/sql_escape/percent%dir/percent%file1.txt', c1[0].from_path
115 102
116 103 assert_equal 'A', c1[1].action
117 104 assert_equal '/sql_escape/underscore_dir/understrike-file.txt', c1[1].path
118 105 assert_equal '/sql_escape/underscore_dir/understrike_file.txt', c1[1].from_path
119 106
120 107 cs2 = @repository.changesets.find_by_revision('15')
121 108 c2 = cs2.changes
122 109 assert_equal 1, c2.size
123 110
124 111 assert_equal 'A', c2[0].action
125 112 assert_equal '/README (1)[2]&,%.-3_4', c2[0].path
126 113 assert_equal '/README', c2[0].from_path
127 114 end
128 115
129 116 def test_find_changeset_by_name
130 117 @repository.fetch_changesets
131 118 @repository.reload
132 119 %w|2 400bb8672109 400|.each do |r|
133 120 assert_equal '2', @repository.find_changeset_by_name(r).revision
134 121 end
135 122 end
136 123
137 124 def test_find_changeset_by_invalid_name
138 125 @repository.fetch_changesets
139 126 @repository.reload
140 127 assert_nil @repository.find_changeset_by_name('100000')
141 128 end
142 129
143 130 def test_identifier
144 131 @repository.fetch_changesets
145 132 @repository.reload
146 133 c = @repository.changesets.find_by_revision('2')
147 134 assert_equal c.scmid, c.identifier
148 135 end
149 136
150 137 def test_format_identifier
151 138 @repository.fetch_changesets
152 139 @repository.reload
153 140 c = @repository.changesets.find_by_revision('2')
154 141 assert_equal '2:400bb8672109', c.format_identifier
155 142 end
156 143
157 144 def test_find_changeset_by_empty_name
158 145 @repository.fetch_changesets
159 146 @repository.reload
160 147 ['', ' ', nil].each do |r|
161 148 assert_nil @repository.find_changeset_by_name(r)
162 149 end
163 150 end
164 151
165 152 def test_activities
166 153 c = Changeset.new(:repository => @repository,
167 154 :committed_on => Time.now,
168 155 :revision => '123',
169 156 :scmid => 'abc400bb8672',
170 157 :comments => 'test')
171 158 assert c.event_title.include?('123:abc400bb8672:')
172 159 assert_equal 'abc400bb8672', c.event_url[:rev]
173 160 end
174 161 else
175 162 puts "Mercurial test repository NOT FOUND. Skipping unit tests !!!"
176 163 def test_fake; assert true end
177 164 end
178 165 end
General Comments 0
You need to be logged in to leave comments. Login now