repositories_subversion_controller_test.rb
425 lines
| 15.4 KiB
| text/x-ruby
|
RubyLexer
|
r5055 | # Redmine - project management software | ||
|
r10939 | # Copyright (C) 2006-2013 Jean-Philippe Lang | ||
|
r968 | # | ||
# 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. | ||||
|
r5581 | # | ||
|
r968 | # 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. | ||||
|
r5581 | # | ||
|
r968 | # 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. | ||||
|
r4395 | require File.expand_path('../../test_helper', __FILE__) | ||
|
r968 | |||
|
r2773 | class RepositoriesSubversionControllerTest < ActionController::TestCase | ||
|
r7917 | tests RepositoriesController | ||
|
r2627 | fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, | ||
|
r1826 | :repositories, :issues, :issue_statuses, :changesets, :changes, | ||
:issue_categories, :enumerations, :custom_fields, :custom_values, :trackers | ||||
|
r968 | |||
|
r4776 | PRJ_ID = 3 | ||
|
r7052 | NUM_REV = 11 | ||
|
r4776 | |||
|
r968 | def setup | ||
|
r1142 | Setting.default_language = 'en' | ||
|
r968 | User.current = nil | ||
|
r4776 | |||
@project = Project.find(PRJ_ID) | ||||
@repository = Repository::Subversion.create(:project => @project, | ||||
|
r5055 | :url => self.class.subversion_repository_url) | ||
|
r4776 | assert @repository | ||
|
r968 | end | ||
|
r3606 | if repository_configured?('subversion') | ||
|
r8528 | def test_new | ||
|
r7916 | @request.session[:user_id] = 1 | ||
@project.repository.destroy | ||||
|
r8528 | get :new, :project_id => 'subproject1', :repository_scm => 'Subversion' | ||
|
r7916 | assert_response :success | ||
|
r8528 | assert_template 'new' | ||
|
r7916 | assert_kind_of Repository::Subversion, assigns(:repository) | ||
assert assigns(:repository).new_record? | ||||
end | ||||
|
r968 | def test_show | ||
|
r7053 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7053 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r4776 | get :show, :id => PRJ_ID | ||
|
r968 | assert_response :success | ||
assert_template 'show' | ||||
assert_not_nil assigns(:entries) | ||||
assert_not_nil assigns(:changesets) | ||||
|
r8545 | |||
|
r8546 | entry = assigns(:entries).detect {|e| e.name == 'subversion_test'} | ||
assert_not_nil entry | ||||
assert_equal 'dir', entry.kind | ||||
|
r9346 | assert_select 'tr.dir a[href=/projects/subproject1/repository/show/subversion_test]' | ||
|
r8546 | |||
|
r8545 | assert_tag 'input', :attributes => {:name => 'rev'} | ||
assert_tag 'a', :content => 'Statistics' | ||||
assert_tag 'a', :content => 'Atom' | ||||
|
r9430 | assert_tag :tag => 'a', | ||
:attributes => {:href => '/projects/subproject1/repository'}, | ||||
:content => 'root' | ||||
|
r968 | end | ||
|
r5441 | |||
|
r9346 | 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_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 | ||||
|
r968 | def test_browse_directory | ||
|
r7076 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7076 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :show, :id => PRJ_ID, :path => repository_path_hash(['subversion_test'])[:param] | ||
|
r968 | assert_response :success | ||
|
r2735 | assert_template 'show' | ||
|
r968 | assert_not_nil assigns(:entries) | ||
|
r7064 | assert_equal [ | ||
'[folder_with_brackets]', 'folder', '.project', | ||||
'helloworld.c', 'textfile.txt' | ||||
], | ||||
assigns(:entries).collect(&:name) | ||||
|
r968 | entry = assigns(:entries).detect {|e| e.name == 'helloworld.c'} | ||
assert_equal 'file', entry.kind | ||||
assert_equal 'subversion_test/helloworld.c', entry.path | ||||
|
r2580 | assert_tag :a, :content => 'helloworld.c', :attributes => { :class => /text\-x\-c/ } | ||
|
r968 | end | ||
|
r1314 | |||
def test_browse_at_given_revision | ||||
|
r7077 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7077 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :show, :id => PRJ_ID, :path => repository_path_hash(['subversion_test'])[:param], | ||
:rev => 4 | ||||
|
r1314 | assert_response :success | ||
|
r2735 | assert_template 'show' | ||
|
r1314 | assert_not_nil assigns(:entries) | ||
|
r5441 | assert_equal ['folder', '.project', 'helloworld.c', 'helloworld.rb', 'textfile.txt'], | ||
assigns(:entries).collect(&:name) | ||||
|
r1314 | end | ||
|
r5441 | |||
|
r2744 | def test_file_changes | ||
|
r7078 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7078 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :changes, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'folder', 'helloworld.rb'])[:param] | ||||
|
r1613 | assert_response :success | ||
assert_template 'changes' | ||||
|
r5581 | |||
|
r2739 | changesets = assigns(:changesets) | ||
assert_not_nil changesets | ||||
assert_equal %w(6 3 2), changesets.collect(&:revision) | ||||
|
r5581 | |||
|
r2247 | # svn properties displayed with svn >= 1.5 only | ||
if Redmine::Scm::Adapters::SubversionAdapter.client_version_above?([1, 5, 0]) | ||||
assert_not_nil assigns(:properties) | ||||
assert_equal 'native', assigns(:properties)['svn:eol-style'] | ||||
assert_tag :ul, | ||||
:child => { :tag => 'li', | ||||
:child => { :tag => 'b', :content => 'svn:eol-style' }, | ||||
:child => { :tag => 'span', :content => 'native' } } | ||||
end | ||||
|
r1613 | end | ||
|
r2744 | |||
def test_directory_changes | ||||
|
r7079 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7079 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :changes, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'folder'])[:param] | ||||
|
r2744 | assert_response :success | ||
assert_template 'changes' | ||||
|
r5441 | |||
|
r2744 | changesets = assigns(:changesets) | ||
assert_not_nil changesets | ||||
|
r2784 | assert_equal %w(10 9 7 6 5 2), changesets.collect(&:revision) | ||
|
r2744 | end | ||
|
r5441 | |||
|
r968 | def test_entry | ||
|
r7080 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7080 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :entry, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] | ||||
|
r968 | assert_response :success | ||
assert_template 'entry' | ||||
end | ||||
|
r5441 | |||
|
r2442 | def test_entry_should_send_if_too_big | ||
|
r7081 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7081 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r2442 | # no files in the test repo is larger than 1KB... | ||
with_settings :file_max_size_displayed => 0 do | ||||
|
r8810 | get :entry, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] | ||||
|
r2442 | assert_response :success | ||
|
r7065 | assert_equal 'attachment; filename="helloworld.c"', | ||
@response.headers['Content-Disposition'] | ||||
|
r2442 | end | ||
end | ||||
|
r5441 | |||
|
r9593 | 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 | ||||
|
r1539 | def test_entry_at_given_revision | ||
|
r7082 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7082 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :entry, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.rb'])[:param], | ||||
:rev => 2 | ||||
|
r1539 | assert_response :success | ||
assert_template 'entry' | ||||
# this line was removed in r3 and file was moved in r6 | ||||
assert_tag :tag => 'td', :attributes => { :class => /line-code/}, | ||||
:content => /Here's the code/ | ||||
end | ||||
|
r5441 | |||
|
r1090 | def test_entry_not_found | ||
|
r7083 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7083 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :entry, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'zzz.c'])[:param] | ||||
|
r4175 | assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ }, | ||
|
r8810 | :content => /The entry or revision was not found in the repository/ | ||
|
r1090 | end | ||
|
r5441 | |||
|
r968 | def test_entry_download | ||
|
r7084 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7084 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r9442 | get :raw, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] | ||||
|
r968 | assert_response :success | ||
|
r2442 | assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition'] | ||
|
r968 | end | ||
|
r5441 | |||
|
r1350 | def test_directory_entry | ||
|
r7066 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7066 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :entry, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'folder'])[:param] | ||||
|
r1350 | assert_response :success | ||
|
r2735 | assert_template 'show' | ||
|
r1350 | assert_not_nil assigns(:entry) | ||
assert_equal 'folder', assigns(:entry).name | ||||
end | ||||
|
r5441 | |||
|
r4776 | # TODO: this test needs fixtures. | ||
|
r1432 | def test_revision | ||
get :revision, :id => 1, :rev => 2 | ||||
assert_response :success | ||||
assert_template 'revision' | ||||
|
r9925 | |||
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 | ||||
|
r1432 | end | ||
|
r5441 | |||
|
r4428 | def test_invalid_revision | ||
|
r7067 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7067 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r4776 | get :revision, :id => PRJ_ID, :rev => 'something_weird' | ||
|
r4590 | assert_response 404 | ||
|
r4428 | assert_error_tag :content => /was not found/ | ||
end | ||||
|
r4583 | |||
|
r4740 | def test_invalid_revision_diff | ||
|
r4776 | get :diff, :id => PRJ_ID, :rev => '1', :rev_to => 'something_weird' | ||
|
r4740 | assert_response 404 | ||
assert_error_tag :content => /was not found/ | ||||
end | ||||
|
r4583 | def test_empty_revision | ||
|
r7068 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7068 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r4583 | ['', ' ', nil].each do |r| | ||
|
r4776 | get :revision, :id => PRJ_ID, :rev => r | ||
|
r4590 | assert_response 404 | ||
|
r4583 | assert_error_tag :content => /was not found/ | ||
end | ||||
end | ||||
|
r4776 | # TODO: this test needs fixtures. | ||
|
r1432 | def test_revision_with_repository_pointing_to_a_subdirectory | ||
r = Project.find(1).repository | ||||
# Changes repository url to a subdirectory | ||||
r.update_attribute :url, (r.url + '/test/some') | ||||
|
r5441 | |||
|
r1432 | get :revision, :id => 1, :rev => 2 | ||
assert_response :success | ||||
assert_template 'revision' | ||||
|
r9925 | |||
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 | ||||
|
r1432 | end | ||
|
r5441 | |||
|
r2744 | def test_revision_diff | ||
|
r7069 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7069 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r5861 | ['inline', 'sbs'].each do |dt| | ||
get :diff, :id => PRJ_ID, :rev => 3, :type => dt | ||||
assert_response :success | ||||
assert_template 'diff' | ||||
|
r10242 | assert_select 'h2', :text => /Revision 3/ | ||
assert_select 'th.filename', :text => 'subversion_test/textfile.txt' | ||||
|
r5861 | end | ||
|
r968 | end | ||
|
r2744 | |||
|
r7922 | 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 | ||||
|
r2744 | def test_directory_diff | ||
|
r7070 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7070 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r5862 | ['inline', 'sbs'].each do |dt| | ||
get :diff, :id => PRJ_ID, :rev => 6, :rev_to => 2, | ||||
|
r8810 | :path => repository_path_hash(['subversion_test', 'folder'])[:param], | ||
:type => dt | ||||
|
r5862 | assert_response :success | ||
assert_template 'diff' | ||||
|
r4545 | |||
|
r5862 | diff = assigns(:diff) | ||
assert_not_nil diff | ||||
# 2 files modified | ||||
assert_equal 2, Redmine::UnifiedDiff.new(diff).size | ||||
assert_tag :tag => 'h2', :content => /2:6/ | ||||
end | ||||
|
r2744 | end | ||
|
r5441 | |||
|
r968 | def test_annotate | ||
|
r7071 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7071 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :annotate, :id => PRJ_ID, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] | ||||
|
r968 | assert_response :success | ||
assert_template 'annotate' | ||||
|
r9924 | |||
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 | ||||
|
r968 | end | ||
|
r4614 | |||
def test_annotate_at_given_revision | ||||
|
r7072 | assert_equal 0, @repository.changesets.count | ||
|
r4776 | @repository.fetch_changesets | ||
|
r7072 | @project.reload | ||
assert_equal NUM_REV, @repository.changesets.count | ||||
|
r8810 | get :annotate, :id => PRJ_ID, :rev => 8, | ||
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] | ||||
|
r4614 | assert_response :success | ||
assert_template 'annotate' | ||||
assert_tag :tag => 'h2', :content => /@ 8/ | ||||
end | ||||
|
r6104 | |||
def test_destroy_valid_repository | ||||
@request.session[:user_id] = 1 # admin | ||||
|
r7073 | assert_equal 0, @repository.changesets.count | ||
|
r6104 | @repository.fetch_changesets | ||
|
r7073 | assert_equal NUM_REV, @repository.changesets.count | ||
|
r6104 | |||
|
r8528 | assert_difference 'Repository.count', -1 do | ||
delete :destroy, :id => @repository.id | ||||
end | ||||
|
r6104 | assert_response 302 | ||
@project.reload | ||||
assert_nil @project.repository | ||||
end | ||||
|
r6105 | def test_destroy_invalid_repository | ||
@request.session[:user_id] = 1 # admin | ||||
|
r8528 | @project.repository.destroy | ||
@repository = Repository::Subversion.create!( | ||||
|
r6111 | :project => @project, | ||
:url => "file:///invalid") | ||||
|
r6105 | @repository.fetch_changesets | ||
assert_equal 0, @repository.changesets.count | ||||
|
r8528 | assert_difference 'Repository.count', -1 do | ||
delete :destroy, :id => @repository.id | ||||
end | ||||
|
r6105 | assert_response 302 | ||
@project.reload | ||||
assert_nil @project.repository | ||||
end | ||||
|
r968 | else | ||
puts "Subversion test repository NOT FOUND. Skipping functional tests !!!" | ||||
def test_fake; assert true end | ||||
end | ||||
end | ||||