repository_cvs_test.rb 8.96 KB
Newer Older
1
# Redmine - project management software
jplang's avatar
jplang committed
2
# Copyright (C) 2006-2013  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
      # Remove changesets with revision > 3
jplang's avatar
jplang committed
119
      @repository.changesets.all.each {|c| c.destroy if c.revision.to_i > 3}
120
      @project.reload
121
      @repository.reload
122
      assert_equal 3, @repository.changesets.count
123
      assert_equal %w|3 2 1|, @repository.changesets.all.collect(&:revision)
124

jplang's avatar
jplang committed
125
      rev3_commit = @repository.changesets.reorder('committed_on DESC').first
126 127 128
      assert_equal '3', rev3_commit.revision
       # 2007-12-14 01:27:22 +0900
      rev3_committed_on = Time.gm(2007, 12, 13, 16, 27, 22)
129
      assert_equal 'HEAD-20071213-162722', rev3_commit.scmid
130 131 132 133
      assert_equal rev3_committed_on, rev3_commit.committed_on
      latest_rev = @repository.latest_changeset
      assert_equal rev3_committed_on, latest_rev.committed_on

134
      @repository.fetch_changesets
135
      @project.reload
136
      assert_equal CHANGESETS_NUM, @repository.changesets.count
137
      assert_equal %w|7 6 5 4 3 2 1|, @repository.changesets.all.collect(&:revision)
138
      rev5_commit = @repository.changesets.find_by_revision('5')
139
      assert_equal 'HEAD-20071213-163001', rev5_commit.scmid
140 141 142
       # 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
143
    end
144

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

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

    def test_entries_rev3
157
      assert_equal 0, @repository.changesets.count
158
      @repository.fetch_changesets
159 160
      @project.reload
      assert_equal CHANGESETS_NUM, @repository.changesets.count
161
      entries = @repository.entries('', '3')
162
      assert_kind_of Redmine::Scm::Adapters::Entries, entries
163 164 165 166 167 168 169
      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
170

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

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

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

      # 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?
210 211 212

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

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

      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]
233 234 235

     # invalid revision
     assert_nil @repository.annotate('README', '123')
236 237
   end

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