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 / 25 / 25cdcad944ee39e6a9c2a56e5a525014ecebc7bc.svn-base @ 1297:0a574315af3e

History | View | Annotate | Download (18.7 KB)

1 1296:038ba2d95de8 Chris
# Redmine - project management software
2
# Copyright (C) 2006-2012  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 RepositoriesMercurialControllerTest < ActionController::TestCase
21
  tests RepositoriesController
22
23
  fixtures :projects, :users, :roles, :members, :member_roles,
24
           :repositories, :enabled_modules
25
26
  REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s
27
  CHAR_1_HEX = "\xc3\x9c"
28
  PRJ_ID     = 3
29
  NUM_REV    = 32
30
31
  ruby19_non_utf8_pass =
32
     (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8')
33
34
  def setup
35
    User.current = nil
36
    @project    = Project.find(PRJ_ID)
37
    @repository = Repository::Mercurial.create(
38
                      :project => @project,
39
                      :url     => REPOSITORY_PATH,
40
                      :path_encoding => 'ISO-8859-1'
41
                      )
42
    assert @repository
43
    @diff_c_support = true
44
    @char_1        = CHAR_1_HEX.dup
45
    @tag_char_1    = "tag-#{CHAR_1_HEX}-00"
46
    @branch_char_0 = "branch-#{CHAR_1_HEX}-00"
47
    @branch_char_1 = "branch-#{CHAR_1_HEX}-01"
48
    if @char_1.respond_to?(:force_encoding)
49
      @char_1.force_encoding('UTF-8')
50
      @tag_char_1.force_encoding('UTF-8')
51
      @branch_char_0.force_encoding('UTF-8')
52
      @branch_char_1.force_encoding('UTF-8')
53
    end
54
  end
55
56
  if ruby19_non_utf8_pass
57
    puts "TODO: Mercurial functional test fails in Ruby 1.9 " +
58
         "and Encoding.default_external is not UTF-8. " +
59
         "Current value is '#{Encoding.default_external.to_s}'"
60
    def test_fake; assert true end
61
  elsif File.directory?(REPOSITORY_PATH)
62
63
    def test_get_new
64
      @request.session[:user_id] = 1
65
      @project.repository.destroy
66
      get :new, :project_id => 'subproject1', :repository_scm => 'Mercurial'
67
      assert_response :success
68
      assert_template 'new'
69
      assert_kind_of Repository::Mercurial, assigns(:repository)
70
      assert assigns(:repository).new_record?
71
    end
72
73
    def test_show_root
74
      assert_equal 0, @repository.changesets.count
75
      @repository.fetch_changesets
76
      @project.reload
77
      assert_equal NUM_REV, @repository.changesets.count
78
      get :show, :id => PRJ_ID
79
      assert_response :success
80
      assert_template 'show'
81
      assert_not_nil assigns(:entries)
82
      assert_equal 4, assigns(:entries).size
83
      assert assigns(:entries).detect {|e| e.name == 'images'  && e.kind == 'dir'}
84
      assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'}
85
      assert assigns(:entries).detect {|e| e.name == 'README'  && e.kind == 'file'}
86
      assert_not_nil assigns(:changesets)
87
      assert assigns(:changesets).size > 0
88
    end
89
90
    def test_show_directory
91
      assert_equal 0, @repository.changesets.count
92
      @repository.fetch_changesets
93
      @project.reload
94
      assert_equal NUM_REV, @repository.changesets.count
95
      get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param]
96
      assert_response :success
97
      assert_template 'show'
98
      assert_not_nil assigns(:entries)
99
      assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name)
100
      entry = assigns(:entries).detect {|e| e.name == 'edit.png'}
101
      assert_not_nil entry
102
      assert_equal 'file', entry.kind
103
      assert_equal 'images/edit.png', entry.path
104
      assert_not_nil assigns(:changesets)
105
      assert assigns(:changesets).size > 0
106
    end
107
108
    def test_show_at_given_revision
109
      assert_equal 0, @repository.changesets.count
110
      @repository.fetch_changesets
111
      @project.reload
112
      assert_equal NUM_REV, @repository.changesets.count
113
      [0, '0', '0885933ad4f6'].each do |r1|
114
        get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param],
115
            :rev => r1
116
        assert_response :success
117
        assert_template 'show'
118
        assert_not_nil assigns(:entries)
119
        assert_equal ['delete.png'], assigns(:entries).collect(&:name)
120
        assert_not_nil assigns(:changesets)
121
        assert assigns(:changesets).size > 0
122
      end
123
    end
124
125
    def test_show_directory_sql_escape_percent
126
      assert_equal 0, @repository.changesets.count
127
      @repository.fetch_changesets
128
      @project.reload
129
      assert_equal NUM_REV, @repository.changesets.count
130
      [13, '13', '3a330eb32958'].each do |r1|
131
        get :show, :id => PRJ_ID,
132
            :path => repository_path_hash(['sql_escape', 'percent%dir'])[:param],
133
            :rev => r1
134
        assert_response :success
135
        assert_template 'show'
136
137
        assert_not_nil assigns(:entries)
138
        assert_equal ['percent%file1.txt', 'percentfile1.txt'],
139
                     assigns(:entries).collect(&:name)
140
        changesets = assigns(:changesets)
141
        assert_not_nil changesets
142
        assert assigns(:changesets).size > 0
143
        assert_equal %w(13 11 10 9), changesets.collect(&:revision)
144
      end
145
    end
146
147
    def test_show_directory_latin_1_path
148
      assert_equal 0, @repository.changesets.count
149
      @repository.fetch_changesets
150
      @project.reload
151
      assert_equal NUM_REV, @repository.changesets.count
152
      [21, '21', 'adf805632193'].each do |r1|
153
        get :show, :id => PRJ_ID,
154
            :path => repository_path_hash(['latin-1-dir'])[:param],
155
            :rev => r1
156
        assert_response :success
157
        assert_template 'show'
158
159
        assert_not_nil assigns(:entries)
160
        assert_equal ["make-latin-1-file.rb",
161
                      "test-#{@char_1}-1.txt",
162
                      "test-#{@char_1}-2.txt",
163
                      "test-#{@char_1}.txt"], assigns(:entries).collect(&:name)
164
        changesets = assigns(:changesets)
165
        assert_not_nil changesets
166
        assert_equal %w(21 20 19 18 17), changesets.collect(&:revision)
167
      end
168
    end
169
170
    def show_should_show_branch_selection_form
171
      @repository.fetch_changesets
172
      @project.reload
173
      get :show, :id => PRJ_ID
174
      assert_tag 'form', :attributes => {:id => 'revision_selector', :action => '/projects/subproject1/repository/show'}
175
      assert_tag 'select', :attributes => {:name => 'branch'},
176
        :child => {:tag => 'option', :attributes => {:value => 'test-branch-01'}},
177
        :parent => {:tag => 'form', :attributes => {:id => 'revision_selector'}}
178
    end
179
180
    def test_show_branch
181
      assert_equal 0, @repository.changesets.count
182
      @repository.fetch_changesets
183
      @project.reload
184
      assert_equal NUM_REV, @repository.changesets.count
185
       [
186
          'default',
187
          @branch_char_1,
188
          'branch (1)[2]&,%.-3_4',
189
          @branch_char_0,
190
          'test_branch.latin-1',
191
          'test-branch-00',
192
      ].each do |bra|
193
        get :show, :id => PRJ_ID, :rev => bra
194
        assert_response :success
195
        assert_template 'show'
196
        assert_not_nil assigns(:entries)
197
        assert assigns(:entries).size > 0
198
        assert_not_nil assigns(:changesets)
199
        assert assigns(:changesets).size > 0
200
      end
201
    end
202
203
    def test_show_tag
204
      assert_equal 0, @repository.changesets.count
205
      @repository.fetch_changesets
206
      @project.reload
207
      assert_equal NUM_REV, @repository.changesets.count
208
       [
209
        @tag_char_1,
210
        'tag_test.00',
211
        'tag-init-revision'
212
      ].each do |tag|
213
        get :show, :id => PRJ_ID, :rev => tag
214
        assert_response :success
215
        assert_template 'show'
216
        assert_not_nil assigns(:entries)
217
        assert assigns(:entries).size > 0
218
        assert_not_nil assigns(:changesets)
219
        assert assigns(:changesets).size > 0
220
      end
221
    end
222
223
    def test_changes
224
      get :changes, :id => PRJ_ID,
225
          :path => repository_path_hash(['images', 'edit.png'])[:param]
226
      assert_response :success
227
      assert_template 'changes'
228
      assert_tag :tag => 'h2', :content => 'edit.png'
229
    end
230
231
    def test_entry_show
232
      get :entry, :id => PRJ_ID,
233
          :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
234
      assert_response :success
235
      assert_template 'entry'
236
      # Line 10
237
      assert_tag :tag => 'th',
238
                 :content => '10',
239
                 :attributes => { :class => 'line-num' },
240
                 :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ }
241
    end
242
243
    def test_entry_show_latin_1_path
244
      [21, '21', 'adf805632193'].each do |r1|
245
        get :entry, :id => PRJ_ID,
246
            :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param],
247
            :rev => r1
248
        assert_response :success
249
        assert_template 'entry'
250
        assert_tag :tag => 'th',
251
                 :content => '1',
252
                 :attributes => { :class => 'line-num' },
253
                 :sibling => { :tag => 'td',
254
                               :content => /Mercurial is a distributed version control system/ }
255
      end
256
    end
257
258
    def test_entry_show_latin_1_contents
259
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
260
        [27, '27', '7bbf4c738e71'].each do |r1|
261
          get :entry, :id => PRJ_ID,
262
              :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param],
263
              :rev => r1
264
          assert_response :success
265
          assert_template 'entry'
266
          assert_tag :tag => 'th',
267
                 :content => '1',
268
                 :attributes => { :class => 'line-num' },
269
                 :sibling => { :tag => 'td',
270
                               :content => /test-#{@char_1}.txt/ }
271
        end
272
      end
273
    end
274
275
    def test_entry_download
276
      get :entry, :id => PRJ_ID,
277
          :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
278
          :format => 'raw'
279
      assert_response :success
280
      # File content
281
      assert @response.body.include?('WITHOUT ANY WARRANTY')
282
    end
283
284
    def test_entry_binary_force_download
285
      get :entry, :id => PRJ_ID, :rev => 1,
286
          :path => repository_path_hash(['images', 'edit.png'])[:param]
287
      assert_response :success
288
      assert_equal 'image/png', @response.content_type
289
    end
290
291
    def test_directory_entry
292
      get :entry, :id => PRJ_ID,
293
          :path => repository_path_hash(['sources'])[:param]
294
      assert_response :success
295
      assert_template 'show'
296
      assert_not_nil assigns(:entry)
297
      assert_equal 'sources', assigns(:entry).name
298
    end
299
300
    def test_diff
301
      assert_equal 0, @repository.changesets.count
302
      @repository.fetch_changesets
303
      @project.reload
304
      assert_equal NUM_REV, @repository.changesets.count
305
      [4, '4', 'def6d2f1254a'].each do |r1|
306
        # Full diff of changeset 4
307
        ['inline', 'sbs'].each do |dt|
308
          get :diff, :id => PRJ_ID, :rev => r1, :type => dt
309
          assert_response :success
310
          assert_template 'diff'
311
          if @diff_c_support
312
            # Line 22 removed
313
            assert_tag :tag => 'th',
314
                       :content => '22',
315
                       :sibling => { :tag => 'td',
316
                                     :attributes => { :class => /diff_out/ },
317
                                     :content => /def remove/ }
318
            assert_tag :tag => 'h2', :content => /4:def6d2f1254a/
319
          end
320
        end
321
      end
322
    end
323
324
    def test_diff_two_revs
325
      assert_equal 0, @repository.changesets.count
326
      @repository.fetch_changesets
327
      @project.reload
328
      assert_equal NUM_REV, @repository.changesets.count
329
      [2, '400bb8672109', '400', 400].each do |r1|
330
        [4, 'def6d2f1254a'].each do |r2|
331
          ['inline', 'sbs'].each do |dt|
332
            get :diff,
333
                :id     => PRJ_ID,
334
                :rev    => r1,
335
                :rev_to => r2,
336
                :type => dt
337
            assert_response :success
338
            assert_template 'diff'
339
            diff = assigns(:diff)
340
            assert_not_nil diff
341
            assert_tag :tag => 'h2',
342
                       :content => /4:def6d2f1254a 2:400bb8672109/
343
          end
344
        end
345
      end
346
    end
347
348
    def test_diff_latin_1_path
349
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
350
        [21, 'adf805632193'].each do |r1|
351
          ['inline', 'sbs'].each do |dt|
352
            get :diff, :id => PRJ_ID, :rev => r1, :type => dt
353
            assert_response :success
354
            assert_template 'diff'
355
            assert_tag :tag => 'thead',
356
                       :descendant => {
357
                         :tag => 'th',
358
                         :attributes => { :class => 'filename' } ,
359
                         :content => /latin-1-dir\/test-#{@char_1}-2.txt/ ,
360
                        },
361
                       :sibling => {
362
                         :tag => 'tbody',
363
                         :descendant => {
364
                            :tag => 'td',
365
                            :attributes => { :class => /diff_in/ },
366
                            :content => /It is written in Python/
367
                         }
368
                       }
369
          end
370
        end
371
      end
372
    end
373
374
    def test_diff_should_show_modified_filenames
375
      get :diff, :id => PRJ_ID, :rev => '400bb8672109', :type => 'inline'
376
      assert_response :success
377
      assert_template 'diff'
378
      assert_select 'th.filename', :text => 'sources/watchers_controller.rb'
379
    end
380
381
    def test_diff_should_show_deleted_filenames
382
      get :diff, :id => PRJ_ID, :rev => 'b3a615152df8', :type => 'inline'
383
      assert_response :success
384
      assert_template 'diff'
385
      assert_select 'th.filename', :text => 'sources/welcome_controller.rb'
386
    end
387
388
    def test_annotate
389
      get :annotate, :id => PRJ_ID,
390
          :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
391
      assert_response :success
392
      assert_template 'annotate'
393
394
      # Line 22, revision 4:def6d2f1254a
395
      assert_select 'tr' do
396
        assert_select 'th.line-num', :text => '22'
397
        assert_select 'td.revision', :text => '4:def6d2f1254a'
398
        assert_select 'td.author', :text => 'jsmith'
399
        assert_select 'td', :text => /remove_watcher/
400
      end
401
    end
402
403
    def test_annotate_not_in_tip
404
      assert_equal 0, @repository.changesets.count
405
      @repository.fetch_changesets
406
      @project.reload
407
      assert_equal NUM_REV, @repository.changesets.count
408
      get :annotate, :id => PRJ_ID,
409
          :path => repository_path_hash(['sources', 'welcome_controller.rb'])[:param]
410
      assert_response 404
411
      assert_error_tag :content => /was not found/
412
    end
413
414
    def test_annotate_at_given_revision
415
      assert_equal 0, @repository.changesets.count
416
      @repository.fetch_changesets
417
      @project.reload
418
      assert_equal NUM_REV, @repository.changesets.count
419
      [2, '400bb8672109', '400', 400].each do |r1|
420
        get :annotate, :id => PRJ_ID, :rev => r1,
421
            :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
422
        assert_response :success
423
        assert_template 'annotate'
424
        assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/
425
      end
426
    end
427
428
    def test_annotate_latin_1_path
429
      [21, '21', 'adf805632193'].each do |r1|
430
        get :annotate, :id => PRJ_ID,
431
            :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param],
432
            :rev => r1
433
        assert_response :success
434
        assert_template 'annotate'
435
        assert_tag :tag => 'th',
436
                 :content => '1',
437
                 :attributes => { :class => 'line-num' },
438
                 :sibling =>
439
                       {
440
                         :tag => 'td',
441
                         :attributes => { :class => 'revision' },
442
                         :child => { :tag => 'a', :content => '20:709858aafd1b' }
443
                       }
444
        assert_tag :tag => 'th',
445
                 :content => '1',
446
                 :attributes => { :class => 'line-num' },
447
                 :sibling =>
448
                       {
449
                          :tag     => 'td'    ,
450
                          :content => 'jsmith' ,
451
                          :attributes => { :class   => 'author' },
452
                        }
453
        assert_tag :tag => 'th',
454
                 :content => '1',
455
                 :attributes => { :class => 'line-num' },
456
                 :sibling => { :tag => 'td',
457
                               :content => /Mercurial is a distributed version control system/ }
458
459
      end
460
    end
461
462
    def test_annotate_latin_1_contents
463
      with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
464
        [27, '7bbf4c738e71'].each do |r1|
465
          get :annotate, :id => PRJ_ID,
466
              :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param],
467
              :rev => r1
468
          assert_tag :tag => 'th',
469
                     :content => '1',
470
                     :attributes => { :class => 'line-num' },
471
                     :sibling => { :tag => 'td',
472
                                   :content => /test-#{@char_1}.txt/ }
473
        end
474
      end
475
    end
476
477
    def test_empty_revision
478
      assert_equal 0, @repository.changesets.count
479
      @repository.fetch_changesets
480
      @project.reload
481
      assert_equal NUM_REV, @repository.changesets.count
482
      ['', ' ', nil].each do |r|
483
        get :revision, :id => PRJ_ID, :rev => r
484
        assert_response 404
485
        assert_error_tag :content => /was not found/
486
      end
487
    end
488
489
    def test_destroy_valid_repository
490
      @request.session[:user_id] = 1 # admin
491
      assert_equal 0, @repository.changesets.count
492
      @repository.fetch_changesets
493
      assert_equal NUM_REV, @repository.changesets.count
494
495
      assert_difference 'Repository.count', -1 do
496
        delete :destroy, :id => @repository.id
497
      end
498
      assert_response 302
499
      @project.reload
500
      assert_nil @project.repository
501
    end
502
503
    def test_destroy_invalid_repository
504
      @request.session[:user_id] = 1 # admin
505
      @project.repository.destroy
506
      @repository = Repository::Mercurial.create!(
507
                      :project => Project.find(PRJ_ID),
508
                      :url     => "/invalid",
509
                      :path_encoding => 'ISO-8859-1'
510
                      )
511
      @repository.fetch_changesets
512
      assert_equal 0, @repository.changesets.count
513
514
      assert_difference 'Repository.count', -1 do
515
        delete :destroy, :id => @repository.id
516
      end
517
      assert_response 302
518
      @project.reload
519
      assert_nil @project.repository
520
    end
521
  else
522
    puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!"
523
    def test_fake; assert true end
524
  end
525
end