diff test/functional/repositories_subversion_controller_test.rb @ 1115:433d4f72a19b redmine-2.2

Update to Redmine SVN revision 11137 on 2.2-stable branch
author Chris Cannam
date Mon, 07 Jan 2013 12:01:42 +0000
parents cbb26bc654de
children 622f24f53b42 261b3d9a4903
line wrap: on
line diff
--- a/test/functional/repositories_subversion_controller_test.rb	Wed Jun 27 14:54:18 2012 +0100
+++ b/test/functional/repositories_subversion_controller_test.rb	Mon Jan 07 12:01:42 2013 +0000
@@ -1,5 +1,5 @@
 # Redmine - project management software
-# Copyright (C) 2006-2011  Jean-Philippe Lang
+# Copyright (C) 2006-2012  Jean-Philippe Lang
 #
 # This program is free software; you can redistribute it and/or
 # modify it under the terms of the GNU General Public License
@@ -16,12 +16,10 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 require File.expand_path('../../test_helper', __FILE__)
-require 'repositories_controller'
-
-# Re-raise errors caught by the controller.
-class RepositoriesController; def rescue_action(e) raise e end; end
 
 class RepositoriesSubversionControllerTest < ActionController::TestCase
+  tests RepositoriesController
+
   fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules,
            :repositories, :issues, :issue_statuses, :changesets, :changes,
            :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
@@ -30,9 +28,6 @@
   NUM_REV = 11
 
   def setup
-    @controller = RepositoriesController.new
-    @request    = ActionController::TestRequest.new
-    @response   = ActionController::TestResponse.new
     Setting.default_language = 'en'
     User.current = nil
 
@@ -43,6 +38,16 @@
   end
 
   if repository_configured?('subversion')
+    def test_new
+      @request.session[:user_id] = 1
+      @project.repository.destroy
+      get :new, :project_id => 'subproject1', :repository_scm => 'Subversion'
+      assert_response :success
+      assert_template 'new'
+      assert_kind_of Repository::Subversion, assigns(:repository)
+      assert assigns(:repository).new_record?
+    end
+
     def test_show
       assert_equal 0, @repository.changesets.count
       @repository.fetch_changesets
@@ -53,19 +58,31 @@
       assert_template 'show'
       assert_not_nil assigns(:entries)
       assert_not_nil assigns(:changesets)
+
+      entry = assigns(:entries).detect {|e| e.name == 'subversion_test'}
+      assert_not_nil entry
+      assert_equal 'dir', entry.kind
+      assert_select 'tr.dir a[href=/projects/subproject1/repository/show/subversion_test]'
+
+      assert_tag 'input', :attributes => {:name => 'rev'}
+      assert_tag 'a', :content => 'Statistics'
+      assert_tag 'a', :content => 'Atom'
+      assert_tag :tag => 'a',
+                 :attributes => {:href => '/projects/subproject1/repository'},
+                 :content => 'root'
     end
 
-    def test_browse_root
-      assert_equal 0, @repository.changesets.count
-      @repository.fetch_changesets
-      @project.reload
-      assert_equal NUM_REV, @repository.changesets.count
-      get :show, :id => PRJ_ID
+    def test_show_non_default
+      Repository::Subversion.create(:project => @project,
+        :url => self.class.subversion_repository_url,
+        :is_default => false, :identifier => 'svn')
+
+      get :show, :id => PRJ_ID, :repository_id => 'svn'
       assert_response :success
       assert_template 'show'
-      assert_not_nil assigns(:entries)
-      entry = assigns(:entries).detect {|e| e.name == 'subversion_test'}
-      assert_equal 'dir', entry.kind
+      assert_select 'tr.dir a[href=/projects/subproject1/repository/svn/show/subversion_test]'
+      # Repository menu should link to the main repo
+      assert_select '#main-menu a[href=/projects/subproject1/repository]'
     end
 
     def test_browse_directory
@@ -73,7 +90,7 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :show, :id => PRJ_ID, :path => ['subversion_test']
+      get :show, :id => PRJ_ID, :path => repository_path_hash(['subversion_test'])[:param]
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -93,7 +110,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :show, :id => PRJ_ID, :path => ['subversion_test'], :rev => 4
+      get :show, :id => PRJ_ID, :path => repository_path_hash(['subversion_test'])[:param],
+          :rev => 4
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entries)
@@ -106,7 +124,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder', 'helloworld.rb' ]
+      get :changes, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'folder', 'helloworld.rb'])[:param]
       assert_response :success
       assert_template 'changes'
 
@@ -130,7 +149,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :changes, :id => PRJ_ID, :path => ['subversion_test', 'folder' ]
+      get :changes, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'folder'])[:param]
       assert_response :success
       assert_template 'changes'
 
@@ -144,7 +164,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
+      get :entry, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
       assert_response :success
       assert_template 'entry'
     end
@@ -156,20 +177,29 @@
       assert_equal NUM_REV, @repository.changesets.count
       # no files in the test repo is larger than 1KB...
       with_settings :file_max_size_displayed => 0 do
-        get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
+        get :entry, :id => PRJ_ID,
+            :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
         assert_response :success
-        assert_template ''
         assert_equal 'attachment; filename="helloworld.c"',
                      @response.headers['Content-Disposition']
       end
     end
 
+    def test_entry_should_send_images_inline
+      get :entry, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'folder', 'subfolder', 'rubylogo.gif'])[:param]
+      assert_response :success
+      assert_equal 'inline; filename="rubylogo.gif"', response.headers['Content-Disposition']
+    end
+
     def test_entry_at_given_revision
       assert_equal 0, @repository.changesets.count
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.rb'], :rev => 2
+      get :entry, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'helloworld.rb'])[:param],
+          :rev => 2
       assert_response :success
       assert_template 'entry'
       # this line was removed in r3 and file was moved in r6
@@ -182,9 +212,10 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'zzz.c']
+      get :entry, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'zzz.c'])[:param]
       assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ },
-                                :content => /The entry or revision was not found in the repository/
+                 :content => /The entry or revision was not found in the repository/
     end
 
     def test_entry_download
@@ -192,9 +223,9 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c'], :format => 'raw'
+      get :raw, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
       assert_response :success
-      assert_template ''
       assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition']
     end
 
@@ -203,7 +234,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :entry, :id => PRJ_ID, :path => ['subversion_test', 'folder']
+      get :entry, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'folder'])[:param]
       assert_response :success
       assert_template 'show'
       assert_not_nil assigns(:entry)
@@ -215,18 +247,15 @@
       get :revision, :id => 1, :rev => 2
       assert_response :success
       assert_template 'revision'
-      assert_tag :tag => 'ul',
-                 :child => { :tag => 'li',
-                             # link to the entry at rev 2
-                             :child => { :tag => 'a',
-                                         :attributes => {:href => '/projects/ecookbook/repository/revisions/2/entry/test/some/path/in/the/repo'},
-                                         :content => 'repo',
-                                         # link to partial diff
-                                         :sibling =>  { :tag => 'a',
-                                                        :attributes => { :href => '/projects/ecookbook/repository/revisions/2/diff/test/some/path/in/the/repo' }
-                                                       }
-                                        }
-                            }
+
+      assert_select 'ul' do
+        assert_select 'li' do
+          # link to the entry at rev 2
+          assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/2/entry/test/some/path/in/the/repo', :text => 'repo'
+          # link to partial diff
+          assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/2/diff/test/some/path/in/the/repo'
+        end
+      end
     end
 
     def test_invalid_revision
@@ -266,18 +295,15 @@
       get :revision, :id => 1, :rev => 2
       assert_response :success
       assert_template 'revision'
-      assert_tag :tag => 'ul',
-                 :child => { :tag => 'li',
-                             # link to the entry at rev 2
-                             :child => { :tag => 'a',
-                                         :attributes => {:href => '/projects/ecookbook/repository/revisions/2/entry/path/in/the/repo'},
-                                         :content => 'repo',
-                                         # link to partial diff
-                                         :sibling =>  { :tag => 'a',
-                                                        :attributes => { :href => '/projects/ecookbook/repository/revisions/2/diff/path/in/the/repo' }
-                                                       }
-                                        }
-                            }
+
+      assert_select 'ul' do
+        assert_select 'li' do
+          # link to the entry at rev 2
+          assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/2/entry/path/in/the/repo', :text => 'repo'
+          # link to partial diff
+          assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/2/diff/path/in/the/repo'
+        end
+      end
     end
 
     def test_revision_diff
@@ -289,11 +315,23 @@
         get :diff, :id => PRJ_ID, :rev => 3, :type => dt
         assert_response :success
         assert_template 'diff'
-        assert_tag :tag => 'h2',
-                   :content => / 3/
+        assert_select 'h2', :text => /Revision 3/
+        assert_select 'th.filename', :text => 'subversion_test/textfile.txt'
       end
     end
 
+    def test_revision_diff_raw_format
+      assert_equal 0, @repository.changesets.count
+      @repository.fetch_changesets
+      @project.reload
+      assert_equal NUM_REV, @repository.changesets.count
+
+      get :diff, :id => PRJ_ID, :rev => 3, :format => 'diff'
+      assert_response :success
+      assert_equal 'text/x-patch', @response.content_type
+      assert_equal 'Index: subversion_test/textfile.txt', @response.body.split(/\r?\n/).first
+    end
+
     def test_directory_diff
       assert_equal 0, @repository.changesets.count
       @repository.fetch_changesets
@@ -301,7 +339,8 @@
       assert_equal NUM_REV, @repository.changesets.count
       ['inline', 'sbs'].each do |dt|
         get :diff, :id => PRJ_ID, :rev => 6, :rev_to => 2,
-            :path => ['subversion_test', 'folder'], :type => dt
+            :path => repository_path_hash(['subversion_test', 'folder'])[:param],
+            :type => dt
         assert_response :success
         assert_template 'diff'
 
@@ -318,9 +357,23 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :annotate, :id => PRJ_ID, :path => ['subversion_test', 'helloworld.c']
+      get :annotate, :id => PRJ_ID,
+          :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
       assert_response :success
       assert_template 'annotate'
+
+      assert_select 'tr' do
+        assert_select 'th.line-num', :text => '1'
+        assert_select 'td.revision', :text => '4'
+        assert_select 'td.author', :text => 'jp'
+        assert_select 'td', :text => /stdio.h/
+      end
+      # Same revision
+      assert_select 'tr' do
+        assert_select 'th.line-num', :text => '2'
+        assert_select 'td.revision', :text => ''
+        assert_select 'td.author', :text => ''
+      end
     end
 
     def test_annotate_at_given_revision
@@ -328,7 +381,8 @@
       @repository.fetch_changesets
       @project.reload
       assert_equal NUM_REV, @repository.changesets.count
-      get :annotate, :id => PRJ_ID, :rev => 8, :path => ['subversion_test', 'helloworld.c']
+      get :annotate, :id => PRJ_ID, :rev => 8,
+          :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
       assert_response :success
       assert_template 'annotate'
       assert_tag :tag => 'h2', :content => /@ 8/
@@ -338,10 +392,11 @@
       @request.session[:user_id] = 1 # admin
       assert_equal 0, @repository.changesets.count
       @repository.fetch_changesets
-      @project.reload
       assert_equal NUM_REV, @repository.changesets.count
 
-      get :destroy, :id => PRJ_ID
+      assert_difference 'Repository.count', -1 do
+        delete :destroy, :id => @repository.id
+      end
       assert_response 302
       @project.reload
       assert_nil @project.repository
@@ -349,25 +404,16 @@
 
     def test_destroy_invalid_repository
       @request.session[:user_id] = 1 # admin
-      assert_equal 0, @repository.changesets.count
-      @repository.fetch_changesets
-      @project.reload
-      assert_equal NUM_REV, @repository.changesets.count
-
-      get :destroy, :id => PRJ_ID
-      assert_response 302
-      @project.reload
-      assert_nil @project.repository
-
-      @repository = Repository::Subversion.create(
+      @project.repository.destroy
+      @repository = Repository::Subversion.create!(
                        :project => @project,
                        :url     => "file:///invalid")
-      assert @repository
       @repository.fetch_changesets
-      @project.reload
       assert_equal 0, @repository.changesets.count
 
-      get :destroy, :id => PRJ_ID
+      assert_difference 'Repository.count', -1 do
+        delete :destroy, :id => @repository.id
+      end
       assert_response 302
       @project.reload
       assert_nil @project.repository