repository_cvs_test.rb 8.89 KB
Newer Older
1
# Redmine - project management software
jplang's avatar
jplang committed
2
# Copyright (C) 2006-2012  Jean-Philippe Lang
3 4 5 6 7
#
# 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.
8
#
9 10 11 12
# 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.
13
#
14 15 16 17
# 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.

18
require File.expand_path('../../test_helper', __FILE__)
19
require 'pp'
20
class RepositoryCvsTest < ActiveSupport::TestCase
21
  fixtures :projects
22

23 24
  include Redmine::I18n

25
  REPOSITORY_PATH = Rails.root.join('tmp/test/cvs_repository').to_s
26
  REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin?
27
  # CVS module
28 29
  MODULE_NAME    = 'test'
  CHANGESETS_NUM = 7
30

31
  def setup
32
    @project = Project.find(3)
33
    @repository = Repository::Cvs.create(:project  => @project,
34
                                         :root_url => REPOSITORY_PATH,
35
                                         :url      => MODULE_NAME,
36 37
                                         :log_encoding => 'UTF-8')
    assert @repository
38
  end
39

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 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 94 95 96 97
  def test_blank_module_error_message
    set_language_if_valid 'en'
    repo = Repository::Cvs.new(
                          :project      => @project,
                          :identifier   => 'test',
                          :log_encoding => 'UTF-8',
                          :root_url     => REPOSITORY_PATH
                        )
    assert !repo.save
    assert_include "Module can't be blank",
                   repo.errors.full_messages
  end

  def test_blank_module_error_message_fr
    set_language_if_valid 'fr'
    str = "Module doit \xc3\xaatre renseign\xc3\xa9(e)"
    str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
    repo = Repository::Cvs.new(
                          :project       => @project,
                          :identifier    => 'test',
                          :log_encoding  => 'UTF-8',
                          :path_encoding => '',
                          :url           => '',
                          :root_url      => REPOSITORY_PATH
                        )
    assert !repo.save
    assert_include str, repo.errors.full_messages
  end

  def test_blank_cvsroot_error_message
    set_language_if_valid 'en'
    repo = Repository::Cvs.new(
                          :project      => @project,
                          :identifier   => 'test',
                          :log_encoding => 'UTF-8',
                          :url          => MODULE_NAME
                        )
    assert !repo.save
    assert_include "CVSROOT can't be blank",
                   repo.errors.full_messages
  end

  def test_blank_cvsroot_error_message_fr
    set_language_if_valid 'fr'
    str = "CVSROOT doit \xc3\xaatre renseign\xc3\xa9(e)"
    str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
    repo = Repository::Cvs.new(
                          :project       => @project,
                          :identifier    => 'test',
                          :log_encoding  => 'UTF-8',
                          :path_encoding => '',
                          :url           => MODULE_NAME,
                          :root_url      => ''
                        )
    assert !repo.save
    assert_include str, repo.errors.full_messages
  end

98
  if File.directory?(REPOSITORY_PATH)
99
    def test_fetch_changesets_from_scratch
100
      assert_equal 0, @repository.changesets.count
101
      @repository.fetch_changesets
102
      @project.reload
103

104
      assert_equal CHANGESETS_NUM, @repository.changesets.count
105
      assert_equal 16, @repository.filechanges.count
106
      assert_not_nil @repository.changesets.find_by_comments('Two files changed')
107 108 109

      r2 = @repository.changesets.find_by_revision('2')
      assert_equal 'v1-20071213-162510', r2.scmid
110
    end
111

112
    def test_fetch_changesets_incremental
113
      assert_equal 0, @repository.changesets.count
114
      @repository.fetch_changesets
115 116 117
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count

118 119
      # Remove changesets with revision > 3
      @repository.changesets.find(:all).each {|c| c.destroy if c.revision.to_i > 3}
120
      @project.reload
121
      assert_equal 3, @repository.changesets.count
122
      assert_equal %w|3 2 1|, @repository.changesets.all.collect(&:revision)
123 124 125 126 127

      rev3_commit = @repository.changesets.find(:first, :order => 'committed_on DESC')
      assert_equal '3', rev3_commit.revision
       # 2007-12-14 01:27:22 +0900
      rev3_committed_on = Time.gm(2007, 12, 13, 16, 27, 22)
128
      assert_equal 'HEAD-20071213-162722', rev3_commit.scmid
129 130 131 132
      assert_equal rev3_committed_on, rev3_commit.committed_on
      latest_rev = @repository.latest_changeset
      assert_equal rev3_committed_on, latest_rev.committed_on

133
      @repository.fetch_changesets
134
      @project.reload
135
      assert_equal CHANGESETS_NUM, @repository.changesets.count
136
      assert_equal %w|7 6 5 4 3 2 1|, @repository.changesets.all.collect(&:revision)
137
      rev5_commit = @repository.changesets.find_by_revision('5')
138
      assert_equal 'HEAD-20071213-163001', rev5_commit.scmid
139 140 141
       # 2007-12-14 01:30:01 +0900
      rev5_committed_on = Time.gm(2007, 12, 13, 16, 30, 1)
      assert_equal rev5_committed_on, rev5_commit.committed_on
142
    end
143

144
    def test_deleted_files_should_not_be_listed
145 146
      assert_equal 0, @repository.changesets.count
      @repository.fetch_changesets
147
      @project.reload
148
      assert_equal CHANGESETS_NUM, @repository.changesets.count
149

150 151 152 153
      entries = @repository.entries('sources')
      assert entries.detect {|e| e.name == 'watchers_controller.rb'}
      assert_nil entries.detect {|e| e.name == 'welcome_controller.rb'}
    end
154 155

    def test_entries_rev3
156
      assert_equal 0, @repository.changesets.count
157
      @repository.fetch_changesets
158 159
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
160 161 162 163 164 165 166 167
      entries = @repository.entries('', '3')
      assert_equal 3, entries.size
      assert_equal entries[2].name, "README"
      assert_equal entries[2].lastrev.time, Time.gm(2007, 12, 13, 16, 27, 22)
      assert_equal entries[2].lastrev.identifier, '3'
      assert_equal entries[2].lastrev.revision, '3'
      assert_equal entries[2].lastrev.author, 'LANG'
    end
168

169
    def test_entries_invalid_path
170
      assert_equal 0, @repository.changesets.count
171
      @repository.fetch_changesets
172 173
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
174 175 176 177
      assert_nil @repository.entries('missing')
      assert_nil @repository.entries('missing', '3')
    end

178
    def test_entries_invalid_revision
179
      assert_equal 0, @repository.changesets.count
180
      @repository.fetch_changesets
181 182
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
183 184 185
      assert_nil @repository.entries('', '123')
    end

186
    def test_cat
187
      assert_equal 0, @repository.changesets.count
188
      @repository.fetch_changesets
189 190
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
191 192 193
      buf = @repository.cat('README')
      assert buf
      lines = buf.split("\n")
194
      assert_equal 3, lines.length
195 196
      buf = lines[1].gsub(/\r$/, "")
      assert_equal 'with one change', buf
197
      buf = @repository.cat('README', '1')
198 199 200
      assert buf
      lines = buf.split("\n")
      assert_equal 1, lines.length
201 202
      buf = lines[0].gsub(/\r$/, "")
      assert_equal 'CVS test repository', buf
203
      assert_nil @repository.cat('missing.rb')
204 205 206 207

      # sources/welcome_controller.rb is removed at revision 5.
      assert @repository.cat('sources/welcome_controller.rb', '4')
      assert @repository.cat('sources/welcome_controller.rb', '5').blank?
208 209 210

      # invalid revision
      assert @repository.cat('README', '123').blank?
211
    end
212 213

    def test_annotate
214
      assert_equal 0, @repository.changesets.count
215
      @repository.fetch_changesets
216 217
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
218 219
      ann = @repository.annotate('README')
      assert ann
220
      assert_equal 3, ann.revisions.length
221 222 223
      assert_equal '1.2', ann.revisions[1].revision
      assert_equal 'LANG', ann.revisions[1].author
      assert_equal 'with one change', ann.lines[1]
224 225 226 227 228 229 230

      ann = @repository.annotate('README', '1')
      assert ann
      assert_equal 1, ann.revisions.length
      assert_equal '1.1', ann.revisions[0].revision
      assert_equal 'LANG', ann.revisions[0].author
      assert_equal 'CVS test repository', ann.lines[0]
231 232 233

     # invalid revision
     assert_nil @repository.annotate('README', '123')
234 235
   end

236 237 238 239 240
  else
    puts "CVS test repository NOT FOUND. Skipping unit tests !!!"
    def test_fake; assert true end
  end
end