repository_subversion_test.rb 10.1 KB
Newer Older
1
# frozen_string_literal: true
2

3
# Redmine - project management software
jplang's avatar
jplang committed
4
# Copyright (C) 2006-2017  Jean-Philippe Lang
5 6 7 8 9
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
10
#
11 12 13 14
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
15
#
16 17 18 19
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

20
require File.expand_path('../../test_helper', __FILE__)
21

22
class RepositorySubversionTest < ActiveSupport::TestCase
23
  fixtures :projects, :repositories, :enabled_modules, :users, :roles
24

25 26
  include Redmine::I18n

27 28
  NUM_REV = 11

29
  def setup
30
    User.current = nil
31
    @project = Project.find(3)
32
    @repository = Repository::Subversion.create(:project => @project,
33
                    :url => self.class.subversion_repository_url)
34
    assert @repository
35
  end
36

37 38 39 40 41 42 43 44 45
  def test_invalid_url
    set_language_if_valid 'en'
    ['invalid', 'http://', 'svn://', 'svn+ssh://', 'file://'].each do |url|
      repo = Repository::Subversion.new(
                            :project      => @project,
                            :identifier   => 'test',
                            :url => url
                          )
      assert !repo.save
46
      assert_equal ["is invalid"], repo.errors[:url]
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
    end
  end

  def test_valid_url
    ['http://valid', 'svn://valid', 'svn+ssh://valid', 'file://valid'].each do |url|
      repo = Repository::Subversion.new(
                            :project      => @project,
                            :identifier   => 'test',
                            :url => url
                          )
      assert repo.save
      assert_equal [], repo.errors[:url]
      assert repo.destroy
    end
  end

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
  def test_url_should_be_validated_against_regexp_set_in_configuration
    Redmine::Configuration.with 'scm_subversion_path_regexp' => 'file:///svnpath/[a-z]+' do
      repo = Repository::Subversion.new(:project => @project, :identifier => 'test')
      repo.url = 'http://foo'
      assert !repo.valid?
      assert repo.errors[:url].present?

      repo.url = 'file:///svnpath/foo/bar'
      assert !repo.valid?
      assert repo.errors[:url].present?

      repo.url = 'file:///svnpath/foo'
      assert repo.valid?
    end
  end

  def test_url_should_be_validated_against_regexp_set_in_configuration_with_project_identifier
    Redmine::Configuration.with 'scm_subversion_path_regexp' => 'file:///svnpath/%project%(\.[a-z]+)?' do
      repo = Repository::Subversion.new(:project => @project, :identifier => 'test')
      repo.url = 'file:///svnpath/invalid'
      assert !repo.valid?
      assert repo.errors[:url].present?

      repo.url = 'file:///svnpath/subproject1'
      assert repo.valid?

      repo.url = 'file:///svnpath/subproject1.foo'
      assert repo.valid?
    end
  end

94
  if repository_configured?('subversion')
95
    def test_fetch_changesets_from_scratch
96
      assert_equal 0, @repository.changesets.count
97
      @repository.fetch_changesets
98
      @project.reload
99

100
      assert_equal NUM_REV, @repository.changesets.count
101
      assert_equal 20, @repository.filechanges.count
102
      assert_equal 'Initial import.', @repository.changesets.find_by_revision('1').comments
103
    end
104

105
    def test_fetch_changesets_incremental
106
      assert_equal 0, @repository.changesets.count
107
      @repository.fetch_changesets
108 109 110
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count

111
      # Remove changesets with revision > 5
112
      @repository.changesets.each {|c| c.destroy if c.revision.to_i > 5}
113
      @project.reload
114
      @repository.reload
115
      assert_equal 5, @repository.changesets.count
116

117
      @repository.fetch_changesets
118 119
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
120
    end
121

122 123 124 125 126
    def test_entries
      entries = @repository.entries
      assert_kind_of Redmine::Scm::Adapters::Entries, entries
    end

127 128 129 130 131
    def test_entries_for_invalid_path_should_return_nil
      entries = @repository.entries('invalid_path')
      assert_nil entries
    end

132
    def test_latest_changesets
133
      assert_equal 0, @repository.changesets.count
134
      @repository.fetch_changesets
135 136
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
137

138
      # with limit
jplang's avatar
jplang committed
139
      changesets = @repository.latest_changesets('', nil, 2)
140
      assert_equal 2, changesets.size
jplang's avatar
jplang committed
141
      assert_equal @repository.latest_changesets('', nil).slice(0,2), changesets
142

143 144 145
      # with path
      changesets = @repository.latest_changesets('subversion_test/folder', nil)
      assert_equal ["10", "9", "7", "6", "5", "2"], changesets.collect(&:revision)
146

147 148 149
      # with path and revision
      changesets = @repository.latest_changesets('subversion_test/folder', 8)
      assert_equal ["7", "6", "5", "2"], changesets.collect(&:revision)
150
    end
151 152

    def test_directory_listing_with_square_brackets_in_path
153
      assert_equal 0, @repository.changesets.count
154
      @repository.fetch_changesets
155 156
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
157

158 159 160 161 162 163 164
      entries = @repository.entries('subversion_test/[folder_with_brackets]')
      assert_not_nil entries, 'Expect to find entries in folder_with_brackets'
      assert_equal 1, entries.size, 'Expect one entry in folder_with_brackets'
      assert_equal 'README.txt', entries.first.name
    end

    def test_directory_listing_with_square_brackets_in_base
165
      @project = Project.find(3)
166 167 168
      @repository = Repository::Subversion.create(
                          :project => @project,
                          :url => "file:///#{self.class.repository_path('subversion')}/subversion_test/[folder_with_brackets]")
169

170
      assert_equal 0, @repository.changesets.count
171
      @repository.fetch_changesets
172
      @project.reload
173 174

      assert_equal 1, @repository.changesets.count, 'Expected to see 1 revision'
175
      assert_equal 2, @repository.filechanges.count, 'Expected to see 2 changes, dir add and file add'
176 177 178 179 180 181

      entries = @repository.entries('')
      assert_not_nil entries, 'Expect to find entries'
      assert_equal 1, entries.size, 'Expect a single entry'
      assert_equal 'README.txt', entries.first.name
    end
182 183

    def test_identifier
184
      assert_equal 0, @repository.changesets.count
185
      @repository.fetch_changesets
186 187
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
188 189 190 191
      c = @repository.changesets.find_by_revision('1')
      assert_equal c.revision, c.identifier
    end

192
    def test_find_changeset_by_empty_name
193
      assert_equal 0, @repository.changesets.count
194
      @repository.fetch_changesets
195 196
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
197 198 199 200 201
      ['', ' ', nil].each do |r|
        assert_nil @repository.find_changeset_by_name(r)
      end
    end

202 203 204 205 206 207 208
    def test_identifier_nine_digit
      c = Changeset.new(:repository => @repository, :committed_on => Time.now,
                        :revision => '123456789', :comments => 'test')
      assert_equal c.identifier, c.revision
    end

    def test_format_identifier
209
      assert_equal 0, @repository.changesets.count
210
      @repository.fetch_changesets
211 212
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
213 214 215 216 217 218 219 220 221 222 223
      c = @repository.changesets.find_by_revision('1')
      assert_equal c.format_identifier, c.revision
    end

    def test_format_identifier_nine_digit
      c = Changeset.new(:repository => @repository, :committed_on => Time.now,
                        :revision => '123456789', :comments => 'test')
      assert_equal c.format_identifier, c.revision
    end

    def test_activities
jplang's avatar
jplang committed
224 225
      c = Changeset.new(:repository => @repository, :committed_on => Time.now,
                        :revision => '1', :comments => 'test')
226
      assert c.event_title.include?('1:')
227
      assert_equal '1', c.event_url[:rev]
228 229 230 231 232
    end

    def test_activities_nine_digit
      c = Changeset.new(:repository => @repository, :committed_on => Time.now,
                        :revision => '123456789', :comments => 'test')
jplang's avatar
jplang committed
233
      assert c.event_title.include?('123456789:')
234
      assert_equal '123456789', c.event_url[:rev]
235
    end
236 237 238

    def test_log_encoding_ignore_setting
      with_settings :commit_logs_encoding => 'windows-1252' do
239
        s2 = \u0080"
240
        c = Changeset.new(:repository => @repository,
241 242
                          :comments   => s2,
                          :revision   => '123',
243 244 245 246 247
                          :committed_on => Time.now)
        assert c.save
        assert_equal s2, c.comments
      end
    end
248 249

    def test_previous
250
      assert_equal 0, @repository.changesets.count
251
      @repository.fetch_changesets
252 253
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
254 255 256 257 258
      changeset = @repository.find_changeset_by_name('3')
      assert_equal @repository.find_changeset_by_name('2'), changeset.previous
    end

    def test_previous_nil
259
      assert_equal 0, @repository.changesets.count
260
      @repository.fetch_changesets
261 262
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
263 264 265 266 267
      changeset = @repository.find_changeset_by_name('1')
      assert_nil changeset.previous
    end

    def test_next
268
      assert_equal 0, @repository.changesets.count
269
      @repository.fetch_changesets
270 271
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
272 273 274 275 276
      changeset = @repository.find_changeset_by_name('2')
      assert_equal @repository.find_changeset_by_name('3'), changeset.next
    end

    def test_next_nil
277
      assert_equal 0, @repository.changesets.count
278
      @repository.fetch_changesets
279 280
      @project.reload
      assert_equal NUM_REV, @repository.changesets.count
281 282 283
      changeset = @repository.find_changeset_by_name('11')
      assert_nil changeset.next
    end
284
  else
285
    puts "Subversion test repository NOT FOUND. Skipping unit tests !!!"
286
    def test_fake; assert true end
287 288
  end
end