To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

root / .svn / pristine / 30 / 304b68e7e7a6cf907c51306f2e95b29f2a8946e9.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (8.7 KB)

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

    
18
require File.expand_path('../../test_helper', __FILE__)
19

    
20
class RepositoryTest < ActiveSupport::TestCase
21
  fixtures :projects,
22
           :trackers,
23
           :projects_trackers,
24
           :enabled_modules,
25
           :repositories,
26
           :issues,
27
           :issue_statuses,
28
           :issue_categories,
29
           :changesets,
30
           :changes,
31
           :users,
32
           :members,
33
           :member_roles,
34
           :roles,
35
           :enumerations
36

    
37
  def setup
38
    @repository = Project.find(1).repository
39
  end
40

    
41
  def test_create
42
    repository = Repository::Subversion.new(:project => Project.find(3))
43
    assert !repository.save
44

    
45
    repository.url = "svn://localhost"
46
    assert repository.save
47
    repository.reload
48

    
49
    project = Project.find(3)
50
    assert_equal repository, project.repository
51
  end
52

    
53
  def test_destroy
54
    changesets = Changeset.count(:all, :conditions => "repository_id = 10")
55
    changes = Change.count(:all, :conditions => "repository_id = 10",
56
                           :include => :changeset)
57
    assert_difference 'Changeset.count', -changesets do
58
      assert_difference 'Change.count', -changes do
59
        Repository.find(10).destroy
60
      end
61
    end
62
  end
63

    
64
  def test_should_not_create_with_disabled_scm
65
    # disable Subversion
66
    with_settings :enabled_scm => ['Darcs', 'Git'] do
67
      repository = Repository::Subversion.new(
68
                      :project => Project.find(3), :url => "svn://localhost")
69
      assert !repository.save
70
      assert_equal I18n.translate('activerecord.errors.messages.invalid'),
71
                                  repository.errors.on(:type)
72
    end
73
  end
74

    
75
  def test_scan_changesets_for_issue_ids
76
    Setting.default_language = 'en'
77
    Setting.notified_events = ['issue_added','issue_updated']
78

    
79
    # choosing a status to apply to fix issues
80
    Setting.commit_fix_status_id = IssueStatus.find(
81
                                     :first,
82
                                     :conditions => ["is_closed = ?", true]).id
83
    Setting.commit_fix_done_ratio = "90"
84
    Setting.commit_ref_keywords = 'refs , references, IssueID'
85
    Setting.commit_fix_keywords = 'fixes , closes'
86
    Setting.default_language = 'en'
87
    ActionMailer::Base.deliveries.clear
88

    
89
    # make sure issue 1 is not already closed
90
    fixed_issue = Issue.find(1)
91
    assert !fixed_issue.status.is_closed?
92
    old_status = fixed_issue.status
93

    
94
    Repository.scan_changesets_for_issue_ids
95
    assert_equal [101, 102], Issue.find(3).changeset_ids
96

    
97
    # fixed issues
98
    fixed_issue.reload
99
    assert fixed_issue.status.is_closed?
100
    assert_equal 90, fixed_issue.done_ratio
101
    assert_equal [101], fixed_issue.changeset_ids
102

    
103
    # issue change
104
    journal = fixed_issue.journals.find(:first, :order => 'created_on desc')
105
    assert_equal User.find_by_login('dlopper'), journal.user
106
    assert_equal 'Applied in changeset r2.', journal.notes
107

    
108
    # 2 email notifications
109
    assert_equal 2, ActionMailer::Base.deliveries.size
110
    mail = ActionMailer::Base.deliveries.first
111
    assert_kind_of TMail::Mail, mail
112
    assert mail.subject.starts_with?(
113
        "[#{fixed_issue.project.name} - #{fixed_issue.tracker.name} ##{fixed_issue.id}]")
114
    assert mail.body.include?(
115
        "Status changed from #{old_status} to #{fixed_issue.status}")
116

    
117
    # ignoring commits referencing an issue of another project
118
    assert_equal [], Issue.find(4).changesets
119
  end
120

    
121
  def test_for_changeset_comments_strip
122
    repository = Repository::Mercurial.create(
123
                    :project => Project.find( 4 ),
124
                    :url => '/foo/bar/baz' )
125
    comment = <<-COMMENT
126
    This is a loooooooooooooooooooooooooooong comment                                                   
127
                                                                                                       
128
                                                                                            
129
    COMMENT
130
    changeset = Changeset.new(
131
      :comments => comment, :commit_date => Time.now,
132
      :revision => 0, :scmid => 'f39b7922fb3c',
133
      :committer => 'foo <foo@example.com>',
134
      :committed_on => Time.now, :repository => repository )
135
    assert( changeset.save )
136
    assert_not_equal( comment, changeset.comments )
137
    assert_equal( 'This is a loooooooooooooooooooooooooooong comment',
138
                  changeset.comments )
139
  end
140

    
141
  def test_for_urls_strip_cvs
142
    repository = Repository::Cvs.create(
143
        :project => Project.find(4),
144
        :url => ' :pserver:login:password@host:/path/to/the/repository',
145
        :root_url => 'foo  ',
146
        :log_encoding => 'UTF-8')
147
    assert repository.save
148
    repository.reload
149
    assert_equal ':pserver:login:password@host:/path/to/the/repository',
150
                  repository.url
151
    assert_equal 'foo', repository.root_url
152
  end
153

    
154
  def test_for_urls_strip_subversion
155
    repository = Repository::Subversion.create(
156
        :project => Project.find(4),
157
        :url => ' file:///dummy   ')
158
    assert repository.save
159
    repository.reload
160
    assert_equal 'file:///dummy', repository.url
161
  end
162

    
163
  def test_for_urls_strip_git
164
    repository = Repository::Git.create(
165
        :project => Project.find(4),
166
        :url => ' c:\dummy   ')
167
    assert repository.save
168
    repository.reload
169
    assert_equal 'c:\dummy', repository.url
170
  end
171

    
172
  def test_manual_user_mapping
173
    assert_no_difference "Changeset.count(:conditions => 'user_id <> 2')" do
174
      c = Changeset.create!(
175
              :repository => @repository,
176
              :committer => 'foo',
177
              :committed_on => Time.now,
178
              :revision => 100,
179
              :comments => 'Committed by foo.'
180
            )
181
      assert_nil c.user
182
      @repository.committer_ids = {'foo' => '2'}
183
      assert_equal User.find(2), c.reload.user
184
      # committer is now mapped
185
      c = Changeset.create!(
186
              :repository => @repository,
187
              :committer => 'foo',
188
              :committed_on => Time.now,
189
              :revision => 101,
190
              :comments => 'Another commit by foo.'
191
            )
192
      assert_equal User.find(2), c.user
193
    end
194
  end
195

    
196
  def test_auto_user_mapping_by_username
197
    c = Changeset.create!(
198
          :repository   => @repository,
199
          :committer    => 'jsmith',
200
          :committed_on => Time.now,
201
          :revision     => 100,
202
          :comments     => 'Committed by john.'
203
        )
204
    assert_equal User.find(2), c.user
205
  end
206

    
207
  def test_auto_user_mapping_by_email
208
    c = Changeset.create!(
209
          :repository   => @repository,
210
          :committer    => 'john <jsmith@somenet.foo>',
211
          :committed_on => Time.now,
212
          :revision     => 100,
213
          :comments     => 'Committed by john.'
214
        )
215
    assert_equal User.find(2), c.user
216
  end
217

    
218
  def test_filesystem_avaialbe
219
    klass = Repository::Filesystem
220
    assert klass.scm_adapter_class
221
    assert_equal true, klass.scm_available
222
  end
223

    
224
  def test_merge_extra_info
225
    repo = Repository::Subversion.new(:project => Project.find(3))
226
    assert !repo.save
227
    repo.url = "svn://localhost"
228
    assert repo.save
229
    repo.reload
230
    project = Project.find(3)
231
    assert_equal repo, project.repository
232
    assert_nil repo.extra_info
233
    h1 = {"test_1" => {"test_11" => "test_value_11"}}
234
    repo.merge_extra_info(h1)
235
    assert_equal h1, repo.extra_info
236
    h2 = {"test_2" => {
237
                   "test_21" => "test_value_21",
238
                   "test_22" => "test_value_22",
239
                  }}
240
    repo.merge_extra_info(h2)
241
    assert_equal (h = {"test_11" => "test_value_11"}),
242
                 repo.extra_info["test_1"]
243
    assert_equal "test_value_21",
244
                 repo.extra_info["test_2"]["test_21"]
245
    h3 = {"test_2" => {
246
                   "test_23" => "test_value_23",
247
                   "test_24" => "test_value_24",
248
                  }}
249
    repo.merge_extra_info(h3)
250
    assert_equal (h = {"test_11" => "test_value_11"}),
251
                 repo.extra_info["test_1"]
252
    assert_nil repo.extra_info["test_2"]["test_21"]
253
    assert_equal "test_value_23",
254
                 repo.extra_info["test_2"]["test_23"]
255
  end
256
end