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 / test / functional / .svn / text-base / repositories_mercurial_controller_test.rb.svn-base @ 441:cbce1fd3b1b7

History | View | Annotate | Download (14.8 KB)

1 441:cbce1fd3b1b7 Chris
# Redmine - project management software
2
# Copyright (C) 2006-2011  Jean-Philippe Lang
3 0:513646585e45 Chris
#
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 441:cbce1fd3b1b7 Chris
#
9 0:513646585e45 Chris
# 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 441:cbce1fd3b1b7 Chris
#
14 0:513646585e45 Chris
# 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 119:8661b858af72 Chris
require File.expand_path('../../test_helper', __FILE__)
19 0:513646585e45 Chris
require 'repositories_controller'
20
21
# Re-raise errors caught by the controller.
22
class RepositoriesController; def rescue_action(e) raise e end; end
23
24
class RepositoriesMercurialControllerTest < ActionController::TestCase
25
  fixtures :projects, :users, :roles, :members, :member_roles, :repositories, :enabled_modules
26
27
  # No '..' in the repository path
28 441:cbce1fd3b1b7 Chris
  REPOSITORY_PATH = RAILS_ROOT.gsub(%r{config\/\.\.}, '') +
29
                       '/tmp/test/mercurial_repository'
30
  CHAR_1_HEX = "\xc3\x9c"
31
  PRJ_ID     = 3
32
33
  ruby19_non_utf8_pass =
34
     (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
35 0:513646585e45 Chris
36
  def setup
37
    @controller = RepositoriesController.new
38
    @request    = ActionController::TestRequest.new
39
    @response   = ActionController::TestResponse.new
40
    User.current = nil
41 441:cbce1fd3b1b7 Chris
    @repository = Repository::Mercurial.create(
42
                      :project => Project.find(PRJ_ID),
43
                      :url     => REPOSITORY_PATH,
44
                      :path_encoding => 'ISO-8859-1'
45
                      )
46 119:8661b858af72 Chris
    assert @repository
47 245:051f544170fe Chris
    @diff_c_support = true
48 441:cbce1fd3b1b7 Chris
    @char_1        = CHAR_1_HEX.dup
49
    @tag_char_1    = "tag-#{CHAR_1_HEX}-00"
50
    @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
51
    @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
52
    if @char_1.respond_to?(:force_encoding)
53
      @char_1.force_encoding('UTF-8')
54
      @tag_char_1.force_encoding('UTF-8')
55
      @branch_char_0.force_encoding('UTF-8')
56
      @branch_char_1.force_encoding('UTF-8')
57
    end
58 0:513646585e45 Chris
  end
59 119:8661b858af72 Chris
60 441:cbce1fd3b1b7 Chris
  if ruby19_non_utf8_pass
61
    puts "TODO: Mercurial functional test fails in Ruby 1.9 " +
62
         "and Encoding.default_external is not UTF-8. " +
63
         "Current value is '#{Encoding.default_external.to_s}'"
64
    def test_fake; assert true end
65
  elsif File.directory?(REPOSITORY_PATH)
66 0:513646585e45 Chris
    def test_show_root
67 441:cbce1fd3b1b7 Chris
      @repository.fetch_changesets
68
      @repository.reload
69
      get :show, :id => PRJ_ID
70 0:513646585e45 Chris
      assert_response :success
71
      assert_template 'show'
72
      assert_not_nil assigns(:entries)
73 119:8661b858af72 Chris
      assert_equal 4, assigns(:entries).size
74
      assert assigns(:entries).detect {|e| e.name == 'images'  && e.kind == 'dir'}
75 0:513646585e45 Chris
      assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
76 119:8661b858af72 Chris
      assert assigns(:entries).detect {|e| e.name == 'README'  && e.kind == 'file'}
77 441:cbce1fd3b1b7 Chris
      assert_not_nil assigns(:changesets)
78
      assigns(:changesets).size > 0
79 0:513646585e45 Chris
    end
80 128:07fa8a8b56a8 Chris
81 0:513646585e45 Chris
    def test_show_directory
82 441:cbce1fd3b1b7 Chris
      @repository.fetch_changesets
83
      @repository.reload
84
      get :show, :id => PRJ_ID, :path => ['images']
85 0:513646585e45 Chris
      assert_response :success
86
      assert_template 'show'
87
      assert_not_nil assigns(:entries)
88
      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
89
      entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
90
      assert_not_nil entry
91
      assert_equal 'file', entry.kind
92
      assert_equal 'images/edit.png', entry.path
93 441:cbce1fd3b1b7 Chris
      assert_not_nil assigns(:changesets)
94
      assigns(:changesets).size > 0
95 0:513646585e45 Chris
    end
96 119:8661b858af72 Chris
97 0:513646585e45 Chris
    def test_show_at_given_revision
98 441:cbce1fd3b1b7 Chris
      @repository.fetch_changesets
99
      @repository.reload
100 119:8661b858af72 Chris
      [0, '0', '0885933ad4f6'].each do |r1|
101 441:cbce1fd3b1b7 Chris
        get :show, :id => PRJ_ID, :path => ['images'], :rev => r1
102 119:8661b858af72 Chris
        assert_response :success
103
        assert_template 'show'
104
        assert_not_nil assigns(:entries)
105
        assert_equal ['delete.png'], assigns(:entries).collect(&:name)
106 441:cbce1fd3b1b7 Chris
        assert_not_nil assigns(:changesets)
107
        assigns(:changesets).size > 0
108 119:8661b858af72 Chris
      end
109 0:513646585e45 Chris
    end
110 119:8661b858af72 Chris
111
    def test_show_directory_sql_escape_percent
112 441:cbce1fd3b1b7 Chris
      @repository.fetch_changesets
113
      @repository.reload
114 119:8661b858af72 Chris
      [13, '13', '3a330eb32958'].each do |r1|
115 441:cbce1fd3b1b7 Chris
        get :show, :id => PRJ_ID, :path => ['sql_escape', 'percent%dir'],
116
            :rev => r1
117 119:8661b858af72 Chris
        assert_response :success
118
        assert_template 'show'
119
120
        assert_not_nil assigns(:entries)
121 441:cbce1fd3b1b7 Chris
        assert_equal ['percent%file1.txt', 'percentfile1.txt'],
122
                     assigns(:entries).collect(&:name)
123 119:8661b858af72 Chris
        changesets = assigns(:changesets)
124 441:cbce1fd3b1b7 Chris
        assert_not_nil changesets
125
        assigns(:changesets).size > 0
126
        assert_equal %w(13 11 10 9), changesets.collect(&:revision)
127
      end
128
    end
129 119:8661b858af72 Chris
130 441:cbce1fd3b1b7 Chris
    def test_show_directory_latin_1_path
131
      @repository.fetch_changesets
132
      @repository.reload
133
      [21, '21', 'adf805632193'].each do |r1|
134
        get :show, :id => PRJ_ID, :path => ['latin-1-dir'], :rev => r1
135
        assert_response :success
136
        assert_template 'show'
137
138
        assert_not_nil assigns(:entries)
139
        assert_equal ["make-latin-1-file.rb",
140
                      "test-#{@char_1}-1.txt",
141
                      "test-#{@char_1}-2.txt",
142
                      "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
143
        changesets = assigns(:changesets)
144
        assert_not_nil changesets
145
        assert_equal %w(21 20 19 18 17), changesets.collect(&:revision)
146
      end
147
    end
148
149
    def test_show_branch
150
      @repository.fetch_changesets
151
      @repository.reload
152
       [
153
          'default',
154
          @branch_char_1,
155
          'branch (1)[2]&,%.-3_4',
156
          @branch_char_0,
157
          'test_branch.latin-1',
158
          'test-branch-00',
159
      ].each do |bra|
160
        get :show, :id => PRJ_ID, :rev => bra
161
        assert_response :success
162
        assert_template 'show'
163
        assert_not_nil assigns(:entries)
164
        assert assigns(:entries).size > 0
165
        assert_not_nil assigns(:changesets)
166
        assigns(:changesets).size > 0
167
      end
168
    end
169
170
    def test_show_tag
171
      @repository.fetch_changesets
172
      @repository.reload
173
       [
174
        @tag_char_1,
175
        'tag_test.00',
176
        'tag-init-revision'
177
      ].each do |tag|
178
        get :show, :id => PRJ_ID, :rev => tag
179
        assert_response :success
180
        assert_template 'show'
181
        assert_not_nil assigns(:entries)
182
        assert assigns(:entries).size > 0
183
        assert_not_nil assigns(:changesets)
184
        assigns(:changesets).size > 0
185 119:8661b858af72 Chris
      end
186
    end
187
188 0:513646585e45 Chris
    def test_changes
189 441:cbce1fd3b1b7 Chris
      get :changes, :id => PRJ_ID, :path => ['images', 'edit.png']
190 0:513646585e45 Chris
      assert_response :success
191
      assert_template 'changes'
192
      assert_tag :tag => 'h2', :content => 'edit.png'
193
    end
194 441:cbce1fd3b1b7 Chris
195 0:513646585e45 Chris
    def test_entry_show
196 441:cbce1fd3b1b7 Chris
      get :entry, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
197 0:513646585e45 Chris
      assert_response :success
198
      assert_template 'entry'
199 119:8661b858af72 Chris
      # Line 10
200 0:513646585e45 Chris
      assert_tag :tag => 'th',
201 119:8661b858af72 Chris
                 :content => '10',
202
                 :attributes => { :class => 'line-num' },
203 0:513646585e45 Chris
                 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
204
    end
205 441:cbce1fd3b1b7 Chris
206
    def test_entry_show_latin_1_path
207
      [21, '21', 'adf805632193'].each do |r1|
208
        get :entry, :id => PRJ_ID,
209
            :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
210
        assert_response :success
211
        assert_template 'entry'
212
        assert_tag :tag => 'th',
213
                 :content => '1',
214
                 :attributes => { :class => 'line-num' },
215
                 :sibling => { :tag => 'td',
216
                               :content => /Mercurial is a distributed version control system/ }
217
      end
218
    end
219
220
    def test_entry_show_latin_1_contents
221
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
222
        [27, '27', '7bbf4c738e71'].each do |r1|
223
          get :entry, :id => PRJ_ID,
224
              :path => ['latin-1-dir', "test-#{@char_1}.txt"], :rev => r1
225
          assert_response :success
226
          assert_template 'entry'
227
          assert_tag :tag => 'th',
228
                 :content => '1',
229
                 :attributes => { :class => 'line-num' },
230
                 :sibling => { :tag => 'td',
231
                               :content => /test-#{@char_1}.txt/ }
232
        end
233
      end
234
    end
235
236 0:513646585e45 Chris
    def test_entry_download
237 441:cbce1fd3b1b7 Chris
      get :entry, :id => PRJ_ID,
238
          :path => ['sources', 'watchers_controller.rb'], :format => 'raw'
239 0:513646585e45 Chris
      assert_response :success
240
      # File content
241
      assert @response.body.include?('WITHOUT ANY WARRANTY')
242
    end
243
244 441:cbce1fd3b1b7 Chris
    def test_entry_binary_force_download
245
      get :entry, :id => PRJ_ID, :rev => 1, :path => ['images', 'edit.png']
246
      assert_response :success
247
      assert_equal 'image/png', @response.content_type
248
    end
249
250 0:513646585e45 Chris
    def test_directory_entry
251 441:cbce1fd3b1b7 Chris
      get :entry, :id => PRJ_ID, :path => ['sources']
252 0:513646585e45 Chris
      assert_response :success
253
      assert_template 'show'
254
      assert_not_nil assigns(:entry)
255
      assert_equal 'sources', assigns(:entry).name
256
    end
257 441:cbce1fd3b1b7 Chris
258 0:513646585e45 Chris
    def test_diff
259 119:8661b858af72 Chris
      @repository.fetch_changesets
260
      @repository.reload
261
      [4, '4', 'def6d2f1254a'].each do |r1|
262
        # Full diff of changeset 4
263 441:cbce1fd3b1b7 Chris
        get :diff, :id => PRJ_ID, :rev => r1
264 119:8661b858af72 Chris
        assert_response :success
265
        assert_template 'diff'
266 245:051f544170fe Chris
        if @diff_c_support
267 119:8661b858af72 Chris
          # Line 22 removed
268
          assert_tag :tag => 'th',
269
                     :content => '22',
270 441:cbce1fd3b1b7 Chris
                     :sibling => { :tag => 'td',
271 119:8661b858af72 Chris
                                   :attributes => { :class => /diff_out/ },
272
                                   :content => /def remove/ }
273
          assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
274
        end
275
      end
276 0:513646585e45 Chris
    end
277 119:8661b858af72 Chris
278
    def test_diff_two_revs
279
      @repository.fetch_changesets
280
      @repository.reload
281
      [2, '400bb8672109', '400', 400].each do |r1|
282
        [4, 'def6d2f1254a'].each do |r2|
283 441:cbce1fd3b1b7 Chris
          get :diff, :id => PRJ_ID, :rev    => r1,
284
                                    :rev_to => r2
285 119:8661b858af72 Chris
          assert_response :success
286
          assert_template 'diff'
287
288
          diff = assigns(:diff)
289
          assert_not_nil diff
290
          assert_tag :tag => 'h2', :content => /4:def6d2f1254a 2:400bb8672109/
291
        end
292
      end
293
    end
294
295 441:cbce1fd3b1b7 Chris
    def test_diff_latin_1_path
296
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
297
        [21, 'adf805632193'].each do |r1|
298
          get :diff, :id => PRJ_ID, :rev => r1
299
          assert_response :success
300
          assert_template 'diff'
301
          assert_tag :tag => 'thead',
302
                     :descendant => {
303
                       :tag => 'th',
304
                       :attributes => { :class => 'filename' } ,
305
                       :content => /latin-1-dir\/test-#{@char_1}-2.txt/ ,
306
                      },
307
                     :sibling => {
308
                       :tag => 'tbody',
309
                       :descendant => {
310
                          :tag => 'td',
311
                          :attributes => { :class => /diff_in/ },
312
                          :content => /It is written in Python/
313
                       }
314
                     }
315
        end
316
      end
317
    end
318
319 0:513646585e45 Chris
    def test_annotate
320 441:cbce1fd3b1b7 Chris
      get :annotate, :id => PRJ_ID, :path => ['sources', 'watchers_controller.rb']
321 0:513646585e45 Chris
      assert_response :success
322
      assert_template 'annotate'
323 119:8661b858af72 Chris
      # Line 23, revision 4:def6d2f1254a
324
      assert_tag :tag => 'th',
325
                 :content => '23',
326
                 :attributes => { :class => 'line-num' },
327
                 :sibling =>
328
                       {
329
                         :tag => 'td',
330
                         :attributes => { :class => 'revision' },
331
                         :child => { :tag => 'a', :content => '4:def6d2f1254a' }
332
                       }
333
      assert_tag :tag => 'th',
334
                 :content => '23',
335
                 :attributes => { :class => 'line-num' },
336
                 :sibling =>
337
                       {
338
                          :tag     => 'td'    ,
339
                          :content => 'jsmith' ,
340
                          :attributes => { :class   => 'author' },
341
                        }
342
      assert_tag :tag => 'th',
343
                 :content => '23',
344
                 :attributes => { :class => 'line-num' },
345 0:513646585e45 Chris
                 :sibling => { :tag => 'td', :content => /watcher =/ }
346
    end
347 119:8661b858af72 Chris
348 210:0579821a129a Chris
    def test_annotate_at_given_revision
349
      @repository.fetch_changesets
350
      @repository.reload
351
      [2, '400bb8672109', '400', 400].each do |r1|
352 441:cbce1fd3b1b7 Chris
        get :annotate, :id => PRJ_ID, :rev => r1,
353
            :path => ['sources', 'watchers_controller.rb']
354 210:0579821a129a Chris
        assert_response :success
355
        assert_template 'annotate'
356
        assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
357
      end
358
    end
359
360 441:cbce1fd3b1b7 Chris
    def test_annotate_latin_1_path
361
      [21, '21', 'adf805632193'].each do |r1|
362
        get :annotate, :id => PRJ_ID,
363
            :path => ['latin-1-dir', "test-#{@char_1}-2.txt"], :rev => r1
364
        assert_response :success
365
        assert_template 'annotate'
366
        assert_tag :tag => 'th',
367
                 :content => '1',
368
                 :attributes => { :class => 'line-num' },
369
                 :sibling =>
370
                       {
371
                         :tag => 'td',
372
                         :attributes => { :class => 'revision' },
373
                         :child => { :tag => 'a', :content => '20:709858aafd1b' }
374
                       }
375
        assert_tag :tag => 'th',
376
                 :content => '1',
377
                 :attributes => { :class => 'line-num' },
378
                 :sibling =>
379
                       {
380
                          :tag     => 'td'    ,
381
                          :content => 'jsmith' ,
382
                          :attributes => { :class   => 'author' },
383
                        }
384
        assert_tag :tag => 'th',
385
                 :content => '1',
386
                 :attributes => { :class => 'line-num' },
387
                 :sibling => { :tag => 'td',
388
                               :content => /Mercurial is a distributed version control system/ }
389
390
      end
391
    end
392
393
    def test_annotate_latin_1_contents
394
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
395
        [27, '7bbf4c738e71'].each do |r1|
396
          get :annotate, :id => PRJ_ID,
397
              :path => ['latin-1-dir', "test-#{@char_1}.txt"], :rev => r1
398
          assert_tag :tag => 'th',
399
                     :content => '1',
400
                     :attributes => { :class => 'line-num' },
401
                     :sibling => { :tag => 'td',
402
                                   :content => /test-#{@char_1}.txt/ }
403
        end
404
      end
405
    end
406
407 119:8661b858af72 Chris
    def test_empty_revision
408
      @repository.fetch_changesets
409
      @repository.reload
410
      ['', ' ', nil].each do |r|
411 441:cbce1fd3b1b7 Chris
        get :revision, :id => PRJ_ID, :rev => r
412 128:07fa8a8b56a8 Chris
        assert_response 404
413 119:8661b858af72 Chris
        assert_error_tag :content => /was not found/
414
      end
415
    end
416 0:513646585e45 Chris
  else
417
    puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
418
    def test_fake; assert true end
419
  end
420
end