diff --git a/Gemfile b/Gemfile index e5f2a7054..05e309f44 100644 --- a/Gemfile +++ b/Gemfile @@ -22,12 +22,11 @@ group :development do end group :test do - #gem "shoulda", "~> 3.3.2" - gem "shoulda", "> 3.3.2" - gem "mocha", "~> 0.13.3" - gem 'capybara', '~> 2.0.0' - gem 'nokogiri', '< 1.6.0' - gem 'factory_girl' + gem "shoulda", "~> 3.5.0" + gem "mocha", "~> 1.1.0" + gem 'capybara', '~> 2.4.1' + gem 'nokogiri', '~> 1.6.3' + gem 'factory_girl', '~> 4.4.0' platforms :mri, :mingw do group :rmagick do @@ -40,11 +39,11 @@ group :test do end group :development, :test do - gem "guard-rails" - gem 'spork-testunit' - gem 'guard-spork' + gem "guard-rails", '~> 0.5.3' + gem 'spork-testunit', '~> 0.0.8' + gem 'guard-spork', '~> 1.5.1' gem 'guard-test', '~> 1.0.0' - gem 'ruby-prof' unless RUBY_PLATFORM =~ /w32/ + gem 'ruby-prof', '~> 0.15.1' unless RUBY_PLATFORM =~ /w32/ gem 'pry' gem 'pry-nav' end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index cb517e40b..6412eb5e4 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -151,6 +151,9 @@ class UsersController < ApplicationController # added by fq def user_activities + redirect_to user_path(@user) + return + # useless abort. @watcher = User.watched_by_id(@user) events = [] for user in @watcher diff --git a/config/routes.rb b/config/routes.rb index 780c8b77a..ba25477e6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -215,7 +215,7 @@ RedmineApp::Application.routes.draw do end member do match 'user_projects', :to => 'users#user_projects', :via => :get - match 'user_activities', :to => 'users#show', :via => :get, :as => "user_activities" + match 'user_activities', :to => 'users#user_activities', :via => :get, :as => "user_activities" match 'user_newfeedback', :to => 'users#user_newfeedback', :via => :get, :as => "user_newfeedback" match 'watch_calls', :controller => 'users', :action => 'watch_bids', :via => [:get , :post] match 'info', :to => 'users#info', :via => [:get , :post], :as => 'user_info' diff --git a/test/fixtures/courses.yml b/test/fixtures/courses.yml index 0eedd1960..a6d8cb763 100644 --- a/test/fixtures/courses.yml +++ b/test/fixtures/courses.yml @@ -15,7 +15,7 @@ courses_008: password: '1234' setup_time: endup_time: '2014-04-18 00:00:00' - class_period: '' + class_period: '32' school_id: 117 description: 介绍分布计算模型,分布计算平台,分布式软件开发环境等分布计算方向的概念、技术和环境,并通过实验提高学生的实践能力。 status: 1 diff --git a/test/functional/account_controller_openid_test.rb b/test/functional/account_controller_openid_test.rb deleted file mode 100644 index 8a0d81ab5..000000000 --- a/test/functional/account_controller_openid_test.rb +++ /dev/null @@ -1,165 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AccountControllerOpenidTest < ActionController::TestCase - tests AccountController - fixtures :users, :roles - - def setup - User.current = nil - Setting.openid = '1' - end - - def teardown - Setting.openid = '0' - end - - if Object.const_defined?(:OpenID) - - def test_login_with_openid_for_existing_user - Setting.self_registration = '3' - existing_user = User.new(:firstname => 'Cool', - :lastname => 'User', - :mail => 'user@somedomain.com', - :identity_url => 'http://openid.example.com/good_user') - existing_user.login = 'cool_user' - assert existing_user.save! - - post :login, :openid_url => existing_user.identity_url - assert_redirected_to '/my/page' - end - - def test_login_with_invalid_openid_provider - Setting.self_registration = '0' - post :login, :openid_url => 'http;//openid.example.com/good_user' - assert_redirected_to home_url - end - - def test_login_with_openid_for_existing_non_active_user - Setting.self_registration = '2' - existing_user = User.new(:firstname => 'Cool', - :lastname => 'User', - :mail => 'user@somedomain.com', - :identity_url => 'http://openid.example.com/good_user', - :status => User::STATUS_REGISTERED) - existing_user.login = 'cool_user' - assert existing_user.save! - - post :login, :openid_url => existing_user.identity_url - assert_redirected_to '/login' - end - - def test_login_with_openid_with_new_user_created - Setting.self_registration = '3' - post :login, :openid_url => 'http://openid.example.com/good_user' - assert_redirected_to '/my/account' - user = User.find_by_login('cool_user') - assert user - assert_equal 'Cool', user.firstname - assert_equal 'User', user.lastname - end - - def test_login_with_openid_with_new_user_and_self_registration_off - Setting.self_registration = '0' - post :login, :openid_url => 'http://openid.example.com/good_user' - assert_redirected_to home_url - user = User.find_by_login('cool_user') - assert_nil user - end - - def test_login_with_openid_with_new_user_created_with_email_activation_should_have_a_token - Setting.self_registration = '1' - post :login, :openid_url => 'http://openid.example.com/good_user' - assert_redirected_to '/login' - user = User.find_by_login('cool_user') - assert user - - token = Token.find_by_user_id_and_action(user.id, 'register') - assert token - end - - def test_login_with_openid_with_new_user_created_with_manual_activation - Setting.self_registration = '2' - post :login, :openid_url => 'http://openid.example.com/good_user' - assert_redirected_to '/login' - user = User.find_by_login('cool_user') - assert user - assert_equal User::STATUS_REGISTERED, user.status - end - - def test_login_with_openid_with_new_user_with_conflict_should_register - Setting.self_registration = '3' - existing_user = User.new(:firstname => 'Cool', :lastname => 'User', :mail => 'user@somedomain.com') - existing_user.login = 'cool_user' - assert existing_user.save! - - post :login, :openid_url => 'http://openid.example.com/good_user' - assert_response :success - assert_template 'register' - assert assigns(:user) - assert_equal 'http://openid.example.com/good_user', assigns(:user)[:identity_url] - end - - def test_login_with_openid_with_new_user_with_missing_information_should_register - Setting.self_registration = '3' - - post :login, :openid_url => 'http://openid.example.com/good_blank_user' - assert_response :success - assert_template 'register' - assert assigns(:user) - assert_equal 'http://openid.example.com/good_blank_user', assigns(:user)[:identity_url] - - assert_select 'input[name=?]', 'user[login]' - assert_select 'input[name=?]', 'user[password]' - assert_select 'input[name=?]', 'user[password_confirmation]' - assert_select 'input[name=?][value=?]', 'user[identity_url]', 'http://openid.example.com/good_blank_user' - end - - def test_register_after_login_failure_should_not_require_user_to_enter_a_password - Setting.self_registration = '3' - - assert_difference 'User.count' do - post :register, :user => { - :login => 'good_blank_user', - :password => '', - :password_confirmation => '', - :firstname => 'Cool', - :lastname => 'User', - :mail => 'user@somedomain.com', - :identity_url => 'http://openid.example.com/good_blank_user' - } - assert_response 302 - end - - user = User.first(:order => 'id DESC') - assert_equal 'http://openid.example.com/good_blank_user', user.identity_url - assert user.hashed_password.blank?, "Hashed password was #{user.hashed_password}" - end - - def test_setting_openid_should_return_true_when_set_to_true - assert_equal true, Setting.openid? - end - - else - puts "Skipping openid tests." - - def test_dummy - end - end -end diff --git a/test/functional/account_controller_test.rb b/test/functional/account_controller_test.rb deleted file mode 100644 index ca30cf5d5..000000000 --- a/test/functional/account_controller_test.rb +++ /dev/null @@ -1,277 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AccountControllerTest < ActionController::TestCase - fixtures :users, :roles - - def setup - User.current = nil - end - - def test_get_login - get :login - assert_response :success - assert_template 'login' - - assert_select 'input[name=username]' - assert_select 'input[name=password]' - end - - def test_get_login_while_logged_in_should_redirect_to_home - @request.session[:user_id] = 2 - - get :login - assert_redirected_to '/' - assert_equal 2, @request.session[:user_id] - end - - def test_login_should_redirect_to_back_url_param - # request.uri is "test.host" in test environment - post :login, :username => 'jsmith', :password => 'jsmith', :back_url => 'http://test.host/issues/show/1' - assert_redirected_to '/issues/show/1' - end - - def test_login_should_not_redirect_to_another_host - post :login, :username => 'jsmith', :password => 'jsmith', :back_url => 'http://test.foo/fake' - assert_redirected_to '/my/page' - end - - def test_login_with_wrong_password - post :login, :username => 'admin', :password => 'bad' - assert_response :success - assert_template 'login' - - assert_select 'div.flash.error', :text => /Invalid user or password/ - assert_select 'input[name=username][value=admin]' - assert_select 'input[name=password]' - assert_select 'input[name=password][value]', 0 - end - - def test_login_should_rescue_auth_source_exception - source = AuthSource.create!(:name => 'Test') - User.find(2).update_attribute :auth_source_id, source.id - AuthSource.any_instance.stubs(:authenticate).raises(AuthSourceException.new("Something wrong")) - - post :login, :username => 'jsmith', :password => 'jsmith' - assert_response 500 - assert_error_tag :content => /Something wrong/ - end - - def test_login_should_reset_session - @controller.expects(:reset_session).once - - post :login, :username => 'jsmith', :password => 'jsmith' - assert_response 302 - end - - def test_get_logout_should_not_logout - @request.session[:user_id] = 2 - get :logout - assert_response :success - assert_template 'logout' - - assert_equal 2, @request.session[:user_id] - end - - def test_logout - @request.session[:user_id] = 2 - post :logout - assert_redirected_to '/' - assert_nil @request.session[:user_id] - end - - def test_logout_should_reset_session - @controller.expects(:reset_session).once - - @request.session[:user_id] = 2 - post :logout - assert_response 302 - end - - def test_get_register_with_registration_on - with_settings :self_registration => '3' do - get :register - assert_response :success - assert_template 'register' - assert_not_nil assigns(:user) - - assert_select 'input[name=?]', 'user[password]' - assert_select 'input[name=?]', 'user[password_confirmation]' - end - end - - def test_get_register_should_detect_user_language - with_settings :self_registration => '3' do - @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' - get :register - assert_response :success - assert_not_nil assigns(:user) - assert_equal 'fr', assigns(:user).language - assert_select 'select[name=?]', 'user[language]' do - assert_select 'option[value=fr][selected=selected]' - end - end - end - - def test_get_register_with_registration_off_should_redirect - with_settings :self_registration => '0' do - get :register - assert_redirected_to '/' - end - end - - # See integration/account_test.rb for the full test - def test_post_register_with_registration_on - with_settings :self_registration => '3' do - assert_difference 'User.count' do - post :register, :user => { - :login => 'register', - :password => 'secret123', - :password_confirmation => 'secret123', - :firstname => 'John', - :lastname => 'Doe', - :mail => 'register@example.com' - } - assert_redirected_to '/my/account' - end - user = User.first(:order => 'id DESC') - assert_equal 'register', user.login - assert_equal 'John', user.firstname - assert_equal 'Doe', user.lastname - assert_equal 'register@example.com', user.mail - assert user.check_password?('secret123') - assert user.active? - end - end - - def test_post_register_with_registration_off_should_redirect - with_settings :self_registration => '0' do - assert_no_difference 'User.count' do - post :register, :user => { - :login => 'register', - :password => 'test', - :password_confirmation => 'test', - :firstname => 'John', - :lastname => 'Doe', - :mail => 'register@example.com' - } - assert_redirected_to '/' - end - end - end - - def test_get_lost_password_should_display_lost_password_form - get :lost_password - assert_response :success - assert_select 'input[name=mail]' - end - - def test_lost_password_for_active_user_should_create_a_token - Token.delete_all - ActionMailer::Base.deliveries.clear - assert_difference 'ActionMailer::Base.deliveries.size' do - assert_difference 'Token.count' do - with_settings :host_name => 'mydomain.foo', :protocol => 'http' do - post :lost_password, :mail => 'JSmith@somenet.foo' - assert_redirected_to '/login' - end - end - end - - token = Token.order('id DESC').first - assert_equal User.find(2), token.user - assert_equal 'recovery', token.action - - assert_select_email do - assert_select "a[href=?]", "http://mydomain.foo/account/lost_password?token=#{token.value}" - end - end - - def test_lost_password_for_unknown_user_should_fail - Token.delete_all - assert_no_difference 'Token.count' do - post :lost_password, :mail => 'invalid@somenet.foo' - assert_response :success - end - end - - def test_lost_password_for_non_active_user_should_fail - Token.delete_all - assert User.find(2).lock! - - assert_no_difference 'Token.count' do - post :lost_password, :mail => 'JSmith@somenet.foo' - assert_response :success - end - end - - def test_get_lost_password_with_token_should_display_the_password_recovery_form - user = User.find(2) - token = Token.create!(:action => 'recovery', :user => user) - - get :lost_password, :token => token.value - assert_response :success - assert_template 'password_recovery' - - assert_select 'input[type=hidden][name=token][value=?]', token.value - end - - def test_get_lost_password_with_invalid_token_should_redirect - get :lost_password, :token => "abcdef" - assert_redirected_to '/' - end - - def test_post_lost_password_with_token_should_change_the_user_password - user = User.find(2) - token = Token.create!(:action => 'recovery', :user => user) - - post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123' - assert_redirected_to '/login' - user.reload - assert user.check_password?('newpass123') - assert_nil Token.find_by_id(token.id), "Token was not deleted" - end - - def test_post_lost_password_with_token_for_non_active_user_should_fail - user = User.find(2) - token = Token.create!(:action => 'recovery', :user => user) - user.lock! - - post :lost_password, :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123' - assert_redirected_to '/' - assert ! user.check_password?('newpass123') - end - - def test_post_lost_password_with_token_and_password_confirmation_failure_should_redisplay_the_form - user = User.find(2) - token = Token.create!(:action => 'recovery', :user => user) - - post :lost_password, :token => token.value, :new_password => 'newpass', :new_password_confirmation => 'wrongpass' - assert_response :success - assert_template 'password_recovery' - assert_not_nil Token.find_by_id(token.id), "Token was deleted" - - assert_select 'input[type=hidden][name=token][value=?]', token.value - end - - def test_post_lost_password_with_invalid_token_should_redirect - post :lost_password, :token => "abcdef", :new_password => 'newpass', :new_password_confirmation => 'newpass' - assert_redirected_to '/' - end -end diff --git a/test/functional/activities_controller_test.rb b/test/functional/activities_controller_test.rb deleted file mode 100644 index d1b4396d9..000000000 --- a/test/functional/activities_controller_test.rb +++ /dev/null @@ -1,150 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ActivitiesControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :groups_users, - :enabled_modules, - :journals, :journal_details - - - def test_project_index - get :index, :id => 1, :with_subprojects => 0 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:events_by_day) - - assert_select 'h3', :text => /#{2.days.ago.to_date.day}/ - assert_select 'dl dt.issue-edit a', :text => /(#{IssueStatus.find(2).name})/ - end - - def test_project_index_with_invalid_project_id_should_respond_404 - get :index, :id => 299 - assert_response 404 - end - - def test_previous_project_index - get :index, :id => 1, :from => 2.days.ago.to_date - assert_response :success - assert_template 'index' - assert_not_nil assigns(:events_by_day) - - assert_select 'h3', :text => /#{3.days.ago.to_date.day}/ - assert_select 'dl dt.issue a', :text => /Can't print recipes/ - end - - def test_global_index - @request.session[:user_id] = 1 - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:events_by_day) - - i5 = Issue.find(5) - d5 = User.find(1).time_to_date(i5.created_on) - - assert_select 'h3', :text => /#{d5.day}/ - assert_select 'dl dt.issue a', :text => /Subproject issue/ - end - - def test_user_index - @request.session[:user_id] = 1 - get :index, :user_id => 2 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:events_by_day) - - assert_select 'h2 a[href=/users/2]', :text => 'John Smith' - - i1 = Issue.find(1) - d1 = User.find(1).time_to_date(i1.created_on) - - assert_select 'h3', :text => /#{d1.day}/ - assert_select 'dl dt.issue a', :text => /Can't print recipes/ - end - - def test_user_index_with_invalid_user_id_should_respond_404 - get :index, :user_id => 299 - assert_response 404 - end - - def test_index_atom_feed - get :index, :format => 'atom', :with_subprojects => 0 - assert_response :success - assert_template 'common/feed' - - assert_select 'feed' do - assert_select 'link[rel=self][href=?]', 'http://test.host/activity.atom?with_subprojects=0' - assert_select 'link[rel=alternate][href=?]', 'http://test.host/activity?with_subprojects=0' - assert_select 'entry' do - assert_select 'link[href=?]', 'http://test.host/issues/11' - end - end - end - - def test_index_atom_feed_with_explicit_selection - get :index, :format => 'atom', :with_subprojects => 0, - :show_changesets => 1, - :show_documents => 1, - :show_files => 1, - :show_issues => 1, - :show_messages => 1, - :show_news => 1, - :show_time_entries => 1, - :show_wiki_edits => 1 - - assert_response :success - assert_template 'common/feed' - - assert_select 'feed' do - assert_select 'link[rel=self][href=?]', 'http://test.host/activity.atom?show_changesets=1&show_documents=1&show_files=1&show_issues=1&show_messages=1&show_news=1&show_time_entries=1&show_wiki_edits=1&with_subprojects=0' - assert_select 'link[rel=alternate][href=?]', 'http://test.host/activity?show_changesets=1&show_documents=1&show_files=1&show_issues=1&show_messages=1&show_news=1&show_time_entries=1&show_wiki_edits=1&with_subprojects=0' - assert_select 'entry' do - assert_select 'link[href=?]', 'http://test.host/issues/11' - end - end - end - - def test_index_atom_feed_with_one_item_type - get :index, :format => 'atom', :show_issues => '1' - assert_response :success - assert_template 'common/feed' - - assert_select 'title', :text => /Issues/ - end - - def test_index_should_show_private_notes_with_permission_only - journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Private notes with searchkeyword', :private_notes => true) - @request.session[:user_id] = 2 - - get :index - assert_response :success - assert_include journal, assigns(:events_by_day).values.flatten - - Role.find(1).remove_permission! :view_private_notes - get :index - assert_response :success - assert_not_include journal, assigns(:events_by_day).values.flatten - end -end diff --git a/test/functional/admin_controller_test.rb b/test/functional/admin_controller_test.rb deleted file mode 100644 index e6d8fcff5..000000000 --- a/test/functional/admin_controller_test.rb +++ /dev/null @@ -1,167 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AdminControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_select 'div.nodata', 0 - end - - def test_index_with_no_configuration_data - delete_configuration_data - get :index - assert_select 'div.nodata' - end - - def test_projects - get :projects - assert_response :success - assert_template 'projects' - assert_not_nil assigns(:projects) - # active projects only - assert_nil assigns(:projects).detect {|u| !u.active?} - end - - def test_projects_with_status_filter - get :projects, :status => 1 - assert_response :success - assert_template 'projects' - assert_not_nil assigns(:projects) - # active projects only - assert_nil assigns(:projects).detect {|u| !u.active?} - end - - def test_projects_with_name_filter - get :projects, :name => 'store', :status => '' - assert_response :success - assert_template 'projects' - projects = assigns(:projects) - assert_not_nil projects - assert_equal 1, projects.size - assert_equal 'OnlineStore', projects.first.name - end - - def test_load_default_configuration_data - delete_configuration_data - post :default_configuration, :lang => 'fr' - assert_response :redirect - assert_nil flash[:error] - assert IssueStatus.find_by_name('Nouveau') - end - - def test_load_default_configuration_data_should_rescue_error - delete_configuration_data - Redmine::DefaultData::Loader.stubs(:load).raises(Exception.new("Something went wrong")) - post :default_configuration, :lang => 'fr' - assert_response :redirect - assert_not_nil flash[:error] - assert_match /Something went wrong/, flash[:error] - end - - def test_test_email - user = User.find(1) - user.pref.no_self_notified = '1' - user.pref.save! - ActionMailer::Base.deliveries.clear - - get :test_email - assert_redirected_to '/settings?tab=notifications' - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - user = User.find(1) - assert_equal [user.mail], mail.bcc - end - - def test_test_email_failure_should_display_the_error - Mailer.stubs(:test_email).raises(Exception, 'Some error message') - get :test_email - assert_redirected_to '/settings?tab=notifications' - assert_match /Some error message/, flash[:error] - end - - def test_no_plugins - Redmine::Plugin.clear - - get :plugins - assert_response :success - assert_template 'plugins' - end - - def test_plugins - # Register a few plugins - Redmine::Plugin.register :foo do - name 'Foo plugin' - author 'John Smith' - description 'This is a test plugin' - version '0.0.1' - settings :default => {'sample_setting' => 'value', 'foo'=>'bar'}, :partial => 'foo/settings' - end - Redmine::Plugin.register :bar do - end - - get :plugins - assert_response :success - assert_template 'plugins' - - assert_select 'tr#plugin-foo' do - assert_select 'td span.name', :text => 'Foo plugin' - assert_select 'td.configure a[href=/settings/plugin/foo]' - end - assert_select 'tr#plugin-bar' do - assert_select 'td span.name', :text => 'Bar' - assert_select 'td.configure a', 0 - end - end - - def test_info - get :info - assert_response :success - assert_template 'info' - end - - def test_admin_menu_plugin_extension - Redmine::MenuManager.map :admin_menu do |menu| - menu.push :test_admin_menu_plugin_extension, '/foo/bar', :caption => 'Test' - end - - get :index - assert_response :success - assert_select 'div#admin-menu a[href=/foo/bar]', :text => 'Test' - - Redmine::MenuManager.map :admin_menu do |menu| - menu.delete :test_admin_menu_plugin_extension - end - end - - private - - def delete_configuration_data - Role.delete_all('builtin = 0') - Tracker.delete_all - IssueStatus.delete_all - Enumeration.delete_all - end -end diff --git a/test/functional/applied_project_controller_test.rb b/test/functional/applied_project_controller_test.rb deleted file mode 100644 index 7c73908ce..000000000 --- a/test/functional/applied_project_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class AppliedProjectControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/apply_project_masters_controller_test.rb b/test/functional/apply_project_masters_controller_test.rb deleted file mode 100644 index 3cad8dca6..000000000 --- a/test/functional/apply_project_masters_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class ApplyProjectMastersControllerTest < ActionController::TestCase - setup do - @apply_project_master = apply_project_masters(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:apply_project_masters) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create apply_project_master" do - assert_difference('ApplyProjectMaster.count') do - post :create, apply_project_master: { } - end - - assert_redirected_to apply_project_master_path(assigns(:apply_project_master)) - end - - test "should show apply_project_master" do - get :show, id: @apply_project_master - assert_response :success - end - - test "should get edit" do - get :edit, id: @apply_project_master - assert_response :success - end - - test "should update apply_project_master" do - put :update, id: @apply_project_master, apply_project_master: { } - assert_redirected_to apply_project_master_path(assigns(:apply_project_master)) - end - - test "should destroy apply_project_master" do - assert_difference('ApplyProjectMaster.count', -1) do - delete :destroy, id: @apply_project_master - end - - assert_redirected_to apply_project_masters_path - end -end diff --git a/test/functional/attachment_type_edit_controller_test.rb b/test/functional/attachment_type_edit_controller_test.rb deleted file mode 100644 index d71c8407f..000000000 --- a/test/functional/attachment_type_edit_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class AttachmentTypeEditControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/attachments_controller_test.rb b/test/functional/attachments_controller_test.rb deleted file mode 100644 index 8458e9711..000000000 --- a/test/functional/attachments_controller_test.rb +++ /dev/null @@ -1,385 +0,0 @@ -# encoding: utf-8 -# -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AttachmentsControllerTest < ActionController::TestCase - fixtures :users, :projects, :roles, :members, :member_roles, - :enabled_modules, :issues, :trackers, :attachments, - :versions, :wiki_pages, :wikis, :documents - - def setup - User.current = nil - set_fixtures_attachments_directory - end - - def teardown - set_tmp_attachments_directory - end - - def test_show_diff - ['inline', 'sbs'].each do |dt| - # 060719210727_changeset_utf8.diff - get :show, :id => 14, :type => dt - assert_response :success - assert_template 'diff' - assert_equal 'text/html', @response.content_type - assert_tag 'th', - :attributes => {:class => /filename/}, - :content => /issues_controller.rb\t\(révision 1484\)/ - assert_tag 'td', - :attributes => {:class => /line-code/}, - :content => /Demande créée avec succès/ - end - set_tmp_attachments_directory - end - - def test_show_diff_replace_cannot_convert_content - with_settings :repositories_encodings => 'UTF-8' do - ['inline', 'sbs'].each do |dt| - # 060719210727_changeset_iso8859-1.diff - get :show, :id => 5, :type => dt - assert_response :success - assert_template 'diff' - assert_equal 'text/html', @response.content_type - assert_tag 'th', - :attributes => {:class => "filename"}, - :content => /issues_controller.rb\t\(r\?vision 1484\)/ - assert_tag 'td', - :attributes => {:class => /line-code/}, - :content => /Demande cr\?\?e avec succ\?s/ - end - end - set_tmp_attachments_directory - end - - def test_show_diff_latin_1 - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - ['inline', 'sbs'].each do |dt| - # 060719210727_changeset_iso8859-1.diff - get :show, :id => 5, :type => dt - assert_response :success - assert_template 'diff' - assert_equal 'text/html', @response.content_type - assert_tag 'th', - :attributes => {:class => "filename"}, - :content => /issues_controller.rb\t\(révision 1484\)/ - assert_tag 'td', - :attributes => {:class => /line-code/}, - :content => /Demande créée avec succès/ - end - end - set_tmp_attachments_directory - end - - def test_save_diff_type - user1 = User.find(1) - user1.pref[:diff_type] = nil - user1.preference.save - user = User.find(1) - assert_nil user.pref[:diff_type] - - @request.session[:user_id] = 1 # admin - get :show, :id => 5 - assert_response :success - assert_template 'diff' - user.reload - assert_equal "inline", user.pref[:diff_type] - get :show, :id => 5, :type => 'sbs' - assert_response :success - assert_template 'diff' - user.reload - assert_equal "sbs", user.pref[:diff_type] - end - - def test_diff_show_filename_in_mercurial_export - set_tmp_attachments_directory - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("hg-export.diff", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'hg-export.diff', a.filename - - get :show, :id => a.id, :type => 'inline' - assert_response :success - assert_template 'diff' - assert_equal 'text/html', @response.content_type - assert_select 'th.filename', :text => 'test1.txt' - end - - def test_show_text_file - get :show, :id => 4 - assert_response :success - assert_template 'file' - assert_equal 'text/html', @response.content_type - set_tmp_attachments_directory - end - - def test_show_text_file_utf_8 - set_tmp_attachments_directory - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("japanese-utf-8.txt", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'japanese-utf-8.txt', a.filename - - str_japanese = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" - str_japanese.force_encoding('UTF-8') if str_japanese.respond_to?(:force_encoding) - - get :show, :id => a.id - assert_response :success - assert_template 'file' - assert_equal 'text/html', @response.content_type - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /#{str_japanese}/ } - end - - def test_show_text_file_replace_cannot_convert_content - set_tmp_attachments_directory - with_settings :repositories_encodings => 'UTF-8' do - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("iso8859-1.txt", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'iso8859-1.txt', a.filename - - get :show, :id => a.id - assert_response :success - assert_template 'file' - assert_equal 'text/html', @response.content_type - assert_tag :tag => 'th', - :content => '7', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /Demande cr\?\?e avec succ\?s/ } - end - end - - def test_show_text_file_latin_1 - set_tmp_attachments_directory - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("iso8859-1.txt", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'iso8859-1.txt', a.filename - - get :show, :id => a.id - assert_response :success - assert_template 'file' - assert_equal 'text/html', @response.content_type - assert_tag :tag => 'th', - :content => '7', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /Demande créée avec succès/ } - end - end - - def test_show_text_file_should_send_if_too_big - Setting.file_max_size_displayed = 512 - Attachment.find(4).update_attribute :filesize, 754.kilobyte - - get :show, :id => 4 - assert_response :success - assert_equal 'application/x-ruby', @response.content_type - set_tmp_attachments_directory - end - - def test_show_other - get :show, :id => 6 - assert_response :success - assert_equal 'application/octet-stream', @response.content_type - set_tmp_attachments_directory - end - - def test_show_file_from_private_issue_without_permission - get :show, :id => 15 - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2F15' - set_tmp_attachments_directory - end - - def test_show_file_from_private_issue_with_permission - @request.session[:user_id] = 2 - get :show, :id => 15 - assert_response :success - assert_tag 'h2', :content => /private.diff/ - set_tmp_attachments_directory - end - - def test_show_file_without_container_should_be_allowed_to_author - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - - @request.session[:user_id] = 2 - get :show, :id => attachment.id - assert_response 200 - end - - def test_show_file_without_container_should_be_denied_to_other_users - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - - @request.session[:user_id] = 3 - get :show, :id => attachment.id - assert_response 403 - end - - def test_show_invalid_should_respond_with_404 - get :show, :id => 999 - assert_response 404 - end - - def test_download_text_file - get :download, :id => 4 - assert_response :success - assert_equal 'application/x-ruby', @response.content_type - set_tmp_attachments_directory - end - - def test_download_version_file_with_issue_tracking_disabled - Project.find(1).disable_module! :issue_tracking - get :download, :id => 9 - assert_response :success - end - - def test_download_should_assign_content_type_if_blank - Attachment.find(4).update_attribute(:content_type, '') - - get :download, :id => 4 - assert_response :success - assert_equal 'text/x-ruby', @response.content_type - set_tmp_attachments_directory - end - - def test_download_missing_file - get :download, :id => 2 - assert_response 404 - set_tmp_attachments_directory - end - - def test_download_should_be_denied_without_permission - get :download, :id => 7 - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fdownload%2F7' - set_tmp_attachments_directory - end - - if convert_installed? - def test_thumbnail - Attachment.clear_thumbnails - @request.session[:user_id] = 2 - - get :thumbnail, :id => 16 - assert_response :success - assert_equal 'image/png', response.content_type - end - - def test_thumbnail_should_not_exceed_maximum_size - Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 800} - - @request.session[:user_id] = 2 - get :thumbnail, :id => 16, :size => 2000 - end - - def test_thumbnail_should_round_size - Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 250} - - @request.session[:user_id] = 2 - get :thumbnail, :id => 16, :size => 260 - end - - def test_thumbnail_should_return_404_for_non_image_attachment - @request.session[:user_id] = 2 - - get :thumbnail, :id => 15 - assert_response 404 - end - - def test_thumbnail_should_return_404_if_thumbnail_generation_failed - Attachment.any_instance.stubs(:thumbnail).returns(nil) - @request.session[:user_id] = 2 - - get :thumbnail, :id => 16 - assert_response 404 - end - - def test_thumbnail_should_be_denied_without_permission - get :thumbnail, :id => 16 - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fthumbnail%2F16' - end - else - puts '(ImageMagick convert not available)' - end - - def test_destroy_issue_attachment - set_tmp_attachments_directory - issue = Issue.find(3) - @request.session[:user_id] = 2 - - assert_difference 'issue.attachments.count', -1 do - assert_difference 'Journal.count' do - delete :destroy, :id => 1 - assert_redirected_to '/projects/ecookbook' - end - end - assert_nil Attachment.find_by_id(1) - j = Journal.first(:order => 'id DESC') - assert_equal issue, j.journalized - assert_equal 'attachment', j.details.first.property - assert_equal '1', j.details.first.prop_key - assert_equal 'error281.txt', j.details.first.old_value - assert_equal User.find(2), j.user - end - - def test_destroy_wiki_page_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - assert_difference 'Attachment.count', -1 do - delete :destroy, :id => 3 - assert_response 302 - end - end - - def test_destroy_project_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - assert_difference 'Attachment.count', -1 do - delete :destroy, :id => 8 - assert_response 302 - end - end - - def test_destroy_version_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - assert_difference 'Attachment.count', -1 do - delete :destroy, :id => 9 - assert_response 302 - end - end - - def test_destroy_without_permission - set_tmp_attachments_directory - assert_no_difference 'Attachment.count' do - delete :destroy, :id => 3 - end - assert_response 302 - assert Attachment.find_by_id(3) - end -end diff --git a/test/functional/auth_sources_controller_test.rb b/test/functional/auth_sources_controller_test.rb deleted file mode 100644 index 0ee9e3536..000000000 --- a/test/functional/auth_sources_controller_test.rb +++ /dev/null @@ -1,168 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AuthSourcesControllerTest < ActionController::TestCase - fixtures :users, :auth_sources - - def setup - @request.session[:user_id] = 1 - end - - def test_index - get :index - - assert_response :success - assert_template 'index' - assert_not_nil assigns(:auth_sources) - end - - def test_new - get :new - - assert_response :success - assert_template 'new' - - source = assigns(:auth_source) - assert_equal AuthSourceLdap, source.class - assert source.new_record? - - assert_select 'form#auth_source_form' do - assert_select 'input[name=type][value=AuthSourceLdap]' - assert_select 'input[name=?]', 'auth_source[host]' - end - end - - def test_new_with_invalid_type_should_respond_with_404 - get :new, :type => 'foo' - assert_response 404 - end - - def test_create - assert_difference 'AuthSourceLdap.count' do - post :create, :type => 'AuthSourceLdap', :auth_source => {:name => 'Test', :host => '127.0.0.1', :port => '389', :attr_login => 'cn'} - assert_redirected_to '/auth_sources' - end - - source = AuthSourceLdap.order('id DESC').first - assert_equal 'Test', source.name - assert_equal '127.0.0.1', source.host - assert_equal 389, source.port - assert_equal 'cn', source.attr_login - end - - def test_create_with_failure - assert_no_difference 'AuthSourceLdap.count' do - post :create, :type => 'AuthSourceLdap', :auth_source => {:name => 'Test', :host => '', :port => '389', :attr_login => 'cn'} - assert_response :success - assert_template 'new' - end - assert_error_tag :content => /host can't be blank/i - end - - def test_edit - get :edit, :id => 1 - - assert_response :success - assert_template 'edit' - - assert_select 'form#auth_source_form' do - assert_select 'input[name=?]', 'auth_source[host]' - end - end - - def test_edit_should_not_contain_password - AuthSource.find(1).update_column :account_password, 'secret' - - get :edit, :id => 1 - assert_response :success - assert_select 'input[value=secret]', 0 - assert_select 'input[name=dummy_password][value=?]', /x+/ - end - - def test_edit_invalid_should_respond_with_404 - get :edit, :id => 99 - assert_response 404 - end - - def test_update - put :update, :id => 1, :auth_source => {:name => 'Renamed', :host => '192.168.0.10', :port => '389', :attr_login => 'uid'} - assert_redirected_to '/auth_sources' - - source = AuthSourceLdap.find(1) - assert_equal 'Renamed', source.name - assert_equal '192.168.0.10', source.host - end - - def test_update_with_failure - put :update, :id => 1, :auth_source => {:name => 'Renamed', :host => '', :port => '389', :attr_login => 'uid'} - assert_response :success - assert_template 'edit' - assert_error_tag :content => /host can't be blank/i - end - - def test_destroy - assert_difference 'AuthSourceLdap.count', -1 do - delete :destroy, :id => 1 - assert_redirected_to '/auth_sources' - end - end - - def test_destroy_auth_source_in_use - User.find(2).update_attribute :auth_source_id, 1 - - assert_no_difference 'AuthSourceLdap.count' do - delete :destroy, :id => 1 - assert_redirected_to '/auth_sources' - end - end - - def test_test_connection - AuthSourceLdap.any_instance.stubs(:test_connection).returns(true) - - get :test_connection, :id => 1 - assert_redirected_to '/auth_sources' - assert_not_nil flash[:notice] - assert_match /successful/i, flash[:notice] - end - - def test_test_connection_with_failure - AuthSourceLdap.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::LdapError.new("Something went wrong")) - - get :test_connection, :id => 1 - assert_redirected_to '/auth_sources' - assert_not_nil flash[:error] - assert_include 'Something went wrong', flash[:error] - end - - def test_autocomplete_for_new_user - AuthSource.expects(:search).with('foo').returns([ - {:login => 'foo1', :firstname => 'John', :lastname => 'Smith', :mail => 'foo1@example.net', :auth_source_id => 1}, - {:login => 'Smith', :firstname => 'John', :lastname => 'Doe', :mail => 'foo2@example.net', :auth_source_id => 1} - ]) - - get :autocomplete_for_new_user, :term => 'foo' - assert_response :success - assert_equal 'application/json', response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Array, json - assert_equal 2, json.size - assert_equal 'foo1', json.first['value'] - assert_equal 'foo1 (John Smith)', json.first['label'] - end -end diff --git a/test/functional/boards_controller_test.rb b/test/functional/boards_controller_test.rb deleted file mode 100644 index 5cfd23ade..000000000 --- a/test/functional/boards_controller_test.rb +++ /dev/null @@ -1,217 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class BoardsControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules - - def setup - User.current = nil - end - - def test_index - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:boards) - assert_not_nil assigns(:project) - end - - def test_index_not_found - get :index, :project_id => 97 - assert_response 404 - end - - def test_index_should_show_messages_if_only_one_board - Project.find(1).boards.slice(1..-1).each(&:destroy) - - get :index, :project_id => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:topics) - end - - def test_show - get :show, :project_id => 1, :id => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:board) - assert_not_nil assigns(:project) - assert_not_nil assigns(:topics) - end - - def test_show_should_display_sticky_messages_first - Message.update_all(:sticky => 0) - Message.update_all({:sticky => 1}, {:id => 1}) - - get :show, :project_id => 1, :id => 1 - assert_response :success - - topics = assigns(:topics) - assert_not_nil topics - assert topics.size > 1, "topics size was #{topics.size}" - assert topics.first.sticky? - assert topics.first.updated_on < topics.second.updated_on - end - - def test_show_should_display_message_with_last_reply_first - Message.update_all(:sticky => 0) - - # Reply to an old topic - old_topic = Message.where(:board_id => 1, :parent_id => nil).order('created_on ASC').first - reply = Message.new(:board_id => 1, :subject => 'New reply', :content => 'New reply', :author_id => 2) - old_topic.children << reply - - get :show, :project_id => 1, :id => 1 - assert_response :success - topics = assigns(:topics) - assert_not_nil topics - assert_equal old_topic, topics.first - end - - def test_show_with_permission_should_display_the_new_message_form - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 1 - assert_response :success - assert_template 'show' - - assert_select 'form#message-form' do - assert_select 'input[name=?]', 'message[subject]' - end - end - - def test_show_atom - get :show, :project_id => 1, :id => 1, :format => 'atom' - assert_response :success - assert_template 'common/feed' - assert_not_nil assigns(:board) - assert_not_nil assigns(:project) - assert_not_nil assigns(:messages) - end - - def test_show_not_found - get :index, :project_id => 1, :id => 97 - assert_response 404 - end - - def test_new - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'select[name=?]', 'board[parent_id]' do - assert_select 'option', (Project.find(1).boards.size + 1) - assert_select 'option[value=]', :text => '' - assert_select 'option[value=1]', :text => 'Help' - end - end - - def test_new_without_project_boards - Project.find(1).boards.delete_all - @request.session[:user_id] = 2 - - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'select[name=?]', 'board[parent_id]', 0 - end - - def test_create - @request.session[:user_id] = 2 - assert_difference 'Board.count' do - post :create, :project_id => 1, :board => { :name => 'Testing', :description => 'Testing board creation'} - end - assert_redirected_to '/projects/ecookbook/settings/boards' - board = Board.first(:order => 'id DESC') - assert_equal 'Testing', board.name - assert_equal 'Testing board creation', board.description - end - - def test_create_with_parent - @request.session[:user_id] = 2 - assert_difference 'Board.count' do - post :create, :project_id => 1, :board => { :name => 'Testing', :description => 'Testing', :parent_id => 2} - end - assert_redirected_to '/projects/ecookbook/settings/boards' - board = Board.first(:order => 'id DESC') - assert_equal Board.find(2), board.parent - end - - def test_create_with_failure - @request.session[:user_id] = 2 - assert_no_difference 'Board.count' do - post :create, :project_id => 1, :board => { :name => '', :description => 'Testing board creation'} - end - assert_response :success - assert_template 'new' - end - - def test_edit - @request.session[:user_id] = 2 - get :edit, :project_id => 1, :id => 2 - assert_response :success - assert_template 'edit' - end - - def test_edit_with_parent - board = Board.generate!(:project_id => 1, :parent_id => 2) - @request.session[:user_id] = 2 - get :edit, :project_id => 1, :id => board.id - assert_response :success - assert_template 'edit' - - assert_select 'select[name=?]', 'board[parent_id]' do - assert_select 'option[value=2][selected=selected]' - end - end - - def test_update - @request.session[:user_id] = 2 - assert_no_difference 'Board.count' do - put :update, :project_id => 1, :id => 2, :board => { :name => 'Testing', :description => 'Testing board update'} - end - assert_redirected_to '/projects/ecookbook/settings/boards' - assert_equal 'Testing', Board.find(2).name - end - - def test_update_position - @request.session[:user_id] = 2 - put :update, :project_id => 1, :id => 2, :board => { :move_to => 'highest'} - assert_redirected_to '/projects/ecookbook/settings/boards' - board = Board.find(2) - assert_equal 1, board.position - end - - def test_update_with_failure - @request.session[:user_id] = 2 - put :update, :project_id => 1, :id => 2, :board => { :name => '', :description => 'Testing board update'} - assert_response :success - assert_template 'edit' - end - - def test_destroy - @request.session[:user_id] = 2 - assert_difference 'Board.count', -1 do - delete :destroy, :project_id => 1, :id => 2 - end - assert_redirected_to '/projects/ecookbook/settings/boards' - assert_nil Board.find_by_id(2) - end -end diff --git a/test/functional/calendars_controller_test.rb b/test/functional/calendars_controller_test.rb deleted file mode 100644 index 2c00cd5f6..000000000 --- a/test/functional/calendars_controller_test.rb +++ /dev/null @@ -1,84 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CalendarsControllerTest < ActionController::TestCase - fixtures :projects, - :trackers, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def test_show - get :show, :project_id => 1 - assert_response :success - assert_template 'calendar' - assert_not_nil assigns(:calendar) - end - - def test_show_should_run_custom_queries - @query = IssueQuery.create!(:name => 'Calendar', :is_public => true) - - get :show, :query_id => @query.id - assert_response :success - end - - def test_cross_project_calendar - get :show - assert_response :success - assert_template 'calendar' - assert_not_nil assigns(:calendar) - end - - def test_week_number_calculation - Setting.start_of_week = 7 - - get :show, :month => '1', :year => '2010' - assert_response :success - - assert_select 'tr' do - assert_select 'td.week-number', :text => '53' - assert_select 'td.odd', :text => '27' - assert_select 'td.even', :text => '2' - end - - assert_select 'tr' do - assert_select 'td.week-number', :text => '1' - assert_select 'td.odd', :text => '3' - assert_select 'td.even', :text => '9' - end - - Setting.start_of_week = 1 - get :show, :month => '1', :year => '2010' - assert_response :success - - assert_select 'tr' do - assert_select 'td.week-number', :text => '53' - assert_select 'td.even', :text => '28' - assert_select 'td.even', :text => '3' - end - - assert_select 'tr' do - assert_select 'td.week-number', :text => '1' - assert_select 'td.even', :text => '4' - assert_select 'td.even', :text => '10' - end - end -end diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb deleted file mode 100644 index bf25d591e..000000000 --- a/test/functional/comments_controller_test.rb +++ /dev/null @@ -1,64 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CommentsControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments - - def setup - User.current = nil - end - - def test_add_comment - @request.session[:user_id] = 2 - post :create, :id => 1, :comment => { :comments => 'This is a test comment' } - assert_redirected_to '/news/1' - - comment = News.find(1).comments.last - assert_not_nil comment - assert_equal 'This is a test comment', comment.comments - assert_equal User.find(2), comment.author - end - - def test_empty_comment_should_not_be_added - @request.session[:user_id] = 2 - assert_no_difference 'Comment.count' do - post :create, :id => 1, :comment => { :comments => '' } - assert_response :redirect - assert_redirected_to '/news/1' - end - end - - def test_create_should_be_denied_if_news_is_not_commentable - News.any_instance.stubs(:commentable?).returns(false) - @request.session[:user_id] = 2 - assert_no_difference 'Comment.count' do - post :create, :id => 1, :comment => { :comments => 'This is a test comment' } - assert_response 403 - end - end - - def test_destroy_comment - comments_count = News.find(1).comments.size - @request.session[:user_id] = 2 - delete :destroy, :id => 1, :comment_id => 2 - assert_redirected_to '/news/1' - assert_nil Comment.find_by_id(2) - assert_equal comments_count - 1, News.find(1).comments.size - end -end diff --git a/test/functional/contestnotifications_controller_test.rb b/test/functional/contestnotifications_controller_test.rb deleted file mode 100644 index 948955a87..000000000 --- a/test/functional/contestnotifications_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class ContestnotificationsControllerTest < ActionController::TestCase - setup do - @contestnotification = contestnotifications(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:contestnotifications) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create contestnotification" do - assert_difference('Contestnotification.count') do - post :create, contestnotification: { author_id: @contestnotification.author_id, comments_count: @contestnotification.comments_count, contest_id: @contestnotification.contest_id, description: @contestnotification.description, summary: @contestnotification.summary, title: @contestnotification.title } - end - - assert_redirected_to contestnotification_path(assigns(:contestnotification)) - end - - test "should show contestnotification" do - get :show, id: @contestnotification - assert_response :success - end - - test "should get edit" do - get :edit, id: @contestnotification - assert_response :success - end - - test "should update contestnotification" do - put :update, id: @contestnotification, contestnotification: { author_id: @contestnotification.author_id, comments_count: @contestnotification.comments_count, contest_id: @contestnotification.contest_id, description: @contestnotification.description, summary: @contestnotification.summary, title: @contestnotification.title } - assert_redirected_to contestnotification_path(assigns(:contestnotification)) - end - - test "should destroy contestnotification" do - assert_difference('Contestnotification.count', -1) do - delete :destroy, id: @contestnotification - end - - assert_redirected_to contestnotifications_path - end -end diff --git a/test/functional/context_menus_controller_test.rb b/test/functional/context_menus_controller_test.rb deleted file mode 100644 index 451ea0c9d..000000000 --- a/test/functional/context_menus_controller_test.rb +++ /dev/null @@ -1,252 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ContextMenusControllerTest < ActionController::TestCase - fixtures :projects, - :trackers, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :workflows, - :journals, :journal_details, - :versions, - :issues, :issue_statuses, :issue_categories, - :users, - :enumerations, - :time_entries - - def test_context_menu_one_issue - @request.session[:user_id] = 2 - get :issues, :ids => [1] - assert_response :success - assert_template 'context_menu' - - assert_select 'a.icon-edit[href=?]', '/issues/1/edit', :text => 'Edit' - assert_select 'a.icon-copy[href=?]', '/projects/ecookbook/issues/1/copy', :text => 'Copy' - assert_select 'a.icon-del[href=?]', '/issues?ids%5B%5D=1', :text => 'Delete' - - # Statuses - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bstatus_id%5D=5', :text => 'Closed' - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bpriority_id%5D=8', :text => 'Immediate' - # No inactive priorities - assert_select 'a', :text => /Inactive Priority/, :count => 0 - # Versions - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bfixed_version_id%5D=3', :text => '2.0' - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bfixed_version_id%5D=4', :text => 'eCookbook Subproject 1 - 2.0' - # Assignees - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bassigned_to_id%5D=3', :text => 'Dave Lopper' - end - - def test_context_menu_one_issue_by_anonymous - get :issues, :ids => [1] - assert_response :success - assert_template 'context_menu' - assert_tag :tag => 'a', :content => 'Delete', - :attributes => { :href => '#', - :class => 'icon-del disabled' } - end - - def test_context_menu_multiple_issues_of_same_project - @request.session[:user_id] = 2 - get :issues, :ids => [1, 2] - assert_response :success - assert_template 'context_menu' - assert_not_nil assigns(:issues) - assert_equal [1, 2], assigns(:issues).map(&:id).sort - - ids = assigns(:issues).map(&:id).sort.map {|i| "ids%5B%5D=#{i}"}.join('&') - - assert_select 'a.icon-edit[href=?]', "/issues/bulk_edit?#{ids}", :text => 'Edit' - assert_select 'a.icon-copy[href=?]', "/issues/bulk_edit?copy=1&#{ids}", :text => 'Copy' - assert_select 'a.icon-del[href=?]', "/issues?#{ids}", :text => 'Delete' - - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bstatus_id%5D=5", :text => 'Closed' - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bpriority_id%5D=8", :text => 'Immediate' - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bassigned_to_id%5D=3", :text => 'Dave Lopper' - end - - def test_context_menu_multiple_issues_of_different_projects - @request.session[:user_id] = 2 - get :issues, :ids => [1, 2, 6] - assert_response :success - assert_template 'context_menu' - assert_not_nil assigns(:issues) - assert_equal [1, 2, 6], assigns(:issues).map(&:id).sort - - ids = assigns(:issues).map(&:id).sort.map {|i| "ids%5B%5D=#{i}"}.join('&') - - assert_select 'a.icon-edit[href=?]', "/issues/bulk_edit?#{ids}", :text => 'Edit' - assert_select 'a.icon-del[href=?]', "/issues?#{ids}", :text => 'Delete' - - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bstatus_id%5D=5", :text => 'Closed' - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bpriority_id%5D=8", :text => 'Immediate' - assert_select 'a[href=?]', "/issues/bulk_update?#{ids}&issue%5Bassigned_to_id%5D=2", :text => 'John Smith' - end - - def test_context_menu_should_include_list_custom_fields - field = IssueCustomField.create!(:name => 'List', :field_format => 'list', - :possible_values => ['Foo', 'Bar'], :is_for_all => true, :tracker_ids => [1, 2, 3]) - @request.session[:user_id] = 2 - get :issues, :ids => [1] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'List' - assert_select 'ul' do - assert_select 'a', 3 - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=Foo", :text => 'Foo' - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__", :text => 'none' - end - end - end - - def test_context_menu_should_not_include_null_value_for_required_custom_fields - field = IssueCustomField.create!(:name => 'List', :is_required => true, :field_format => 'list', - :possible_values => ['Foo', 'Bar'], :is_for_all => true, :tracker_ids => [1, 2, 3]) - @request.session[:user_id] = 2 - get :issues, :ids => [1, 2] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'List' - assert_select 'ul' do - assert_select 'a', 2 - assert_select 'a', :text => 'none', :count => 0 - end - end - end - - def test_context_menu_on_single_issue_should_select_current_custom_field_value - field = IssueCustomField.create!(:name => 'List', :field_format => 'list', - :possible_values => ['Foo', 'Bar'], :is_for_all => true, :tracker_ids => [1, 2, 3]) - issue = Issue.find(1) - issue.custom_field_values = {field.id => 'Bar'} - issue.save! - @request.session[:user_id] = 2 - get :issues, :ids => [1] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'List' - assert_select 'ul' do - assert_select 'a', 3 - assert_select 'a.icon-checked', :text => 'Bar' - end - end - end - - def test_context_menu_should_include_bool_custom_fields - field = IssueCustomField.create!(:name => 'Bool', :field_format => 'bool', - :is_for_all => true, :tracker_ids => [1, 2, 3]) - @request.session[:user_id] = 2 - get :issues, :ids => [1] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'Bool' - assert_select 'ul' do - assert_select 'a', 3 - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=0", :text => 'No' - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=1", :text => 'Yes' - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__", :text => 'none' - end - end - end - - def test_context_menu_should_include_user_custom_fields - field = IssueCustomField.create!(:name => 'User', :field_format => 'user', - :is_for_all => true, :tracker_ids => [1, 2, 3]) - @request.session[:user_id] = 2 - get :issues, :ids => [1] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'User' - assert_select 'ul' do - assert_select 'a', Project.find(1).members.count + 1 - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=2", :text => 'John Smith' - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__", :text => 'none' - end - end - end - - def test_context_menu_should_include_version_custom_fields - field = IssueCustomField.create!(:name => 'Version', :field_format => 'version', :is_for_all => true, :tracker_ids => [1, 2, 3]) - @request.session[:user_id] = 2 - get :issues, :ids => [1] - - assert_select "li.cf_#{field.id}" do - assert_select 'a[href=#]', :text => 'Version' - assert_select 'ul' do - assert_select 'a', Project.find(1).shared_versions.count + 1 - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=3", :text => '2.0' - assert_select 'a[href=?]', "/issues/bulk_update?ids%5B%5D=1&issue%5Bcustom_field_values%5D%5B#{field.id}%5D=__none__", :text => 'none' - end - end - end - - def test_context_menu_by_assignable_user_should_include_assigned_to_me_link - @request.session[:user_id] = 2 - get :issues, :ids => [1] - assert_response :success - assert_template 'context_menu' - - assert_select 'a[href=?]', '/issues/bulk_update?ids%5B%5D=1&issue%5Bassigned_to_id%5D=2', :text => / me / - end - - def test_context_menu_should_propose_shared_versions_for_issues_from_different_projects - @request.session[:user_id] = 2 - version = Version.create!(:name => 'Shared', :sharing => 'system', :project_id => 1) - - get :issues, :ids => [1, 4] - assert_response :success - assert_template 'context_menu' - - assert_include version, assigns(:versions) - assert_select 'a', :text => 'eCookbook - Shared' - end - - def test_context_menu_issue_visibility - get :issues, :ids => [1, 4] - assert_response :success - assert_template 'context_menu' - assert_equal [1], assigns(:issues).collect(&:id) - end - - def test_should_respond_with_404_without_ids - get :issues - assert_response 404 - end - - def test_time_entries_context_menu - @request.session[:user_id] = 2 - get :time_entries, :ids => [1, 2] - assert_response :success - assert_template 'time_entries' - - assert_select 'a:not(.disabled)', :text => 'Edit' - end - - def test_time_entries_context_menu_without_edit_permission - @request.session[:user_id] = 2 - Role.find_by_name('Manager').remove_permission! :edit_time_entries - - get :time_entries, :ids => [1, 2] - assert_response :success - assert_template 'time_entries' - assert_select 'a.disabled', :text => 'Edit' - end -end diff --git a/test/functional/custom_fields_controller_test.rb b/test/functional/custom_fields_controller_test.rb deleted file mode 100644 index bc642c721..000000000 --- a/test/functional/custom_fields_controller_test.rb +++ /dev/null @@ -1,176 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CustomFieldsControllerTest < ActionController::TestCase - fixtures :custom_fields, :custom_values, :trackers, :users - - def setup - @request.session[:user_id] = 1 - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_new - custom_field_classes.each do |klass| - get :new, :type => klass.name - assert_response :success - assert_template 'new' - assert_kind_of klass, assigns(:custom_field) - assert_select 'form#custom_field_form' do - assert_select 'select#custom_field_field_format[name=?]', 'custom_field[field_format]' - assert_select 'input[type=hidden][name=type][value=?]', klass.name - end - end - end - - def test_new_issue_custom_field - get :new, :type => 'IssueCustomField' - assert_response :success - assert_template 'new' - assert_select 'form#custom_field_form' do - assert_select 'select#custom_field_field_format[name=?]', 'custom_field[field_format]' do - assert_select 'option[value=user]', :text => 'User' - assert_select 'option[value=version]', :text => 'Version' - end - assert_select 'input[type=hidden][name=type][value=IssueCustomField]' - end - end - - def test_default_value_should_be_an_input_for_string_custom_field - get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'string'} - assert_response :success - assert_select 'input[name=?]', 'custom_field[default_value]' - end - - def test_default_value_should_be_a_textarea_for_text_custom_field - get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'text'} - assert_response :success - assert_select 'textarea[name=?]', 'custom_field[default_value]' - end - - def test_default_value_should_be_a_checkbox_for_bool_custom_field - get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'bool'} - assert_response :success - assert_select 'input[name=?][type=checkbox]', 'custom_field[default_value]' - end - - def test_default_value_should_not_be_present_for_user_custom_field - get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'user'} - assert_response :success - assert_select '[name=?]', 'custom_field[default_value]', 0 - end - - def test_new_js - get :new, :type => 'IssueCustomField', :custom_field => {:field_format => 'list'}, :format => 'js' - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - - field = assigns(:custom_field) - assert_equal 'list', field.field_format - end - - def test_new_with_invalid_custom_field_class_should_render_404 - get :new, :type => 'UnknownCustomField' - assert_response 404 - end - - def test_create_list_custom_field - assert_difference 'CustomField.count' do - post :create, :type => "IssueCustomField", - :custom_field => {:name => "test_post_new_list", - :default_value => "", - :min_length => "0", - :searchable => "0", - :regexp => "", - :is_for_all => "1", - :possible_values => "0.1\n0.2\n", - :max_length => "0", - :is_filter => "0", - :is_required =>"0", - :field_format => "list", - :tracker_ids => ["1", ""]} - end - assert_redirected_to '/custom_fields?tab=IssueCustomField' - field = IssueCustomField.find_by_name('test_post_new_list') - assert_not_nil field - assert_equal ["0.1", "0.2"], field.possible_values - assert_equal 1, field.trackers.size - end - - def test_create_with_failure - assert_no_difference 'CustomField.count' do - post :create, :type => "IssueCustomField", :custom_field => {:name => ''} - end - assert_response :success - assert_template 'new' - end - - def test_edit - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - assert_tag 'input', :attributes => {:name => 'custom_field[name]', :value => 'Database'} - end - - def test_edit_invalid_custom_field_should_render_404 - get :edit, :id => 99 - assert_response 404 - end - - def test_update - put :update, :id => 1, :custom_field => {:name => 'New name'} - assert_redirected_to '/custom_fields?tab=IssueCustomField' - - field = CustomField.find(1) - assert_equal 'New name', field.name - end - - def test_update_with_failure - put :update, :id => 1, :custom_field => {:name => ''} - assert_response :success - assert_template 'edit' - end - - def test_destroy - custom_values_count = CustomValue.count(:conditions => {:custom_field_id => 1}) - assert custom_values_count > 0 - - assert_difference 'CustomField.count', -1 do - assert_difference 'CustomValue.count', - custom_values_count do - delete :destroy, :id => 1 - end - end - - assert_redirected_to '/custom_fields?tab=IssueCustomField' - assert_nil CustomField.find_by_id(1) - assert_nil CustomValue.find_by_custom_field_id(1) - end - - def custom_field_classes - files = Dir.glob(File.join(Rails.root, 'app/models/*_custom_field.rb')).map {|f| File.basename(f).sub(/\.rb$/, '') } - classes = files.map(&:classify).map(&:constantize) - assert classes.size > 0 - classes - end -end diff --git a/test/functional/documents_controller_test.rb b/test/functional/documents_controller_test.rb deleted file mode 100644 index 580ffe80a..000000000 --- a/test/functional/documents_controller_test.rb +++ /dev/null @@ -1,186 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class DocumentsControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, - :enabled_modules, :documents, :enumerations, - :groups_users, :attachments - - def setup - User.current = nil - end - - def test_index - # Sets a default category - e = Enumeration.find_by_name('Technical documentation') - e.update_attributes(:is_default => true) - - get :index, :project_id => 'ecookbook' - assert_response :success - assert_template 'index' - assert_not_nil assigns(:grouped) - - # Default category selected in the new document form - assert_tag :select, :attributes => {:name => 'document[category_id]'}, - :child => {:tag => 'option', :attributes => {:selected => 'selected'}, - :content => 'Technical documentation'} - - assert ! DocumentCategory.find(16).active? - assert_no_tag :option, :attributes => {:value => '16'}, - :parent => {:tag => 'select', :attributes => {:id => 'document_category_id'} } - end - - def test_index_grouped_by_date - get :index, :project_id => 'ecookbook', :sort_by => 'date' - assert_response :success - assert_tag 'h3', :content => '2007-02-12' - end - - def test_index_grouped_by_title - get :index, :project_id => 'ecookbook', :sort_by => 'title' - assert_response :success - assert_tag 'h3', :content => 'T' - end - - def test_index_grouped_by_author - get :index, :project_id => 'ecookbook', :sort_by => 'author' - assert_response :success - assert_tag 'h3', :content => 'John Smith' - end - - def test_index_with_long_description - # adds a long description to the first document - doc = documents(:documents_001) - doc.update_attributes(:description => < 'ecookbook' - assert_response :success - assert_template 'index' - - # should only truncate on new lines to avoid breaking wiki formatting - assert_select '.wiki p', :text => (doc.description.split("\n").first + '...') - assert_select '.wiki p', :text => Regexp.new(Regexp.escape("EndOfLineHere...")) - end - - def test_show - get :show, :id => 1 - assert_response :success - assert_template 'show' - end - - def test_new - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - end - - def test_create_with_one_attachment - ActionMailer::Base.deliveries.clear - @request.session[:user_id] = 2 - set_tmp_attachments_directory - - with_settings :notified_events => %w(document_added) do - post :create, :project_id => 'ecookbook', - :document => { :title => 'DocumentsControllerTest#test_post_new', - :description => 'This is a new document', - :category_id => 2}, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - end - assert_redirected_to '/projects/ecookbook/documents' - - document = Document.find_by_title('DocumentsControllerTest#test_post_new') - assert_not_nil document - assert_equal Enumeration.find(2), document.category - assert_equal 1, document.attachments.size - assert_equal 'testfile.txt', document.attachments.first.filename - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_create_with_failure - @request.session[:user_id] = 2 - assert_no_difference 'Document.count' do - post :create, :project_id => 'ecookbook', :document => { :title => ''} - end - assert_response :success - assert_template 'new' - end - - def test_create_non_default_category - @request.session[:user_id] = 2 - category2 = Enumeration.find_by_name('User documentation') - category2.update_attributes(:is_default => true) - category1 = Enumeration.find_by_name('Uncategorized') - post :create, - :project_id => 'ecookbook', - :document => { :title => 'no default', - :description => 'This is a new document', - :category_id => category1.id } - assert_redirected_to '/projects/ecookbook/documents' - doc = Document.find_by_title('no default') - assert_not_nil doc - assert_equal category1.id, doc.category_id - assert_equal category1, doc.category - end - - def test_edit - @request.session[:user_id] = 2 - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - end - - def test_update - @request.session[:user_id] = 2 - put :update, :id => 1, :document => {:title => 'test_update'} - assert_redirected_to '/documents/1' - document = Document.find(1) - assert_equal 'test_update', document.title - end - - def test_update_with_failure - @request.session[:user_id] = 2 - put :update, :id => 1, :document => {:title => ''} - assert_response :success - assert_template 'edit' - end - - def test_destroy - @request.session[:user_id] = 2 - assert_difference 'Document.count', -1 do - delete :destroy, :id => 1 - end - assert_redirected_to '/projects/ecookbook/documents' - assert_nil Document.find_by_id(1) - end - - def test_add_attachment - @request.session[:user_id] = 2 - assert_difference 'Attachment.count' do - post :add_attachment, :id => 1, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - end - attachment = Attachment.first(:order => 'id DESC') - assert_equal Document.find(1), attachment.container - end -end diff --git a/test/functional/enumerations_controller_test.rb b/test/functional/enumerations_controller_test.rb deleted file mode 100644 index 9dc273d49..000000000 --- a/test/functional/enumerations_controller_test.rb +++ /dev/null @@ -1,136 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class EnumerationsControllerTest < ActionController::TestCase - fixtures :enumerations, :issues, :users - - def setup - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_index_should_require_admin - @request.session[:user_id] = nil - get :index - assert_response 302 - end - - def test_new - get :new, :type => 'IssuePriority' - assert_response :success - assert_template 'new' - assert_kind_of IssuePriority, assigns(:enumeration) - assert_tag 'input', :attributes => {:name => 'enumeration[type]', :value => 'IssuePriority'} - assert_tag 'input', :attributes => {:name => 'enumeration[name]'} - end - - def test_new_with_invalid_type_should_respond_with_404 - get :new, :type => 'UnknownType' - assert_response 404 - end - - def test_create - assert_difference 'IssuePriority.count' do - post :create, :enumeration => {:type => 'IssuePriority', :name => 'Lowest'} - end - assert_redirected_to '/enumerations' - e = IssuePriority.find_by_name('Lowest') - assert_not_nil e - end - - def test_create_with_failure - assert_no_difference 'IssuePriority.count' do - post :create, :enumeration => {:type => 'IssuePriority', :name => ''} - end - assert_response :success - assert_template 'new' - end - - def test_edit - get :edit, :id => 6 - assert_response :success - assert_template 'edit' - assert_tag 'input', :attributes => {:name => 'enumeration[name]', :value => 'High'} - end - - def test_edit_invalid_should_respond_with_404 - get :edit, :id => 999 - assert_response 404 - end - - def test_update - assert_no_difference 'IssuePriority.count' do - put :update, :id => 6, :enumeration => {:type => 'IssuePriority', :name => 'New name'} - end - assert_redirected_to '/enumerations' - e = IssuePriority.find(6) - assert_equal 'New name', e.name - end - - def test_update_with_failure - assert_no_difference 'IssuePriority.count' do - put :update, :id => 6, :enumeration => {:type => 'IssuePriority', :name => ''} - end - assert_response :success - assert_template 'edit' - end - - def test_destroy_enumeration_not_in_use - assert_difference 'IssuePriority.count', -1 do - delete :destroy, :id => 7 - end - assert_redirected_to :controller => 'enumerations', :action => 'index' - assert_nil Enumeration.find_by_id(7) - end - - def test_destroy_enumeration_in_use - assert_no_difference 'IssuePriority.count' do - delete :destroy, :id => 4 - end - assert_response :success - assert_template 'destroy' - assert_not_nil Enumeration.find_by_id(4) - assert_select 'select[name=reassign_to_id]' do - assert_select 'option[value=6]', :text => 'High' - end - end - - def test_destroy_enumeration_in_use_with_reassignment - issue = Issue.where(:priority_id => 4).first - assert_difference 'IssuePriority.count', -1 do - delete :destroy, :id => 4, :reassign_to_id => 6 - end - assert_redirected_to :controller => 'enumerations', :action => 'index' - assert_nil Enumeration.find_by_id(4) - # check that the issue was reassign - assert_equal 6, issue.reload.priority_id - end - - def test_destroy_enumeration_in_use_with_blank_reassignment - assert_no_difference 'IssuePriority.count' do - delete :destroy, :id => 4, :reassign_to_id => '' - end - assert_response :success - end -end diff --git a/test/functional/files_controller_test.rb b/test/functional/files_controller_test.rb deleted file mode 100644 index 879ec0c98..000000000 --- a/test/functional/files_controller_test.rb +++ /dev/null @@ -1,109 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class FilesControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :journals, :journal_details, - :attachments, - :versions - - def setup - @request.session[:user_id] = nil - Setting.default_language = 'en' - end - - def test_index - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:containers) - - # file attached to the project - assert_tag :a, :content => 'project_file.zip', - :attributes => { :href => '/attachments/download/8/project_file.zip' } - - # file attached to a project's version - assert_tag :a, :content => 'version_file.zip', - :attributes => { :href => '/attachments/download/9/version_file.zip' } - end - - def test_new - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_tag 'select', :attributes => {:name => 'version_id'} - end - - def test_new_without_versions - Version.delete_all - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_no_tag 'select', :attributes => {:name => 'version_id'} - end - - def test_create_file - set_tmp_attachments_directory - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - with_settings :notified_events => %w(file_added) do - assert_difference 'Attachment.count' do - post :create, :project_id => 1, :version_id => '', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - assert_response :redirect - end - end - assert_redirected_to '/projects/ecookbook/files' - a = Attachment.order('created_on DESC').first - assert_equal 'testfile.txt', a.filename - assert_equal Project.find(1), a.container - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_equal "[eCookbook] New file", mail.subject - assert_mail_body_match 'testfile.txt', mail - end - - def test_create_version_file - set_tmp_attachments_directory - @request.session[:user_id] = 2 - - assert_difference 'Attachment.count' do - post :create, :project_id => 1, :version_id => '2', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - assert_response :redirect - end - assert_redirected_to '/projects/ecookbook/files' - a = Attachment.order('created_on DESC').first - assert_equal 'testfile.txt', a.filename - assert_equal Version.find(2), a.container - end - -end diff --git a/test/functional/forums_controller_test.rb b/test/functional/forums_controller_test.rb deleted file mode 100644 index 9b0438bd2..000000000 --- a/test/functional/forums_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class ForumsControllerTest < ActionController::TestCase - setup do - @forum = forums(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:forums) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create forum" do - assert_difference('Forum.count') do - post :create, forum: { } - end - - assert_redirected_to forum_path(assigns(:forum)) - end - - test "should show forum" do - get :show, id: @forum - assert_response :success - end - - test "should get edit" do - get :edit, id: @forum - assert_response :success - end - - test "should update forum" do - put :update, id: @forum, forum: { } - assert_redirected_to forum_path(assigns(:forum)) - end - - test "should destroy forum" do - assert_difference('Forum.count', -1) do - delete :destroy, id: @forum - end - - assert_redirected_to forums_path - end -end diff --git a/test/functional/gantts_controller_test.rb b/test/functional/gantts_controller_test.rb deleted file mode 100644 index ce8dd9832..000000000 --- a/test/functional/gantts_controller_test.rb +++ /dev/null @@ -1,122 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class GanttsControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :versions - - def test_gantt_should_work - i2 = Issue.find(2) - i2.update_attribute(:due_date, 1.month.from_now) - get :show, :project_id => 1 - assert_response :success - assert_template 'gantts/show' - assert_not_nil assigns(:gantt) - # Issue with start and due dates - i = Issue.find(1) - assert_not_nil i.due_date - assert_select "div a.issue", /##{i.id}/ - # Issue with on a targeted version should not be in the events but loaded in the html - i = Issue.find(2) - assert_select "div a.issue", /##{i.id}/ - end - - def test_gantt_should_work_without_issue_due_dates - Issue.update_all("due_date = NULL") - get :show, :project_id => 1 - assert_response :success - assert_template 'gantts/show' - assert_not_nil assigns(:gantt) - end - - def test_gantt_should_work_without_issue_and_version_due_dates - Issue.update_all("due_date = NULL") - Version.update_all("effective_date = NULL") - get :show, :project_id => 1 - assert_response :success - assert_template 'gantts/show' - assert_not_nil assigns(:gantt) - end - - def test_gantt_should_work_cross_project - get :show - assert_response :success - assert_template 'gantts/show' - assert_not_nil assigns(:gantt) - assert_not_nil assigns(:gantt).query - assert_nil assigns(:gantt).project - end - - def test_gantt_should_not_disclose_private_projects - get :show - assert_response :success - assert_template 'gantts/show' - assert_tag 'a', :content => /eCookbook/ - # Root private project - assert_no_tag 'a', {:content => /OnlineStore/} - # Private children of a public project - assert_no_tag 'a', :content => /Private child of eCookbook/ - end - - def test_gantt_should_display_relations - IssueRelation.delete_all - issue1 = Issue.generate!(:start_date => 1.day.from_now, :due_date => 3.day.from_now) - issue2 = Issue.generate!(:start_date => 1.day.from_now, :due_date => 3.day.from_now) - IssueRelation.create!(:issue_from => issue1, :issue_to => issue2, :relation_type => 'precedes') - - get :show - assert_response :success - - relations = assigns(:gantt).relations - assert_kind_of Hash, relations - assert relations.present? - assert_select 'div.task_todo[id=?][data-rels*=?]', "task-todo-issue-#{issue1.id}", issue2.id.to_s - assert_select 'div.task_todo[id=?]:not([data-rels])', "task-todo-issue-#{issue2.id}" - end - - def test_gantt_should_export_to_pdf - get :show, :project_id => 1, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - assert_not_nil assigns(:gantt) - end - - def test_gantt_should_export_to_pdf_cross_project - get :show, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - assert_not_nil assigns(:gantt) - end - - if Object.const_defined?(:Magick) - def test_gantt_should_export_to_png - get :show, :project_id => 1, :format => 'png' - assert_response :success - assert_equal 'image/png', @response.content_type - end - end -end diff --git a/test/functional/groups_controller_test.rb b/test/functional/groups_controller_test.rb deleted file mode 100644 index 2034d4853..000000000 --- a/test/functional/groups_controller_test.rb +++ /dev/null @@ -1,202 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class GroupsControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :groups_users - - def setup - @request.session[:user_id] = 1 - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_show - get :show, :id => 10 - assert_response :success - assert_template 'show' - end - - def test_show_invalid_should_return_404 - get :show, :id => 99 - assert_response 404 - end - - def test_new - get :new - assert_response :success - assert_template 'new' - assert_select 'input[name=?]', 'group[name]' - end - - def test_create - assert_difference 'Group.count' do - post :create, :group => {:name => 'New group'} - end - assert_redirected_to '/groups' - group = Group.first(:order => 'id DESC') - assert_equal 'New group', group.name - assert_equal [], group.users - end - - def test_create_and_continue - assert_difference 'Group.count' do - post :create, :group => {:name => 'New group'}, :continue => 'Create and continue' - end - assert_redirected_to '/groups/new' - group = Group.first(:order => 'id DESC') - assert_equal 'New group', group.name - end - - def test_create_with_failure - assert_no_difference 'Group.count' do - post :create, :group => {:name => ''} - end - assert_response :success - assert_template 'new' - end - - def test_edit - get :edit, :id => 10 - assert_response :success - assert_template 'edit' - - assert_select 'div#tab-content-users' - assert_select 'div#tab-content-memberships' do - assert_select 'a', :text => 'Private child of eCookbook' - end - end - - def test_update - new_name = 'New name' - put :update, :id => 10, :group => {:name => new_name} - assert_redirected_to '/groups' - group = Group.find(10) - assert_equal new_name, group.name - end - - def test_update_with_failure - put :update, :id => 10, :group => {:name => ''} - assert_response :success - assert_template 'edit' - end - - def test_destroy - assert_difference 'Group.count', -1 do - post :destroy, :id => 10 - end - assert_redirected_to '/groups' - end - - def test_add_users - assert_difference 'Group.find(10).users.count', 2 do - post :add_users, :id => 10, :user_ids => ['2', '3'] - end - end - - def test_xhr_add_users - assert_difference 'Group.find(10).users.count', 2 do - xhr :post, :add_users, :id => 10, :user_ids => ['2', '3'] - assert_response :success - assert_template 'add_users' - assert_equal 'text/javascript', response.content_type - end - assert_match /John Smith/, response.body - end - - def test_remove_user - assert_difference 'Group.find(10).users.count', -1 do - delete :remove_user, :id => 10, :user_id => '8' - end - end - - def test_xhr_remove_user - assert_difference 'Group.find(10).users.count', -1 do - xhr :delete, :remove_user, :id => 10, :user_id => '8' - assert_response :success - assert_template 'remove_user' - assert_equal 'text/javascript', response.content_type - end - end - - def test_new_membership - assert_difference 'Group.find(10).members.count' do - post :edit_membership, :id => 10, :membership => { :project_id => 2, :role_ids => ['1', '2']} - end - end - - def test_xhr_new_membership - assert_difference 'Group.find(10).members.count' do - xhr :post, :edit_membership, :id => 10, :membership => { :project_id => 2, :role_ids => ['1', '2']} - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - assert_match /OnlineStore/, response.body - end - - def test_xhr_new_membership_with_failure - assert_no_difference 'Group.find(10).members.count' do - xhr :post, :edit_membership, :id => 10, :membership => { :project_id => 999, :role_ids => ['1', '2']} - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - assert_match /alert/, response.body, "Alert message not sent" - end - - def test_edit_membership - assert_no_difference 'Group.find(10).members.count' do - post :edit_membership, :id => 10, :membership_id => 6, :membership => { :role_ids => ['1', '3']} - end - end - - def test_xhr_edit_membership - assert_no_difference 'Group.find(10).members.count' do - xhr :post, :edit_membership, :id => 10, :membership_id => 6, :membership => { :role_ids => ['1', '3']} - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - end - - def test_destroy_membership - assert_difference 'Group.find(10).members.count', -1 do - post :destroy_membership, :id => 10, :membership_id => 6 - end - end - - def test_xhr_destroy_membership - assert_difference 'Group.find(10).members.count', -1 do - xhr :post, :destroy_membership, :id => 10, :membership_id => 6 - assert_response :success - assert_template 'destroy_membership' - assert_equal 'text/javascript', response.content_type - end - end - - def test_autocomplete_for_user - get :autocomplete_for_user, :id => 10, :q => 'smi', :format => 'js' - assert_response :success - assert_include 'John Smith', response.body - end -end diff --git a/test/functional/issue_categories_controller_test.rb b/test/functional/issue_categories_controller_test.rb deleted file mode 100644 index eef52bf55..000000000 --- a/test/functional/issue_categories_controller_test.rb +++ /dev/null @@ -1,145 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class IssueCategoriesControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :enabled_modules, :issue_categories, - :issues - - def setup - User.current = nil - @request.session[:user_id] = 2 - end - - def test_new - @request.session[:user_id] = 2 # manager - get :new, :project_id => '1' - assert_response :success - assert_template 'new' - assert_select 'input[name=?]', 'issue_category[name]' - end - - def test_new_from_issue_form - @request.session[:user_id] = 2 # manager - xhr :get, :new, :project_id => '1' - - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - end - - def test_create - @request.session[:user_id] = 2 # manager - assert_difference 'IssueCategory.count' do - post :create, :project_id => '1', :issue_category => {:name => 'New category'} - end - assert_redirected_to '/projects/ecookbook/settings/categories' - category = IssueCategory.find_by_name('New category') - assert_not_nil category - assert_equal 1, category.project_id - end - - def test_create_failure - @request.session[:user_id] = 2 - post :create, :project_id => '1', :issue_category => {:name => ''} - assert_response :success - assert_template 'new' - end - - def test_create_from_issue_form - @request.session[:user_id] = 2 # manager - assert_difference 'IssueCategory.count' do - xhr :post, :create, :project_id => '1', :issue_category => {:name => 'New category'} - end - category = IssueCategory.first(:order => 'id DESC') - assert_equal 'New category', category.name - - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - end - - def test_create_from_issue_form_with_failure - @request.session[:user_id] = 2 # manager - assert_no_difference 'IssueCategory.count' do - xhr :post, :create, :project_id => '1', :issue_category => {:name => ''} - end - - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - end - - def test_edit - @request.session[:user_id] = 2 - get :edit, :id => 2 - assert_response :success - assert_template 'edit' - assert_select 'input[name=?][value=?]', 'issue_category[name]', 'Recipes' - end - - def test_update - assert_no_difference 'IssueCategory.count' do - put :update, :id => 2, :issue_category => { :name => 'Testing' } - end - assert_redirected_to '/projects/ecookbook/settings/categories' - assert_equal 'Testing', IssueCategory.find(2).name - end - - def test_update_failure - put :update, :id => 2, :issue_category => { :name => '' } - assert_response :success - assert_template 'edit' - end - - def test_update_not_found - put :update, :id => 97, :issue_category => { :name => 'Testing' } - assert_response 404 - end - - def test_destroy_category_not_in_use - delete :destroy, :id => 2 - assert_redirected_to '/projects/ecookbook/settings/categories' - assert_nil IssueCategory.find_by_id(2) - end - - def test_destroy_category_in_use - delete :destroy, :id => 1 - assert_response :success - assert_template 'destroy' - assert_not_nil IssueCategory.find_by_id(1) - end - - def test_destroy_category_in_use_with_reassignment - issue = Issue.where(:category_id => 1).first - delete :destroy, :id => 1, :todo => 'reassign', :reassign_to_id => 2 - assert_redirected_to '/projects/ecookbook/settings/categories' - assert_nil IssueCategory.find_by_id(1) - # check that the issue was reassign - assert_equal 2, issue.reload.category_id - end - - def test_destroy_category_in_use_without_reassignment - issue = Issue.where(:category_id => 1).first - delete :destroy, :id => 1, :todo => 'nullify' - assert_redirected_to '/projects/ecookbook/settings/categories' - assert_nil IssueCategory.find_by_id(1) - # check that the issue category was nullified - assert_nil issue.reload.category_id - end -end diff --git a/test/functional/issue_relations_controller_test.rb b/test/functional/issue_relations_controller_test.rb deleted file mode 100644 index 055c58351..000000000 --- a/test/functional/issue_relations_controller_test.rb +++ /dev/null @@ -1,147 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class IssueRelationsControllerTest < ActionController::TestCase - fixtures :projects, - :users, - :roles, - :members, - :member_roles, - :issues, - :issue_statuses, - :issue_relations, - :enabled_modules, - :enumerations, - :trackers, - :projects_trackers - - def setup - User.current = nil - @request.session[:user_id] = 3 - end - - def test_create - assert_difference 'IssueRelation.count' do - post :create, :issue_id => 1, - :relation => {:issue_to_id => '2', :relation_type => 'relates', :delay => ''} - end - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 1, relation.issue_from_id - assert_equal 2, relation.issue_to_id - assert_equal 'relates', relation.relation_type - end - - def test_create_xhr - assert_difference 'IssueRelation.count' do - xhr :post, :create, :issue_id => 3, :relation => {:issue_to_id => '1', :relation_type => 'relates', :delay => ''} - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - end - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 3, relation.issue_from_id - assert_equal 1, relation.issue_to_id - - assert_match /Bug #1/, response.body - end - - def test_create_should_accept_id_with_hash - assert_difference 'IssueRelation.count' do - post :create, :issue_id => 1, - :relation => {:issue_to_id => '#2', :relation_type => 'relates', :delay => ''} - end - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 2, relation.issue_to_id - end - - def test_create_should_strip_id - assert_difference 'IssueRelation.count' do - post :create, :issue_id => 1, - :relation => {:issue_to_id => ' 2 ', :relation_type => 'relates', :delay => ''} - end - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 2, relation.issue_to_id - end - - def test_create_should_not_break_with_non_numerical_id - assert_no_difference 'IssueRelation.count' do - assert_nothing_raised do - post :create, :issue_id => 1, - :relation => {:issue_to_id => 'foo', :relation_type => 'relates', :delay => ''} - end - end - end - - def test_create_follows_relation_should_update_relations_list - issue1 = Issue.generate!(:subject => 'Followed issue', :start_date => Date.yesterday, :due_date => Date.today) - issue2 = Issue.generate! - - assert_difference 'IssueRelation.count' do - xhr :post, :create, :issue_id => issue2.id, - :relation => {:issue_to_id => issue1.id, :relation_type => 'follows', :delay => ''} - end - assert_match /Followed issue/, response.body - end - - def test_should_create_relations_with_visible_issues_only - Setting.cross_project_issue_relations = '1' - assert_nil Issue.visible(User.find(3)).find_by_id(4) - - assert_no_difference 'IssueRelation.count' do - post :create, :issue_id => 1, - :relation => {:issue_to_id => '4', :relation_type => 'relates', :delay => ''} - end - end - - should "prevent relation creation when there's a circular dependency" - - def test_create_xhr_with_failure - assert_no_difference 'IssueRelation.count' do - xhr :post, :create, :issue_id => 3, :relation => {:issue_to_id => '999', :relation_type => 'relates', :delay => ''} - - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - end - - assert_match /errorExplanation/, response.body - end - - def test_destroy - assert_difference 'IssueRelation.count', -1 do - delete :destroy, :id => '2' - end - end - - def test_destroy_xhr - IssueRelation.create!(:relation_type => IssueRelation::TYPE_RELATES) do |r| - r.issue_from_id = 3 - r.issue_to_id = 1 - end - - assert_difference 'IssueRelation.count', -1 do - xhr :delete, :destroy, :id => '2' - - assert_response :success - assert_template 'destroy' - assert_equal 'text/javascript', response.content_type - assert_match /relation-2/, response.body - end - end -end diff --git a/test/functional/issue_statuses_controller_test.rb b/test/functional/issue_statuses_controller_test.rb deleted file mode 100644 index 1e7d2fab4..000000000 --- a/test/functional/issue_statuses_controller_test.rb +++ /dev/null @@ -1,123 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class IssueStatusesControllerTest < ActionController::TestCase - fixtures :issue_statuses, :issues, :users - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_index_by_anonymous_should_redirect_to_login_form - @request.session[:user_id] = nil - get :index - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fissue_statuses' - end - - def test_index_by_user_should_respond_with_406 - @request.session[:user_id] = 2 - get :index - assert_response 406 - end - - def test_new - get :new - assert_response :success - assert_template 'new' - end - - def test_create - assert_difference 'IssueStatus.count' do - post :create, :issue_status => {:name => 'New status'} - end - assert_redirected_to :action => 'index' - status = IssueStatus.order('id DESC').first - assert_equal 'New status', status.name - end - - def test_create_with_failure - post :create, :issue_status => {:name => ''} - assert_response :success - assert_template 'new' - assert_error_tag :content => /name can't be blank/i - end - - def test_edit - get :edit, :id => '3' - assert_response :success - assert_template 'edit' - end - - def test_update - put :update, :id => '3', :issue_status => {:name => 'Renamed status'} - assert_redirected_to :action => 'index' - status = IssueStatus.find(3) - assert_equal 'Renamed status', status.name - end - - def test_update_with_failure - put :update, :id => '3', :issue_status => {:name => ''} - assert_response :success - assert_template 'edit' - assert_error_tag :content => /name can't be blank/i - end - - def test_destroy - Issue.delete_all("status_id = 1") - - assert_difference 'IssueStatus.count', -1 do - delete :destroy, :id => '1' - end - assert_redirected_to :action => 'index' - assert_nil IssueStatus.find_by_id(1) - end - - def test_destroy_should_block_if_status_in_use - assert_not_nil Issue.find_by_status_id(1) - - assert_no_difference 'IssueStatus.count' do - delete :destroy, :id => '1' - end - assert_redirected_to :action => 'index' - assert_not_nil IssueStatus.find_by_id(1) - end - - def test_update_issue_done_ratio_with_issue_done_ratio_set_to_issue_field - with_settings :issue_done_ratio => 'issue_field' do - post :update_issue_done_ratio - assert_match /not updated/, flash[:error].to_s - assert_redirected_to '/issue_statuses' - end - end - - def test_update_issue_done_ratio_with_issue_done_ratio_set_to_issue_status - with_settings :issue_done_ratio => 'issue_status' do - post :update_issue_done_ratio - assert_match /Issue done ratios updated/, flash[:notice].to_s - assert_redirected_to '/issue_statuses' - end - end -end diff --git a/test/functional/issues_controller_test.rb b/test/functional/issues_controller_test.rb deleted file mode 100644 index d0ead9b09..000000000 --- a/test/functional/issues_controller_test.rb +++ /dev/null @@ -1,3898 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class IssuesControllerTest < ActionController::TestCase - fixtures :projects, - :users, - :roles, - :members, - :member_roles, - :issues, - :issue_statuses, - :versions, - :trackers, - :projects_trackers, - :issue_categories, - :enabled_modules, - :enumerations, - :attachments, - :workflows, - :custom_fields, - :custom_values, - :custom_fields_projects, - :custom_fields_trackers, - :time_entries, - :journals, - :journal_details, - :queries, - :repositories, - :changesets - - include Redmine::I18n - - def setup - User.current = nil - end - - def test_index - with_settings :default_language => "en" do - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - assert_nil assigns(:project) - - # links to visible issues - assert_select 'a[href=/issues/1]', :text => /Can't print recipes/ - assert_select 'a[href=/issues/5]', :text => /Subproject issue/ - # private projects hidden - assert_select 'a[href=/issues/6]', 0 - assert_select 'a[href=/issues/4]', 0 - # project column - assert_select 'th', :text => /Project/ - end - end - - def test_index_should_not_list_issues_when_module_disabled - EnabledModule.delete_all("name = 'issue_tracking' AND project_id = 1") - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - assert_nil assigns(:project) - - assert_select 'a[href=/issues/1]', 0 - assert_select 'a[href=/issues/5]', :text => /Subproject issue/ - end - - def test_index_should_list_visible_issues_only - get :index, :per_page => 100 - assert_response :success - assert_not_nil assigns(:issues) - assert_nil assigns(:issues).detect {|issue| !issue.visible?} - end - - def test_index_with_project - Setting.display_subprojects_issues = 0 - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - assert_select 'a[href=/issues/1]', :text => /Can't print recipes/ - assert_select 'a[href=/issues/5]', 0 - end - - def test_index_with_project_and_subprojects - Setting.display_subprojects_issues = 1 - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - assert_select 'a[href=/issues/1]', :text => /Can't print recipes/ - assert_select 'a[href=/issues/5]', :text => /Subproject issue/ - assert_select 'a[href=/issues/6]', 0 - end - - def test_index_with_project_and_subprojects_should_show_private_subprojects_with_permission - @request.session[:user_id] = 2 - Setting.display_subprojects_issues = 1 - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - assert_select 'a[href=/issues/1]', :text => /Can't print recipes/ - assert_select 'a[href=/issues/5]', :text => /Subproject issue/ - assert_select 'a[href=/issues/6]', :text => /Issue of a private subproject/ - end - - def test_index_with_project_and_default_filter - get :index, :project_id => 1, :set_filter => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - query = assigns(:query) - assert_not_nil query - # default filter - assert_equal({'status_id' => {:operator => 'o', :values => ['']}}, query.filters) - end - - def test_index_with_project_and_filter - get :index, :project_id => 1, :set_filter => 1, - :f => ['tracker_id'], - :op => {'tracker_id' => '='}, - :v => {'tracker_id' => ['1']} - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - query = assigns(:query) - assert_not_nil query - assert_equal({'tracker_id' => {:operator => '=', :values => ['1']}}, query.filters) - end - - def test_index_with_short_filters - to_test = { - 'status_id' => { - 'o' => { :op => 'o', :values => [''] }, - 'c' => { :op => 'c', :values => [''] }, - '7' => { :op => '=', :values => ['7'] }, - '7|3|4' => { :op => '=', :values => ['7', '3', '4'] }, - '=7' => { :op => '=', :values => ['7'] }, - '!3' => { :op => '!', :values => ['3'] }, - '!7|3|4' => { :op => '!', :values => ['7', '3', '4'] }}, - 'subject' => { - 'This is a subject' => { :op => '=', :values => ['This is a subject'] }, - 'o' => { :op => '=', :values => ['o'] }, - '~This is part of a subject' => { :op => '~', :values => ['This is part of a subject'] }, - '!~This is part of a subject' => { :op => '!~', :values => ['This is part of a subject'] }}, - 'tracker_id' => { - '3' => { :op => '=', :values => ['3'] }, - '=3' => { :op => '=', :values => ['3'] }}, - 'start_date' => { - '2011-10-12' => { :op => '=', :values => ['2011-10-12'] }, - '=2011-10-12' => { :op => '=', :values => ['2011-10-12'] }, - '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] }, - '<=2011-10-12' => { :op => '<=', :values => ['2011-10-12'] }, - '><2011-10-01|2011-10-30' => { :op => '><', :values => ['2011-10-01', '2011-10-30'] }, - ' { :op => ' ['2'] }, - '>t+2' => { :op => '>t+', :values => ['2'] }, - 't+2' => { :op => 't+', :values => ['2'] }, - 't' => { :op => 't', :values => [''] }, - 'w' => { :op => 'w', :values => [''] }, - '>t-2' => { :op => '>t-', :values => ['2'] }, - ' { :op => ' ['2'] }, - 't-2' => { :op => 't-', :values => ['2'] }}, - 'created_on' => { - '>=2011-10-12' => { :op => '>=', :values => ['2011-10-12'] }, - ' { :op => ' ['2'] }, - '>t-2' => { :op => '>t-', :values => ['2'] }, - 't-2' => { :op => 't-', :values => ['2'] }}, - 'cf_1' => { - 'c' => { :op => '=', :values => ['c'] }, - '!c' => { :op => '!', :values => ['c'] }, - '!*' => { :op => '!*', :values => [''] }, - '*' => { :op => '*', :values => [''] }}, - 'estimated_hours' => { - '=13.4' => { :op => '=', :values => ['13.4'] }, - '>=45' => { :op => '>=', :values => ['45'] }, - '<=125' => { :op => '<=', :values => ['125'] }, - '><10.5|20.5' => { :op => '><', :values => ['10.5', '20.5'] }, - '!*' => { :op => '!*', :values => [''] }, - '*' => { :op => '*', :values => [''] }} - } - - default_filter = { 'status_id' => {:operator => 'o', :values => [''] }} - - to_test.each do |field, expression_and_expected| - expression_and_expected.each do |filter_expression, expected| - - get :index, :set_filter => 1, field => filter_expression - - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - query = assigns(:query) - assert_not_nil query - assert query.has_filter?(field) - assert_equal(default_filter.merge({field => {:operator => expected[:op], :values => expected[:values]}}), query.filters) - end - end - end - - def test_index_with_project_and_empty_filters - get :index, :project_id => 1, :set_filter => 1, :fields => [''] - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - - query = assigns(:query) - assert_not_nil query - # no filter - assert_equal({}, query.filters) - end - - def test_index_with_project_custom_field_filter - field = ProjectCustomField.create!(:name => 'Client', :is_filter => true, :field_format => 'string') - CustomValue.create!(:custom_field => field, :customized => Project.find(3), :value => 'Foo') - CustomValue.create!(:custom_field => field, :customized => Project.find(5), :value => 'Foo') - filter_name = "project.cf_#{field.id}" - @request.session[:user_id] = 1 - - get :index, :set_filter => 1, - :f => [filter_name], - :op => {filter_name => '='}, - :v => {filter_name => ['Foo']} - assert_response :success - assert_template 'index' - assert_equal [3, 5], assigns(:issues).map(&:project_id).uniq.sort - end - - def test_index_with_query - get :index, :project_id => 1, :query_id => 5 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - assert_nil assigns(:issue_count_by_group) - end - - def test_index_with_query_grouped_by_tracker - get :index, :project_id => 1, :query_id => 6 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - assert_not_nil assigns(:issue_count_by_group) - end - - def test_index_with_query_grouped_by_list_custom_field - get :index, :project_id => 1, :query_id => 9 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues) - assert_not_nil assigns(:issue_count_by_group) - end - - def test_index_with_query_grouped_by_user_custom_field - cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '') - - get :index, :project_id => 1, :set_filter => 1, :group_by => "cf_#{cf.id}" - assert_response :success - - assert_select 'tr.group', 3 - assert_select 'tr.group' do - assert_select 'a', :text => 'John Smith' - assert_select 'span.count', :text => '1' - end - assert_select 'tr.group' do - assert_select 'a', :text => 'Dave Lopper' - assert_select 'span.count', :text => '2' - end - end - - def test_index_with_query_grouped_by_tracker - 3.times {|i| Issue.generate!(:tracker_id => (i + 1))} - - get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc' - assert_response :success - - trackers = assigns(:issues).map(&:tracker).uniq - assert_equal [1, 2, 3], trackers.map(&:id) - end - - def test_index_with_query_grouped_by_tracker_in_reverse_order - 3.times {|i| Issue.generate!(:tracker_id => (i + 1))} - - get :index, :set_filter => 1, :group_by => 'tracker', :sort => 'id:desc,tracker:desc' - assert_response :success - - trackers = assigns(:issues).map(&:tracker).uniq - assert_equal [3, 2, 1], trackers.map(&:id) - end - - def test_index_with_query_id_and_project_id_should_set_session_query - get :index, :project_id => 1, :query_id => 4 - assert_response :success - assert_kind_of Hash, session[:query] - assert_equal 4, session[:query][:id] - assert_equal 1, session[:query][:project_id] - end - - def test_index_with_invalid_query_id_should_respond_404 - get :index, :project_id => 1, :query_id => 999 - assert_response 404 - end - - def test_index_with_cross_project_query_in_session_should_show_project_issues - q = IssueQuery.create!(:name => "test", :user_id => 2, :is_public => false, :project => nil) - @request.session[:query] = {:id => q.id, :project_id => 1} - - with_settings :display_subprojects_issues => '0' do - get :index, :project_id => 1 - end - assert_response :success - assert_not_nil assigns(:query) - assert_equal q.id, assigns(:query).id - assert_equal 1, assigns(:query).project_id - assert_equal [1], assigns(:issues).map(&:project_id).uniq - end - - def test_private_query_should_not_be_available_to_other_users - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil) - @request.session[:user_id] = 3 - - get :index, :query_id => q.id - assert_response 403 - end - - def test_private_query_should_be_available_to_its_user - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => false, :project => nil) - @request.session[:user_id] = 2 - - get :index, :query_id => q.id - assert_response :success - end - - def test_public_query_should_be_available_to_other_users - q = IssueQuery.create!(:name => "private", :user => User.find(2), :is_public => true, :project => nil) - @request.session[:user_id] = 3 - - get :index, :query_id => q.id - assert_response :success - end - - def test_index_should_omit_page_param_in_export_links - get :index, :page => 2 - assert_response :success - assert_select 'a.atom[href=/issues.atom]' - assert_select 'a.csv[href=/issues.csv]' - assert_select 'a.pdf[href=/issues.pdf]' - assert_select 'form#csv-export-form[action=/issues.csv]' - end - - def test_index_csv - get :index, :format => 'csv' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'text/csv; header=present', @response.content_type - assert @response.body.starts_with?("#,") - lines = @response.body.chomp.split("\n") - assert_equal assigns(:query).columns.size, lines[0].split(',').size - end - - def test_index_csv_with_project - get :index, :project_id => 1, :format => 'csv' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'text/csv; header=present', @response.content_type - end - - def test_index_csv_with_description - Issue.generate!(:description => 'test_index_csv_with_description') - - with_settings :default_language => 'en' do - get :index, :format => 'csv', :description => '1' - assert_response :success - assert_not_nil assigns(:issues) - end - - assert_equal 'text/csv; header=present', response.content_type - headers = response.body.chomp.split("\n").first.split(',') - assert_include 'Description', headers - assert_include 'test_index_csv_with_description', response.body - end - - def test_index_csv_with_spent_time_column - issue = Issue.create!(:project_id => 1, :tracker_id => 1, :subject => 'test_index_csv_with_spent_time_column', :author_id => 2) - TimeEntry.create!(:project => issue.project, :issue => issue, :hours => 7.33, :user => User.find(2), :spent_on => Date.today) - - get :index, :format => 'csv', :set_filter => '1', :c => %w(subject spent_hours) - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - assert_include "#{issue.id},#{issue.subject},7.33", lines - end - - def test_index_csv_with_all_columns - get :index, :format => 'csv', :columns => 'all' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'text/csv; header=present', @response.content_type - assert_match /\A#,/, response.body - lines = response.body.chomp.split("\n") - assert_equal assigns(:query).available_inline_columns.size, lines[0].split(',').size - end - - def test_index_csv_with_multi_column_field - CustomField.find(1).update_attribute :multiple, true - issue = Issue.find(1) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - - get :index, :format => 'csv', :columns => 'all' - assert_response :success - lines = @response.body.chomp.split("\n") - assert lines.detect {|line| line.include?('"MySQL, Oracle"')} - end - - def test_index_csv_should_format_float_custom_fields_with_csv_decimal_separator - field = IssueCustomField.create!(:name => 'Float', :is_for_all => true, :tracker_ids => [1], :field_format => 'float') - issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {field.id => '185.6'}) - - with_settings :default_language => 'fr' do - get :index, :format => 'csv', :columns => 'all' - assert_response :success - issue_line = response.body.chomp.split("\n").map {|line| line.split(';')}.detect {|line| line[0]==issue.id.to_s} - assert_include '185,60', issue_line - end - - with_settings :default_language => 'en' do - get :index, :format => 'csv', :columns => 'all' - assert_response :success - issue_line = response.body.chomp.split("\n").map {|line| line.split(',')}.detect {|line| line[0]==issue.id.to_s} - assert_include '185.60', issue_line - end - end - - def test_index_csv_big_5 - with_settings :default_language => "zh-TW" do - str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88" - str_big5 = "\xa4@\xa4\xeb" - if str_utf8.respond_to?(:force_encoding) - str_utf8.force_encoding('UTF-8') - str_big5.force_encoding('Big5') - end - issue = Issue.generate!(:subject => str_utf8) - - get :index, :project_id => 1, - :f => ['subject'], - :op => '=', :values => [str_utf8], - :format => 'csv' - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - s1 = "\xaa\xac\xbaA" - if str_utf8.respond_to?(:force_encoding) - s1.force_encoding('Big5') - end - assert_include s1, lines[0] - assert_include str_big5, lines[1] - end - end - - def test_index_csv_cannot_convert_should_be_replaced_big_5 - with_settings :default_language => "zh-TW" do - str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85" - if str_utf8.respond_to?(:force_encoding) - str_utf8.force_encoding('UTF-8') - end - issue = Issue.generate!(:subject => str_utf8) - - get :index, :project_id => 1, - :f => ['subject'], - :op => '=', :values => [str_utf8], - :c => ['status', 'subject'], - :format => 'csv', - :set_filter => 1 - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - s1 = "\xaa\xac\xbaA" # status - if str_utf8.respond_to?(:force_encoding) - s1.force_encoding('Big5') - end - assert lines[0].include?(s1) - s2 = lines[1].split(",")[2] - if s1.respond_to?(:force_encoding) - s3 = "\xa5H?" # subject - s3.force_encoding('Big5') - assert_equal s3, s2 - elsif RUBY_PLATFORM == 'java' - assert_equal "??", s2 - else - assert_equal "\xa5H???", s2 - end - end - end - - def test_index_csv_tw - with_settings :default_language => "zh-TW" do - str1 = "test_index_csv_tw" - issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5') - - get :index, :project_id => 1, - :f => ['subject'], - :op => '=', :values => [str1], - :c => ['estimated_hours', 'subject'], - :format => 'csv', - :set_filter => 1 - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - assert_equal "#{issue.id},1234.50,#{str1}", lines[1] - end - end - - def test_index_csv_fr - with_settings :default_language => "fr" do - str1 = "test_index_csv_fr" - issue = Issue.generate!(:subject => str1, :estimated_hours => '1234.5') - - get :index, :project_id => 1, - :f => ['subject'], - :op => '=', :values => [str1], - :c => ['estimated_hours', 'subject'], - :format => 'csv', - :set_filter => 1 - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - assert_equal "#{issue.id};1234,50;#{str1}", lines[1] - end - end - - def test_index_pdf - ["en", "zh", "zh-TW", "ja", "ko"].each do |lang| - with_settings :default_language => lang do - - get :index - assert_response :success - assert_template 'index' - - if lang == "ja" - if RUBY_PLATFORM != 'java' - assert_equal "CP932", l(:general_pdf_encoding) - end - if RUBY_PLATFORM == 'java' && l(:general_pdf_encoding) == "CP932" - next - end - end - - get :index, :format => 'pdf' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'application/pdf', @response.content_type - - get :index, :project_id => 1, :format => 'pdf' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'application/pdf', @response.content_type - - get :index, :project_id => 1, :query_id => 6, :format => 'pdf' - assert_response :success - assert_not_nil assigns(:issues) - assert_equal 'application/pdf', @response.content_type - end - end - end - - def test_index_pdf_with_query_grouped_by_list_custom_field - get :index, :project_id => 1, :query_id => 9, :format => 'pdf' - assert_response :success - assert_not_nil assigns(:issues) - assert_not_nil assigns(:issue_count_by_group) - assert_equal 'application/pdf', @response.content_type - end - - def test_index_atom - get :index, :project_id => 'ecookbook', :format => 'atom' - assert_response :success - assert_template 'common/feed' - assert_equal 'application/atom+xml', response.content_type - - assert_select 'feed' do - assert_select 'link[rel=self][href=?]', 'http://test.host/projects/ecookbook/issues.atom' - assert_select 'link[rel=alternate][href=?]', 'http://test.host/projects/ecookbook/issues' - assert_select 'entry link[href=?]', 'http://test.host/issues/1' - end - end - - def test_index_sort - get :index, :sort => 'tracker,id:desc' - assert_response :success - - sort_params = @request.session['issues_index_sort'] - assert sort_params.is_a?(String) - assert_equal 'tracker,id:desc', sort_params - - issues = assigns(:issues) - assert_not_nil issues - assert !issues.empty? - assert_equal issues.sort {|a,b| a.tracker == b.tracker ? b.id <=> a.id : a.tracker <=> b.tracker }.collect(&:id), issues.collect(&:id) - end - - def test_index_sort_by_field_not_included_in_columns - Setting.issue_list_default_columns = %w(subject author) - get :index, :sort => 'tracker' - end - - def test_index_sort_by_assigned_to - get :index, :sort => 'assigned_to' - assert_response :success - assignees = assigns(:issues).collect(&:assigned_to).compact - assert_equal assignees.sort, assignees - end - - def test_index_sort_by_assigned_to_desc - get :index, :sort => 'assigned_to:desc' - assert_response :success - assignees = assigns(:issues).collect(&:assigned_to).compact - assert_equal assignees.sort.reverse, assignees - end - - def test_index_group_by_assigned_to - get :index, :group_by => 'assigned_to', :sort => 'priority' - assert_response :success - end - - def test_index_sort_by_author - get :index, :sort => 'author' - assert_response :success - authors = assigns(:issues).collect(&:author) - assert_equal authors.sort, authors - end - - def test_index_sort_by_author_desc - get :index, :sort => 'author:desc' - assert_response :success - authors = assigns(:issues).collect(&:author) - assert_equal authors.sort.reverse, authors - end - - def test_index_group_by_author - get :index, :group_by => 'author', :sort => 'priority' - assert_response :success - end - - def test_index_sort_by_spent_hours - get :index, :sort => 'spent_hours:desc' - assert_response :success - hours = assigns(:issues).collect(&:spent_hours) - assert_equal hours.sort.reverse, hours - end - - def test_index_sort_by_user_custom_field - cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '') - - get :index, :project_id => 1, :set_filter => 1, :sort => "cf_#{cf.id},id" - assert_response :success - - assert_equal [2, 3, 1], assigns(:issues).select {|issue| issue.custom_field_value(cf).present?}.map(&:id) - end - - def test_index_with_columns - columns = ['tracker', 'subject', 'assigned_to'] - get :index, :set_filter => 1, :c => columns - assert_response :success - - # query should use specified columns - query = assigns(:query) - assert_kind_of IssueQuery, query - assert_equal columns, query.column_names.map(&:to_s) - - # columns should be stored in session - assert_kind_of Hash, session[:query] - assert_kind_of Array, session[:query][:column_names] - assert_equal columns, session[:query][:column_names].map(&:to_s) - - # ensure only these columns are kept in the selected columns list - assert_select 'select#selected_columns option' do - assert_select 'option', 3 - assert_select 'option[value=tracker]' - assert_select 'option[value=project]', 0 - end - end - - def test_index_without_project_should_implicitly_add_project_column_to_default_columns - Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to'] - get :index, :set_filter => 1 - - # query should use specified columns - query = assigns(:query) - assert_kind_of IssueQuery, query - assert_equal [:id, :project, :tracker, :subject, :assigned_to], query.columns.map(&:name) - end - - def test_index_without_project_and_explicit_default_columns_should_not_add_project_column - Setting.issue_list_default_columns = ['tracker', 'subject', 'assigned_to'] - columns = ['id', 'tracker', 'subject', 'assigned_to'] - get :index, :set_filter => 1, :c => columns - - # query should use specified columns - query = assigns(:query) - assert_kind_of IssueQuery, query - assert_equal columns.map(&:to_sym), query.columns.map(&:name) - end - - def test_index_with_custom_field_column - columns = %w(tracker subject cf_2) - get :index, :set_filter => 1, :c => columns - assert_response :success - - # query should use specified columns - query = assigns(:query) - assert_kind_of IssueQuery, query - assert_equal columns, query.column_names.map(&:to_s) - - assert_select 'table.issues td.cf_2.string' - end - - def test_index_with_multi_custom_field_column - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(1) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - - get :index, :set_filter => 1, :c => %w(tracker subject cf_1) - assert_response :success - - assert_select 'table.issues td.cf_1', :text => 'MySQL, Oracle' - end - - def test_index_with_multi_user_custom_field_column - field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true, - :tracker_ids => [1], :is_for_all => true) - issue = Issue.find(1) - issue.custom_field_values = {field.id => ['2', '3']} - issue.save! - - get :index, :set_filter => 1, :c => ['tracker', 'subject', "cf_#{field.id}"] - assert_response :success - - assert_select "table.issues td.cf_#{field.id}" do - assert_select 'a', 2 - assert_select 'a[href=?]', '/users/2', :text => 'John Smith' - assert_select 'a[href=?]', '/users/3', :text => 'Dave Lopper' - end - end - - def test_index_with_date_column - with_settings :date_format => '%d/%m/%Y' do - Issue.find(1).update_attribute :start_date, '1987-08-24' - - get :index, :set_filter => 1, :c => %w(start_date) - - assert_select "table.issues td.start_date", :text => '24/08/1987' - end - end - - def test_index_with_done_ratio_column - Issue.find(1).update_attribute :done_ratio, 40 - - get :index, :set_filter => 1, :c => %w(done_ratio) - - assert_select 'table.issues td.done_ratio' do - assert_select 'table.progress' do - assert_select 'td.closed[style=?]', 'width: 40%;' - end - end - end - - def test_index_with_spent_hours_column - get :index, :set_filter => 1, :c => %w(subject spent_hours) - - assert_select 'table.issues tr#issue-3 td.spent_hours', :text => '1.00' - end - - def test_index_should_not_show_spent_hours_column_without_permission - Role.anonymous.remove_permission! :view_time_entries - get :index, :set_filter => 1, :c => %w(subject spent_hours) - - assert_select 'td.spent_hours', 0 - end - - def test_index_with_fixed_version_column - get :index, :set_filter => 1, :c => %w(fixed_version) - - assert_select 'table.issues td.fixed_version' do - assert_select 'a[href=?]', '/versions/2', :text => '1.0' - end - end - - def test_index_with_relations_column - IssueRelation.delete_all - IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(7)) - IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(8), :issue_to => Issue.find(1)) - IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(1), :issue_to => Issue.find(11)) - IssueRelation.create!(:relation_type => "blocks", :issue_from => Issue.find(12), :issue_to => Issue.find(2)) - - get :index, :set_filter => 1, :c => %w(subject relations) - assert_response :success - assert_select "tr#issue-1 td.relations" do - assert_select "span", 3 - assert_select "span", :text => "Related to #7" - assert_select "span", :text => "Related to #8" - assert_select "span", :text => "Blocks #11" - end - assert_select "tr#issue-2 td.relations" do - assert_select "span", 1 - assert_select "span", :text => "Blocked by #12" - end - assert_select "tr#issue-3 td.relations" do - assert_select "span", 0 - end - - get :index, :set_filter => 1, :c => %w(relations), :format => 'csv' - assert_response :success - assert_equal 'text/csv; header=present', response.content_type - lines = response.body.chomp.split("\n") - assert_include '1,"Related to #7, Related to #8, Blocks #11"', lines - assert_include '2,Blocked by #12', lines - assert_include '3,""', lines - - get :index, :set_filter => 1, :c => %w(subject relations), :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', response.content_type - end - - def test_index_with_description_column - get :index, :set_filter => 1, :c => %w(subject description) - - assert_select 'table.issues thead th', 3 # columns: chekbox + id + subject - assert_select 'td.description[colspan=3]', :text => 'Unable to print recipes' - - get :index, :set_filter => 1, :c => %w(subject description), :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', response.content_type - end - - def test_index_send_html_if_query_is_invalid - get :index, :f => ['start_date'], :op => {:start_date => '='} - assert_equal 'text/html', @response.content_type - assert_template 'index' - end - - def test_index_send_nothing_if_query_is_invalid - get :index, :f => ['start_date'], :op => {:start_date => '='}, :format => 'csv' - assert_equal 'text/csv', @response.content_type - assert @response.body.blank? - end - - def test_show_by_anonymous - get :show, :id => 1 - assert_response :success - assert_template 'show' - assert_equal Issue.find(1), assigns(:issue) - - assert_select 'div.issue div.description', :text => /Unable to print recipes/ - - # anonymous role is allowed to add a note - assert_select 'form#issue-form' do - assert_select 'fieldset' do - assert_select 'legend', :text => 'Notes' - assert_select 'textarea[name=?]', 'issue[notes]' - end - end - - assert_select 'title', :text => "Bug #1: Can't print recipes - eCookbook - Redmine" - end - - def test_show_by_manager - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'a', :text => /Quote/ - - assert_select 'form#issue-form' do - assert_select 'fieldset' do - assert_select 'legend', :text => 'Change properties' - assert_select 'input[name=?]', 'issue[subject]' - end - assert_select 'fieldset' do - assert_select 'legend', :text => 'Log time' - assert_select 'input[name=?]', 'time_entry[hours]' - end - assert_select 'fieldset' do - assert_select 'legend', :text => 'Notes' - assert_select 'textarea[name=?]', 'issue[notes]' - end - end - end - - def test_show_should_display_update_form - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'form#issue-form' do - assert_select 'input[name=?]', 'issue[is_private]' - assert_select 'select[name=?]', 'issue[project_id]' - assert_select 'select[name=?]', 'issue[tracker_id]' - assert_select 'input[name=?]', 'issue[subject]' - assert_select 'textarea[name=?]', 'issue[description]' - assert_select 'select[name=?]', 'issue[status_id]' - assert_select 'select[name=?]', 'issue[priority_id]' - assert_select 'select[name=?]', 'issue[assigned_to_id]' - assert_select 'select[name=?]', 'issue[category_id]' - assert_select 'select[name=?]', 'issue[fixed_version_id]' - assert_select 'input[name=?]', 'issue[parent_issue_id]' - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?]', 'issue[due_date]' - assert_select 'select[name=?]', 'issue[done_ratio]' - assert_select 'input[name=?]', 'issue[custom_field_values][2]' - assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0 - assert_select 'textarea[name=?]', 'issue[notes]' - end - end - - def test_show_should_display_update_form_with_minimal_permissions - Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes] - WorkflowTransition.delete_all :role_id => 1 - - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'form#issue-form' do - assert_select 'input[name=?]', 'issue[is_private]', 0 - assert_select 'select[name=?]', 'issue[project_id]', 0 - assert_select 'select[name=?]', 'issue[tracker_id]', 0 - assert_select 'input[name=?]', 'issue[subject]', 0 - assert_select 'textarea[name=?]', 'issue[description]', 0 - assert_select 'select[name=?]', 'issue[status_id]', 0 - assert_select 'select[name=?]', 'issue[priority_id]', 0 - assert_select 'select[name=?]', 'issue[assigned_to_id]', 0 - assert_select 'select[name=?]', 'issue[category_id]', 0 - assert_select 'select[name=?]', 'issue[fixed_version_id]', 0 - assert_select 'input[name=?]', 'issue[parent_issue_id]', 0 - assert_select 'input[name=?]', 'issue[start_date]', 0 - assert_select 'input[name=?]', 'issue[due_date]', 0 - assert_select 'select[name=?]', 'issue[done_ratio]', 0 - assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0 - assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0 - assert_select 'textarea[name=?]', 'issue[notes]' - end - end - - def test_show_should_display_update_form_with_workflow_permissions - Role.find(1).update_attribute :permissions, [:view_issues, :add_issue_notes] - - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'form#issue-form' do - assert_select 'input[name=?]', 'issue[is_private]', 0 - assert_select 'select[name=?]', 'issue[project_id]', 0 - assert_select 'select[name=?]', 'issue[tracker_id]', 0 - assert_select 'input[name=?]', 'issue[subject]', 0 - assert_select 'textarea[name=?]', 'issue[description]', 0 - assert_select 'select[name=?]', 'issue[status_id]' - assert_select 'select[name=?]', 'issue[priority_id]', 0 - assert_select 'select[name=?]', 'issue[assigned_to_id]' - assert_select 'select[name=?]', 'issue[category_id]', 0 - assert_select 'select[name=?]', 'issue[fixed_version_id]' - assert_select 'input[name=?]', 'issue[parent_issue_id]', 0 - assert_select 'input[name=?]', 'issue[start_date]', 0 - assert_select 'input[name=?]', 'issue[due_date]', 0 - assert_select 'select[name=?]', 'issue[done_ratio]' - assert_select 'input[name=?]', 'issue[custom_field_values][2]', 0 - assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0 - assert_select 'textarea[name=?]', 'issue[notes]' - end - end - - def test_show_should_not_display_update_form_without_permissions - Role.find(1).update_attribute :permissions, [:view_issues] - - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'form#issue-form', 0 - end - - def test_update_form_should_not_display_inactive_enumerations - assert !IssuePriority.find(15).active? - - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response :success - - assert_select 'form#issue-form' do - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=4]' - assert_select 'option[value=15]', 0 - end - end - end - - def test_update_form_should_allow_attachment_upload - @request.session[:user_id] = 2 - get :show, :id => 1 - - assert_select 'form#issue-form[method=post][enctype=multipart/form-data]' do - assert_select 'input[type=file][name=?]', 'attachments[dummy][file]' - end - end - - def test_show_should_deny_anonymous_access_without_permission - Role.anonymous.remove_permission!(:view_issues) - get :show, :id => 1 - assert_response :redirect - end - - def test_show_should_deny_anonymous_access_to_private_issue - Issue.update_all(["is_private = ?", true], "id = 1") - get :show, :id => 1 - assert_response :redirect - end - - def test_show_should_deny_non_member_access_without_permission - Role.non_member.remove_permission!(:view_issues) - @request.session[:user_id] = 9 - get :show, :id => 1 - assert_response 403 - end - - def test_show_should_deny_non_member_access_to_private_issue - Issue.update_all(["is_private = ?", true], "id = 1") - @request.session[:user_id] = 9 - get :show, :id => 1 - assert_response 403 - end - - def test_show_should_deny_member_access_without_permission - Role.find(1).remove_permission!(:view_issues) - @request.session[:user_id] = 2 - get :show, :id => 1 - assert_response 403 - end - - def test_show_should_deny_member_access_to_private_issue_without_permission - Issue.update_all(["is_private = ?", true], "id = 1") - @request.session[:user_id] = 3 - get :show, :id => 1 - assert_response 403 - end - - def test_show_should_allow_author_access_to_private_issue - Issue.update_all(["is_private = ?, author_id = 3", true], "id = 1") - @request.session[:user_id] = 3 - get :show, :id => 1 - assert_response :success - end - - def test_show_should_allow_assignee_access_to_private_issue - Issue.update_all(["is_private = ?, assigned_to_id = 3", true], "id = 1") - @request.session[:user_id] = 3 - get :show, :id => 1 - assert_response :success - end - - def test_show_should_allow_member_access_to_private_issue_with_permission - Issue.update_all(["is_private = ?", true], "id = 1") - User.find(3).roles_for_project(Project.find(1)).first.update_attribute :issues_visibility, 'all' - @request.session[:user_id] = 3 - get :show, :id => 1 - assert_response :success - end - - def test_show_should_not_disclose_relations_to_invisible_issues - Setting.cross_project_issue_relations = '1' - IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(2), :relation_type => 'relates') - # Relation to a private project issue - IssueRelation.create!(:issue_from => Issue.find(1), :issue_to => Issue.find(4), :relation_type => 'relates') - - get :show, :id => 1 - assert_response :success - - assert_select 'div#relations' do - assert_select 'a', :text => /#2$/ - assert_select 'a', :text => /#4$/, :count => 0 - end - end - - def test_show_should_list_subtasks - Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue') - - get :show, :id => 1 - assert_response :success - - assert_select 'div#issue_tree' do - assert_select 'td.subject', :text => /Child Issue/ - end - end - - def test_show_should_list_parents - issue = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :parent_issue_id => 1, :subject => 'Child Issue') - - get :show, :id => issue.id - assert_response :success - - assert_select 'div.subject' do - assert_select 'h3', 'Child Issue' - assert_select 'a[href=/issues/1]' - end - end - - def test_show_should_not_display_prev_next_links_without_query_in_session - get :show, :id => 1 - assert_response :success - assert_nil assigns(:prev_issue_id) - assert_nil assigns(:next_issue_id) - - assert_select 'div.next-prev-links', 0 - end - - def test_show_should_display_prev_next_links_with_query_in_session - @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil} - @request.session['issues_index_sort'] = 'id' - - with_settings :display_subprojects_issues => '0' do - get :show, :id => 3 - end - - assert_response :success - # Previous and next issues for all projects - assert_equal 2, assigns(:prev_issue_id) - assert_equal 5, assigns(:next_issue_id) - - count = Issue.open.visible.count - - assert_select 'div.next-prev-links' do - assert_select 'a[href=/issues/2]', :text => /Previous/ - assert_select 'a[href=/issues/5]', :text => /Next/ - assert_select 'span.position', :text => "3 of #{count}" - end - end - - def test_show_should_display_prev_next_links_with_saved_query_in_session - query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1, - :filters => {'status_id' => {:values => ['5'], :operator => '='}}, - :sort_criteria => [['id', 'asc']]) - @request.session[:query] = {:id => query.id, :project_id => nil} - - get :show, :id => 11 - - assert_response :success - assert_equal query, assigns(:query) - # Previous and next issues for all projects - assert_equal 8, assigns(:prev_issue_id) - assert_equal 12, assigns(:next_issue_id) - - assert_select 'div.next-prev-links' do - assert_select 'a[href=/issues/8]', :text => /Previous/ - assert_select 'a[href=/issues/12]', :text => /Next/ - end - end - - def test_show_should_display_prev_next_links_with_query_and_sort_on_association - @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => nil} - - %w(project tracker status priority author assigned_to category fixed_version).each do |assoc_sort| - @request.session['issues_index_sort'] = assoc_sort - - get :show, :id => 3 - assert_response :success, "Wrong response status for #{assoc_sort} sort" - - assert_select 'div.next-prev-links' do - assert_select 'a', :text => /(Previous|Next)/ - end - end - end - - def test_show_should_display_prev_next_links_with_project_query_in_session - @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1} - @request.session['issues_index_sort'] = 'id' - - with_settings :display_subprojects_issues => '0' do - get :show, :id => 3 - end - - assert_response :success - # Previous and next issues inside project - assert_equal 2, assigns(:prev_issue_id) - assert_equal 7, assigns(:next_issue_id) - - assert_select 'div.next-prev-links' do - assert_select 'a[href=/issues/2]', :text => /Previous/ - assert_select 'a[href=/issues/7]', :text => /Next/ - end - end - - def test_show_should_not_display_prev_link_for_first_issue - @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'o'}}, :project_id => 1} - @request.session['issues_index_sort'] = 'id' - - with_settings :display_subprojects_issues => '0' do - get :show, :id => 1 - end - - assert_response :success - assert_nil assigns(:prev_issue_id) - assert_equal 2, assigns(:next_issue_id) - - assert_select 'div.next-prev-links' do - assert_select 'a', :text => /Previous/, :count => 0 - assert_select 'a[href=/issues/2]', :text => /Next/ - end - end - - def test_show_should_not_display_prev_next_links_for_issue_not_in_query_results - @request.session[:query] = {:filters => {'status_id' => {:values => [''], :operator => 'c'}}, :project_id => 1} - @request.session['issues_index_sort'] = 'id' - - get :show, :id => 1 - - assert_response :success - assert_nil assigns(:prev_issue_id) - assert_nil assigns(:next_issue_id) - - assert_select 'a', :text => /Previous/, :count => 0 - assert_select 'a', :text => /Next/, :count => 0 - end - - def test_show_show_should_display_prev_next_links_with_query_sort_by_user_custom_field - cf = IssueCustomField.create!(:name => 'User', :is_for_all => true, :tracker_ids => [1,2,3], :field_format => 'user') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(1), :value => '2') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(2), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(3), :value => '3') - CustomValue.create!(:custom_field => cf, :customized => Issue.find(5), :value => '') - - query = IssueQuery.create!(:name => 'test', :is_public => true, :user_id => 1, :filters => {}, - :sort_criteria => [["cf_#{cf.id}", 'asc'], ['id', 'asc']]) - @request.session[:query] = {:id => query.id, :project_id => nil} - - get :show, :id => 3 - assert_response :success - - assert_equal 2, assigns(:prev_issue_id) - assert_equal 1, assigns(:next_issue_id) - - assert_select 'div.next-prev-links' do - assert_select 'a[href=/issues/2]', :text => /Previous/ - assert_select 'a[href=/issues/1]', :text => /Next/ - end - end - - def test_show_should_display_link_to_the_assignee - get :show, :id => 2 - assert_response :success - assert_select '.assigned-to' do - assert_select 'a[href=/users/3]' - end - end - - def test_show_should_display_visible_changesets_from_other_projects - project = Project.find(2) - issue = project.issues.first - issue.changeset_ids = [102] - issue.save! - # changesets from other projects should be displayed even if repository - # is disabled on issue's project - project.disable_module! :repository - - @request.session[:user_id] = 2 - get :show, :id => issue.id - - assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/3' - end - - def test_show_should_display_watchers - @request.session[:user_id] = 2 - Issue.find(1).add_watcher User.find(2) - - get :show, :id => 1 - assert_select 'div#watchers ul' do - assert_select 'li' do - assert_select 'a[href=/users/2]' - assert_select 'a img[alt=Delete]' - end - end - end - - def test_show_should_display_watchers_with_gravatars - @request.session[:user_id] = 2 - Issue.find(1).add_watcher User.find(2) - - with_settings :gravatar_enabled => '1' do - get :show, :id => 1 - end - - assert_select 'div#watchers ul' do - assert_select 'li' do - assert_select 'img.gravatar' - assert_select 'a[href=/users/2]' - assert_select 'a img[alt=Delete]' - end - end - end - - def test_show_with_thumbnails_enabled_should_display_thumbnails - @request.session[:user_id] = 2 - - with_settings :thumbnails_enabled => '1' do - get :show, :id => 14 - assert_response :success - end - - assert_select 'div.thumbnails' do - assert_select 'a[href=/attachments/16/testfile.png]' do - assert_select 'img[src=/attachments/thumbnail/16]' - end - end - end - - def test_show_with_thumbnails_disabled_should_not_display_thumbnails - @request.session[:user_id] = 2 - - with_settings :thumbnails_enabled => '0' do - get :show, :id => 14 - assert_response :success - end - - assert_select 'div.thumbnails', 0 - end - - def test_show_with_multi_custom_field - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(1) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - - get :show, :id => 1 - assert_response :success - - assert_select 'td', :text => 'MySQL, Oracle' - end - - def test_show_with_multi_user_custom_field - field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true, - :tracker_ids => [1], :is_for_all => true) - issue = Issue.find(1) - issue.custom_field_values = {field.id => ['2', '3']} - issue.save! - - get :show, :id => 1 - assert_response :success - - # TODO: should display links - assert_select 'td', :text => 'Dave Lopper, John Smith' - end - - def test_show_should_display_private_notes_with_permission_only - journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true, :user_id => 1) - @request.session[:user_id] = 2 - - get :show, :id => 2 - assert_response :success - assert_include journal, assigns(:journals) - - Role.find(1).remove_permission! :view_private_notes - get :show, :id => 2 - assert_response :success - assert_not_include journal, assigns(:journals) - end - - def test_show_atom - get :show, :id => 2, :format => 'atom' - assert_response :success - assert_template 'journals/index' - # Inline image - assert_select 'content', :text => Regexp.new(Regexp.quote('http://test.host/attachments/download/10')) - end - - def test_show_export_to_pdf - get :show, :id => 3, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - assert_not_nil assigns(:issue) - end - - def test_show_export_to_pdf_with_ancestors - issue = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1) - - get :show, :id => issue.id, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - end - - def test_show_export_to_pdf_with_descendants - c1 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1) - c2 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => 1) - c3 = Issue.generate!(:project_id => 1, :author_id => 2, :tracker_id => 1, :subject => 'child', :parent_issue_id => c1.id) - - get :show, :id => 1, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - end - - def test_show_export_to_pdf_with_journals - get :show, :id => 1, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - end - - def test_show_export_to_pdf_with_changesets - Issue.find(3).changesets = Changeset.find_all_by_id(100, 101, 102) - - get :show, :id => 3, :format => 'pdf' - assert_response :success - assert_equal 'application/pdf', @response.content_type - assert @response.body.starts_with?('%PDF') - end - - def test_show_invalid_should_respond_with_404 - get :show, :id => 999 - assert_response 404 - end - - def test_get_new - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'form#issue-form' do - assert_select 'input[name=?]', 'issue[is_private]' - assert_select 'select[name=?]', 'issue[project_id]', 0 - assert_select 'select[name=?]', 'issue[tracker_id]' - assert_select 'input[name=?]', 'issue[subject]' - assert_select 'textarea[name=?]', 'issue[description]' - assert_select 'select[name=?]', 'issue[status_id]' - assert_select 'select[name=?]', 'issue[priority_id]' - assert_select 'select[name=?]', 'issue[assigned_to_id]' - assert_select 'select[name=?]', 'issue[category_id]' - assert_select 'select[name=?]', 'issue[fixed_version_id]' - assert_select 'input[name=?]', 'issue[parent_issue_id]' - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?]', 'issue[due_date]' - assert_select 'select[name=?]', 'issue[done_ratio]' - assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string' - assert_select 'input[name=?]', 'issue[watcher_user_ids][]' - end - - # Be sure we don't display inactive IssuePriorities - assert ! IssuePriority.find(15).active? - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=15]', 0 - end - end - - def test_get_new_with_minimal_permissions - Role.find(1).update_attribute :permissions, [:add_issues] - WorkflowTransition.delete_all :role_id => 1 - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'form#issue-form' do - assert_select 'input[name=?]', 'issue[is_private]', 0 - assert_select 'select[name=?]', 'issue[project_id]', 0 - assert_select 'select[name=?]', 'issue[tracker_id]' - assert_select 'input[name=?]', 'issue[subject]' - assert_select 'textarea[name=?]', 'issue[description]' - assert_select 'select[name=?]', 'issue[status_id]' - assert_select 'select[name=?]', 'issue[priority_id]' - assert_select 'select[name=?]', 'issue[assigned_to_id]' - assert_select 'select[name=?]', 'issue[category_id]' - assert_select 'select[name=?]', 'issue[fixed_version_id]' - assert_select 'input[name=?]', 'issue[parent_issue_id]', 0 - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?]', 'issue[due_date]' - assert_select 'select[name=?]', 'issue[done_ratio]' - assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Default string' - assert_select 'input[name=?]', 'issue[watcher_user_ids][]', 0 - end - end - - def test_get_new_with_list_custom_field - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'select.list_cf[name=?]', 'issue[custom_field_values][1]' do - assert_select 'option', 4 - assert_select 'option[value=MySQL]', :text => 'MySQL' - end - end - - def test_get_new_with_multi_custom_field - field = IssueCustomField.find(1) - field.update_attribute :multiple, true - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do - assert_select 'option', 3 - assert_select 'option[value=MySQL]', :text => 'MySQL' - end - assert_select 'input[name=?][type=hidden][value=?]', 'issue[custom_field_values][1][]', '' - end - - def test_get_new_with_multi_user_custom_field - field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true, - :tracker_ids => [1], :is_for_all => true) - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'select[name=?][multiple=multiple]', "issue[custom_field_values][#{field.id}][]" do - assert_select 'option', Project.find(1).users.count - assert_select 'option[value=2]', :text => 'John Smith' - end - assert_select 'input[name=?][type=hidden][value=?]', "issue[custom_field_values][#{field.id}][]", '' - end - - def test_get_new_with_date_custom_field - field = IssueCustomField.create!(:name => 'Date', :field_format => 'date', :tracker_ids => [1], :is_for_all => true) - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - - assert_select 'input[name=?]', "issue[custom_field_values][#{field.id}]" - end - - def test_get_new_with_text_custom_field - field = IssueCustomField.create!(:name => 'Text', :field_format => 'text', :tracker_ids => [1], :is_for_all => true) - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - - assert_select 'textarea[name=?]', "issue[custom_field_values][#{field.id}]" - end - - def test_get_new_without_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 0 - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?][value]', 'issue[start_date]', 0 - end - - def test_get_new_with_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 1 - - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'input[name=?][value=?]', 'issue[start_date]', Date.today.to_s - end - - def test_get_new_form_should_allow_attachment_upload - @request.session[:user_id] = 2 - get :new, :project_id => 1, :tracker_id => 1 - - assert_select 'form[id=issue-form][method=post][enctype=multipart/form-data]' do - assert_select 'input[name=?][type=file]', 'attachments[dummy][file]' - end - end - - def test_get_new_should_prefill_the_form_from_params - @request.session[:user_id] = 2 - get :new, :project_id => 1, - :issue => {:tracker_id => 3, :description => 'Prefilled', :custom_field_values => {'2' => 'Custom field value'}} - - issue = assigns(:issue) - assert_equal 3, issue.tracker_id - assert_equal 'Prefilled', issue.description - assert_equal 'Custom field value', issue.custom_field_value(2) - - assert_select 'select[name=?]', 'issue[tracker_id]' do - assert_select 'option[value=3][selected=selected]' - end - assert_select 'textarea[name=?]', 'issue[description]', :text => /Prefilled/ - assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Custom field value' - end - - def test_get_new_should_mark_required_fields - cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - WorkflowPermission.delete_all - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'required') - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required') - @request.session[:user_id] = 2 - - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'label[for=issue_start_date]' do - assert_select 'span[class=required]', 0 - end - assert_select 'label[for=issue_due_date]' do - assert_select 'span[class=required]' - end - assert_select 'label[for=?]', "issue_custom_field_values_#{cf1.id}" do - assert_select 'span[class=required]', 0 - end - assert_select 'label[for=?]', "issue_custom_field_values_#{cf2.id}" do - assert_select 'span[class=required]' - end - end - - def test_get_new_should_not_display_readonly_fields - cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - WorkflowPermission.delete_all - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => 'due_date', :rule => 'readonly') - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 1, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly') - @request.session[:user_id] = 2 - - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - assert_select 'input[name=?]', 'issue[start_date]' - assert_select 'input[name=?]', 'issue[due_date]', 0 - assert_select 'input[name=?]', "issue[custom_field_values][#{cf1.id}]" - assert_select 'input[name=?]', "issue[custom_field_values][#{cf2.id}]", 0 - end - - def test_get_new_without_tracker_id - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - - issue = assigns(:issue) - assert_not_nil issue - assert_equal Project.find(1).trackers.first, issue.tracker - end - - def test_get_new_with_no_default_status_should_display_an_error - @request.session[:user_id] = 2 - IssueStatus.delete_all - - get :new, :project_id => 1 - assert_response 500 - assert_error_tag :content => /No default issue/ - end - - def test_get_new_with_no_tracker_should_display_an_error - @request.session[:user_id] = 2 - Tracker.delete_all - - get :new, :project_id => 1 - assert_response 500 - assert_error_tag :content => /No tracker/ - end - - def test_update_form_for_new_issue - @request.session[:user_id] = 2 - xhr :post, :update_form, :project_id => 1, - :issue => {:tracker_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5} - assert_response :success - assert_template 'update_form' - assert_template 'form' - assert_equal 'text/javascript', response.content_type - - issue = assigns(:issue) - assert_kind_of Issue, issue - assert_equal 1, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 'This is the test_new issue', issue.subject - end - - def test_update_form_for_new_issue_should_propose_transitions_based_on_initial_status - @request.session[:user_id] = 2 - WorkflowTransition.delete_all - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 2) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 5) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4) - - xhr :post, :update_form, :project_id => 1, - :issue => {:tracker_id => 1, - :status_id => 5, - :subject => 'This is an issue'} - - assert_equal 5, assigns(:issue).status_id - assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort - end - - def test_post_create - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 3, - :status_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :start_date => '2010-11-07', - :estimated_hours => '', - :custom_field_values => {'2' => 'Value for field 2'}} - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new issue') - assert_not_nil issue - assert_equal 2, issue.author_id - assert_equal 3, issue.tracker_id - assert_equal 2, issue.status_id - assert_equal Date.parse('2010-11-07'), issue.start_date - assert_nil issue.estimated_hours - v = issue.custom_values.where(:custom_field_id => 2).first - assert_not_nil v - assert_equal 'Value for field 2', v.value - end - - def test_post_new_with_group_assignment - group = Group.find(11) - project = Project.find(1) - project.members << Member.new(:principal => group, :roles => [Role.givable.first]) - - with_settings :issue_group_assignment => '1' do - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => project.id, - :issue => {:tracker_id => 3, - :status_id => 1, - :subject => 'This is the test_new_with_group_assignment issue', - :assigned_to_id => group.id} - end - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new_with_group_assignment issue') - assert_not_nil issue - assert_equal group, issue.assigned_to - end - - def test_post_create_without_start_date_and_default_start_date_is_not_creation_date - Setting.default_issue_start_date_to_creation_date = 0 - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 3, - :status_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :estimated_hours => '', - :custom_field_values => {'2' => 'Value for field 2'}} - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new issue') - assert_not_nil issue - assert_nil issue.start_date - end - - def test_post_create_without_start_date_and_default_start_date_is_creation_date - Setting.default_issue_start_date_to_creation_date = 1 - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 3, - :status_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :estimated_hours => '', - :custom_field_values => {'2' => 'Value for field 2'}} - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - issue = Issue.find_by_subject('This is the test_new issue') - assert_not_nil issue - assert_equal Date.today, issue.start_date - end - - def test_post_create_and_continue - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 3, :subject => 'This is first issue', :priority_id => 5}, - :continue => '' - end - - issue = Issue.first(:order => 'id DESC') - assert_redirected_to :controller => 'issues', :action => 'new', :project_id => 'ecookbook', :issue => {:tracker_id => 3} - assert_not_nil flash[:notice], "flash was not set" - assert_include %|##{issue.id}|, flash[:notice], "issue link not found in the flash message" - end - - def test_post_create_without_custom_fields_param - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5} - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - end - - def test_post_create_with_multi_custom_field - field = IssueCustomField.find_by_name('Database') - field.update_attribute(:multiple, true) - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :custom_field_values => {'1' => ['', 'MySQL', 'Oracle']}} - end - assert_response 302 - issue = Issue.first(:order => 'id DESC') - assert_equal ['MySQL', 'Oracle'], issue.custom_field_value(1).sort - end - - def test_post_create_with_empty_multi_custom_field - field = IssueCustomField.find_by_name('Database') - field.update_attribute(:multiple, true) - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :custom_field_values => {'1' => ['']}} - end - assert_response 302 - issue = Issue.first(:order => 'id DESC') - assert_equal [''], issue.custom_field_value(1).sort - end - - def test_post_create_with_multi_user_custom_field - field = IssueCustomField.create!(:name => 'Multi user', :field_format => 'user', :multiple => true, - :tracker_ids => [1], :is_for_all => true) - - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :custom_field_values => {field.id.to_s => ['', '2', '3']}} - end - assert_response 302 - issue = Issue.first(:order => 'id DESC') - assert_equal ['2', '3'], issue.custom_field_value(field).sort - end - - def test_post_create_with_required_custom_field_and_without_custom_fields_param - field = IssueCustomField.find_by_name('Database') - field.update_attribute(:is_required, true) - - @request.session[:user_id] = 2 - assert_no_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5} - end - assert_response :success - assert_template 'new' - issue = assigns(:issue) - assert_not_nil issue - assert_error_tag :content => /Database can't be blank/ - end - - def test_create_should_validate_required_fields - cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - WorkflowPermission.delete_all - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'required') - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'required') - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - post :create, :project_id => 1, :issue => { - :tracker_id => 2, - :status_id => 1, - :subject => 'Test', - :start_date => '', - :due_date => '', - :custom_field_values => {cf1.id.to_s => '', cf2.id.to_s => ''} - } - assert_response :success - assert_template 'new' - end - - assert_error_tag :content => /Due date can't be blank/i - assert_error_tag :content => /Bar can't be blank/i - end - - def test_create_should_ignore_readonly_fields - cf1 = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - cf2 = IssueCustomField.create!(:name => 'Bar', :field_format => 'string', :is_for_all => true, :tracker_ids => [1, 2]) - WorkflowPermission.delete_all - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => 'due_date', :rule => 'readonly') - WorkflowPermission.create!(:old_status_id => 1, :tracker_id => 2, :role_id => 1, :field_name => cf2.id.to_s, :rule => 'readonly') - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - post :create, :project_id => 1, :issue => { - :tracker_id => 2, - :status_id => 1, - :subject => 'Test', - :start_date => '2012-07-14', - :due_date => '2012-07-16', - :custom_field_values => {cf1.id.to_s => 'value1', cf2.id.to_s => 'value2'} - } - assert_response 302 - end - - issue = Issue.first(:order => 'id DESC') - assert_equal Date.parse('2012-07-14'), issue.start_date - assert_nil issue.due_date - assert_equal 'value1', issue.custom_field_value(cf1) - assert_nil issue.custom_field_value(cf2) - end - - def test_post_create_with_watchers - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - assert_difference 'Watcher.count', 2 do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a new issue with watchers', - :description => 'This is the description', - :priority_id => 5, - :watcher_user_ids => ['2', '3']} - end - issue = Issue.find_by_subject('This is a new issue with watchers') - assert_not_nil issue - assert_redirected_to :controller => 'issues', :action => 'show', :id => issue - - # Watchers added - assert_equal [2, 3], issue.watcher_user_ids.sort - assert issue.watched_by?(User.find(3)) - # Watchers notified - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert [mail.bcc, mail.cc].flatten.include?(User.find(3).mail) - end - - def test_post_create_subissue - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a child issue', - :parent_issue_id => '2'} - assert_response 302 - end - issue = Issue.order('id DESC').first - assert_equal Issue.find(2), issue.parent - end - - def test_post_create_subissue_with_sharp_parent_id - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a child issue', - :parent_issue_id => '#2'} - assert_response 302 - end - issue = Issue.order('id DESC').first - assert_equal Issue.find(2), issue.parent - end - - def test_post_create_subissue_with_non_visible_parent_id_should_not_validate - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a child issue', - :parent_issue_id => '4'} - - assert_response :success - assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '4' - assert_error_tag :content => /Parent task is invalid/i - end - end - - def test_post_create_subissue_with_non_numeric_parent_id_should_not_validate - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a child issue', - :parent_issue_id => '01ABC'} - - assert_response :success - assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', '01ABC' - assert_error_tag :content => /Parent task is invalid/i - end - end - - def test_post_create_private - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a private issue', - :is_private => '1'} - end - issue = Issue.first(:order => 'id DESC') - assert issue.is_private? - end - - def test_post_create_private_with_set_own_issues_private_permission - role = Role.find(1) - role.remove_permission! :set_issues_private - role.add_permission! :set_own_issues_private - - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is a private issue', - :is_private => '1'} - end - issue = Issue.first(:order => 'id DESC') - assert issue.is_private? - end - - def test_post_create_should_send_a_notification - ActionMailer::Base.deliveries.clear - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 3, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5, - :estimated_hours => '', - :custom_field_values => {'2' => 'Value for field 2'}} - end - assert_redirected_to :controller => 'issues', :action => 'show', :id => Issue.last.id - - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_post_create_should_preserve_fields_values_on_validation_failure - @request.session[:user_id] = 2 - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - # empty subject - :subject => '', - :description => 'This is a description', - :priority_id => 6, - :custom_field_values => {'1' => 'Oracle', '2' => 'Value for field 2'}} - assert_response :success - assert_template 'new' - - assert_select 'textarea[name=?]', 'issue[description]', :text => 'This is a description' - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=6][selected=selected]', :text => 'High' - end - # Custom fields - assert_select 'select[name=?]', 'issue[custom_field_values][1]' do - assert_select 'option[value=Oracle][selected=selected]', :text => 'Oracle' - end - assert_select 'input[name=?][value=?]', 'issue[custom_field_values][2]', 'Value for field 2' - end - - def test_post_create_with_failure_should_preserve_watchers - assert !User.find(8).member_of?(Project.find(1)) - - @request.session[:user_id] = 2 - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :watcher_user_ids => ['3', '8']} - assert_response :success - assert_template 'new' - - assert_select 'input[name=?][value=2]:not(checked)', 'issue[watcher_user_ids][]' - assert_select 'input[name=?][value=3][checked=checked]', 'issue[watcher_user_ids][]' - assert_select 'input[name=?][value=8][checked=checked]', 'issue[watcher_user_ids][]' - end - - def test_post_create_should_ignore_non_safe_attributes - @request.session[:user_id] = 2 - assert_nothing_raised do - post :create, :project_id => 1, :issue => { :tracker => "A param can not be a Tracker" } - end - end - - def test_post_create_with_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - assert_difference 'Attachment.count' do - post :create, :project_id => 1, - :issue => { :tracker_id => '1', :subject => 'With attachment' }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - end - end - - issue = Issue.first(:order => 'id DESC') - attachment = Attachment.first(:order => 'id DESC') - - assert_equal issue, attachment.container - assert_equal 2, attachment.author_id - assert_equal 'testfile.txt', attachment.filename - assert_equal 'text/plain', attachment.content_type - assert_equal 'test file', attachment.description - assert_equal 59, attachment.filesize - assert File.exists?(attachment.diskfile) - assert_equal 59, File.size(attachment.diskfile) - end - - def test_post_create_with_failure_should_save_attachments - set_tmp_attachments_directory - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - assert_difference 'Attachment.count' do - post :create, :project_id => 1, - :issue => { :tracker_id => '1', :subject => '' }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - assert_response :success - assert_template 'new' - end - end - - attachment = Attachment.first(:order => 'id DESC') - assert_equal 'testfile.txt', attachment.filename - assert File.exists?(attachment.diskfile) - assert_nil attachment.container - - assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token - assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt' - end - - def test_post_create_with_failure_should_keep_saved_attachments - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - assert_no_difference 'Attachment.count' do - post :create, :project_id => 1, - :issue => { :tracker_id => '1', :subject => '' }, - :attachments => {'p0' => {'token' => attachment.token}} - assert_response :success - assert_template 'new' - end - end - - assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token - assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt' - end - - def test_post_create_should_attach_saved_attachments - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - assert_no_difference 'Attachment.count' do - post :create, :project_id => 1, - :issue => { :tracker_id => '1', :subject => 'Saved attachments' }, - :attachments => {'p0' => {'token' => attachment.token}} - assert_response 302 - end - end - - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.attachments.count - - attachment.reload - assert_equal issue, attachment.container - end - - context "without workflow privilege" do - setup do - WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id]) - Role.anonymous.add_permission! :add_issues, :add_issue_notes - end - - context "#new" do - should "propose default status only" do - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'issue[status_id]' do - assert_select 'option', 1 - assert_select 'option[value=?]', IssueStatus.default.id.to_s - end - end - - should "accept default status" do - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is an issue', - :status_id => 1} - end - issue = Issue.last(:order => 'id') - assert_equal IssueStatus.default, issue.status - end - - should "ignore unauthorized status" do - assert_difference 'Issue.count' do - post :create, :project_id => 1, - :issue => {:tracker_id => 1, - :subject => 'This is an issue', - :status_id => 3} - end - issue = Issue.last(:order => 'id') - assert_equal IssueStatus.default, issue.status - end - end - - context "#update" do - should "ignore status change" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'} - end - assert_equal 1, Issue.find(1).status_id - end - - should "ignore attributes changes" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'} - end - issue = Issue.find(1) - assert_equal "Can't print recipes", issue.subject - assert_nil issue.assigned_to - end - end - end - - context "with workflow privilege" do - setup do - WorkflowTransition.delete_all(["role_id = ?", Role.anonymous.id]) - WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3) - WorkflowTransition.create!(:role => Role.anonymous, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4) - Role.anonymous.add_permission! :add_issues, :add_issue_notes - end - - context "#update" do - should "accept authorized status" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'} - end - assert_equal 3, Issue.find(1).status_id - end - - should "ignore unauthorized status" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'} - end - assert_equal 1, Issue.find(1).status_id - end - - should "accept authorized attributes changes" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:assigned_to_id => 2, :notes => 'just trying'} - end - issue = Issue.find(1) - assert_equal 2, issue.assigned_to_id - end - - should "ignore unauthorized attributes changes" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:subject => 'changed', :notes => 'just trying'} - end - issue = Issue.find(1) - assert_equal "Can't print recipes", issue.subject - end - end - - context "and :edit_issues permission" do - setup do - Role.anonymous.add_permission! :add_issues, :edit_issues - end - - should "accept authorized status" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:status_id => 3, :notes => 'just trying'} - end - assert_equal 3, Issue.find(1).status_id - end - - should "ignore unauthorized status" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:status_id => 2, :notes => 'just trying'} - end - assert_equal 1, Issue.find(1).status_id - end - - should "accept authorized attributes changes" do - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:subject => 'changed', :assigned_to_id => 2, :notes => 'just trying'} - end - issue = Issue.find(1) - assert_equal "changed", issue.subject - assert_equal 2, issue.assigned_to_id - end - end - end - - def test_new_as_copy - @request.session[:user_id] = 2 - get :new, :project_id => 1, :copy_from => 1 - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:issue) - orig = Issue.find(1) - assert_equal 1, assigns(:issue).project_id - assert_equal orig.subject, assigns(:issue).subject - assert assigns(:issue).copy? - - assert_select 'form[id=issue-form][action=/projects/ecookbook/issues]' do - assert_select 'select[name=?]', 'issue[project_id]' do - assert_select 'option[value=1][selected=selected]', :text => 'eCookbook' - assert_select 'option[value=2]:not([selected])', :text => 'OnlineStore' - end - assert_select 'input[name=copy_from][value=1]' - end - - # "New issue" menu item should not link to copy - assert_select '#main-menu a.new-issue[href=/projects/ecookbook/issues/new]' - end - - def test_new_as_copy_with_attachments_should_show_copy_attachments_checkbox - @request.session[:user_id] = 2 - issue = Issue.find(3) - assert issue.attachments.count > 0 - get :new, :project_id => 1, :copy_from => 3 - - assert_select 'input[name=copy_attachments][type=checkbox][checked=checked][value=1]' - end - - def test_new_as_copy_without_attachments_should_not_show_copy_attachments_checkbox - @request.session[:user_id] = 2 - issue = Issue.find(3) - issue.attachments.delete_all - get :new, :project_id => 1, :copy_from => 3 - - assert_select 'input[name=copy_attachments]', 0 - end - - def test_new_as_copy_with_subtasks_should_show_copy_subtasks_checkbox - @request.session[:user_id] = 2 - issue = Issue.generate_with_descendants! - get :new, :project_id => 1, :copy_from => issue.id - - assert_select 'input[type=checkbox][name=copy_subtasks][checked=checked][value=1]' - end - - def test_new_as_copy_with_invalid_issue_should_respond_with_404 - @request.session[:user_id] = 2 - get :new, :project_id => 1, :copy_from => 99999 - assert_response 404 - end - - def test_create_as_copy_on_different_project - @request.session[:user_id] = 2 - assert_difference 'Issue.count' do - post :create, :project_id => 1, :copy_from => 1, - :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => 'Copy'} - - assert_not_nil assigns(:issue) - assert assigns(:issue).copy? - end - issue = Issue.first(:order => 'id DESC') - assert_redirected_to "/issues/#{issue.id}" - - assert_equal 2, issue.project_id - assert_equal 3, issue.tracker_id - assert_equal 'Copy', issue.subject - end - - def test_create_as_copy_should_copy_attachments - @request.session[:user_id] = 2 - issue = Issue.find(3) - count = issue.attachments.count - assert count > 0 - - assert_difference 'Issue.count' do - assert_difference 'Attachment.count', count do - assert_no_difference 'Journal.count' do - post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'}, - :copy_attachments => '1' - end - end - end - copy = Issue.first(:order => 'id DESC') - assert_equal count, copy.attachments.count - assert_equal issue.attachments.map(&:filename).sort, copy.attachments.map(&:filename).sort - end - - def test_create_as_copy_without_copy_attachments_option_should_not_copy_attachments - @request.session[:user_id] = 2 - issue = Issue.find(3) - count = issue.attachments.count - assert count > 0 - - assert_difference 'Issue.count' do - assert_no_difference 'Attachment.count' do - assert_no_difference 'Journal.count' do - post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'} - end - end - end - copy = Issue.first(:order => 'id DESC') - assert_equal 0, copy.attachments.count - end - - def test_create_as_copy_with_attachments_should_add_new_files - @request.session[:user_id] = 2 - issue = Issue.find(3) - count = issue.attachments.count - assert count > 0 - - assert_difference 'Issue.count' do - assert_difference 'Attachment.count', count + 1 do - assert_no_difference 'Journal.count' do - post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with attachments'}, - :copy_attachments => '1', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - end - end - end - copy = Issue.first(:order => 'id DESC') - assert_equal count + 1, copy.attachments.count - end - - def test_create_as_copy_should_add_relation_with_copied_issue - @request.session[:user_id] = 2 - - assert_difference 'Issue.count' do - assert_difference 'IssueRelation.count' do - post :create, :project_id => 1, :copy_from => 1, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy'} - end - end - copy = Issue.first(:order => 'id DESC') - assert_equal 1, copy.relations.size - end - - def test_create_as_copy_should_copy_subtasks - @request.session[:user_id] = 2 - issue = Issue.generate_with_descendants! - count = issue.descendants.count - - assert_difference 'Issue.count', count+1 do - assert_no_difference 'Journal.count' do - post :create, :project_id => 1, :copy_from => issue.id, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'}, - :copy_subtasks => '1' - end - end - copy = Issue.where(:parent_id => nil).first(:order => 'id DESC') - assert_equal count, copy.descendants.count - assert_equal issue.descendants.map(&:subject).sort, copy.descendants.map(&:subject).sort - end - - def test_create_as_copy_without_copy_subtasks_option_should_not_copy_subtasks - @request.session[:user_id] = 2 - issue = Issue.generate_with_descendants! - - assert_difference 'Issue.count', 1 do - assert_no_difference 'Journal.count' do - post :create, :project_id => 1, :copy_from => 3, - :issue => {:project_id => '1', :tracker_id => '3', :status_id => '1', :subject => 'Copy with subtasks'} - end - end - copy = Issue.where(:parent_id => nil).first(:order => 'id DESC') - assert_equal 0, copy.descendants.count - end - - def test_create_as_copy_with_failure - @request.session[:user_id] = 2 - post :create, :project_id => 1, :copy_from => 1, - :issue => {:project_id => '2', :tracker_id => '3', :status_id => '1', :subject => ''} - - assert_response :success - assert_template 'new' - - assert_not_nil assigns(:issue) - assert assigns(:issue).copy? - - assert_select 'form#issue-form[action=/projects/ecookbook/issues]' do - assert_select 'select[name=?]', 'issue[project_id]' do - assert_select 'option[value=1]:not([selected])', :text => 'eCookbook' - assert_select 'option[value=2][selected=selected]', :text => 'OnlineStore' - end - assert_select 'input[name=copy_from][value=1]' - end - end - - def test_create_as_copy_on_project_without_permission_should_ignore_target_project - @request.session[:user_id] = 2 - assert !User.find(2).member_of?(Project.find(4)) - - assert_difference 'Issue.count' do - post :create, :project_id => 1, :copy_from => 1, - :issue => {:project_id => '4', :tracker_id => '3', :status_id => '1', :subject => 'Copy'} - end - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.project_id - end - - def test_get_edit - @request.session[:user_id] = 2 - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - assert_not_nil assigns(:issue) - assert_equal Issue.find(1), assigns(:issue) - - # Be sure we don't display inactive IssuePriorities - assert ! IssuePriority.find(15).active? - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=15]', 0 - end - end - - def test_get_edit_should_display_the_time_entry_form_with_log_time_permission - @request.session[:user_id] = 2 - Role.find_by_name('Manager').update_attribute :permissions, [:view_issues, :edit_issues, :log_time] - - get :edit, :id => 1 - assert_select 'input[name=?]', 'time_entry[hours]' - end - - def test_get_edit_should_not_display_the_time_entry_form_without_log_time_permission - @request.session[:user_id] = 2 - Role.find_by_name('Manager').remove_permission! :log_time - - get :edit, :id => 1 - assert_select 'input[name=?]', 'time_entry[hours]', 0 - end - - def test_get_edit_with_params - @request.session[:user_id] = 2 - get :edit, :id => 1, :issue => { :status_id => 5, :priority_id => 7 }, - :time_entry => { :hours => '2.5', :comments => 'test_get_edit_with_params', :activity_id => 10 } - assert_response :success - assert_template 'edit' - - issue = assigns(:issue) - assert_not_nil issue - - assert_equal 5, issue.status_id - assert_select 'select[name=?]', 'issue[status_id]' do - assert_select 'option[value=5][selected=selected]', :text => 'Closed' - end - - assert_equal 7, issue.priority_id - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=7][selected=selected]', :text => 'Urgent' - end - - assert_select 'input[name=?][value=2.5]', 'time_entry[hours]' - assert_select 'select[name=?]', 'time_entry[activity_id]' do - assert_select 'option[value=10][selected=selected]', :text => 'Development' - end - assert_select 'input[name=?][value=test_get_edit_with_params]', 'time_entry[comments]' - end - - def test_get_edit_with_multi_custom_field - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(1) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - - @request.session[:user_id] = 2 - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - - assert_select 'select[name=?][multiple=multiple]', 'issue[custom_field_values][1][]' do - assert_select 'option', 3 - assert_select 'option[value=MySQL][selected=selected]' - assert_select 'option[value=Oracle][selected=selected]' - assert_select 'option[value=PostgreSQL]:not([selected])' - end - end - - def test_update_form_for_existing_issue - @request.session[:user_id] = 2 - xhr :put, :update_form, :project_id => 1, - :id => 1, - :issue => {:tracker_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5} - assert_response :success - assert_equal 'text/javascript', response.content_type - assert_template 'update_form' - assert_template 'form' - - issue = assigns(:issue) - assert_kind_of Issue, issue - assert_equal 1, issue.id - assert_equal 1, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 'This is the test_new issue', issue.subject - end - - def test_update_form_for_existing_issue_should_keep_issue_author - @request.session[:user_id] = 3 - xhr :put, :update_form, :project_id => 1, :id => 1, :issue => {:subject => 'Changed'} - assert_response :success - assert_equal 'text/javascript', response.content_type - - issue = assigns(:issue) - assert_equal User.find(2), issue.author - assert_equal 2, issue.author_id - assert_not_equal User.current, issue.author - end - - def test_update_form_for_existing_issue_should_propose_transitions_based_on_initial_status - @request.session[:user_id] = 2 - WorkflowTransition.delete_all - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 5, :new_status_id => 4) - - xhr :put, :update_form, :project_id => 1, - :id => 2, - :issue => {:tracker_id => 2, - :status_id => 5, - :subject => 'This is an issue'} - - assert_equal 5, assigns(:issue).status_id - assert_equal [1,2,5], assigns(:allowed_statuses).map(&:id).sort - end - - def test_update_form_for_existing_issue_with_project_change - @request.session[:user_id] = 2 - xhr :put, :update_form, :project_id => 1, - :id => 1, - :issue => {:project_id => 2, - :tracker_id => 2, - :subject => 'This is the test_new issue', - :description => 'This is the description', - :priority_id => 5} - assert_response :success - assert_template 'form' - - issue = assigns(:issue) - assert_kind_of Issue, issue - assert_equal 1, issue.id - assert_equal 2, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 'This is the test_new issue', issue.subject - end - - def test_put_update_without_custom_fields_param - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - issue = Issue.find(1) - assert_equal '125', issue.custom_value_for(2).value - old_subject = issue.subject - new_subject = 'Subject modified by IssuesControllerTest#test_post_edit' - - assert_difference('Journal.count') do - assert_difference('JournalDetail.count', 2) do - put :update, :id => 1, :issue => {:subject => new_subject, - :priority_id => '6', - :category_id => '1' # no change - } - end - end - assert_redirected_to :action => 'show', :id => '1' - issue.reload - assert_equal new_subject, issue.subject - # Make sure custom fields were not cleared - assert_equal '125', issue.custom_value_for(2).value - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]") - assert_mail_body_match "Subject changed from #{old_subject} to #{new_subject}", mail - end - - def test_put_update_with_project_change - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - assert_difference('Journal.count') do - assert_difference('JournalDetail.count', 3) do - put :update, :id => 1, :issue => {:project_id => '2', - :tracker_id => '1', # no change - :priority_id => '6', - :category_id => '3' - } - end - end - assert_redirected_to :action => 'show', :id => '1' - issue = Issue.find(1) - assert_equal 2, issue.project_id - assert_equal 1, issue.tracker_id - assert_equal 6, issue.priority_id - assert_equal 3, issue.category_id - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]") - assert_mail_body_match "Project changed from eCookbook to OnlineStore", mail - end - - def test_put_update_with_tracker_change - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - assert_difference('Journal.count') do - assert_difference('JournalDetail.count', 2) do - put :update, :id => 1, :issue => {:project_id => '1', - :tracker_id => '2', - :priority_id => '6' - } - end - end - assert_redirected_to :action => 'show', :id => '1' - issue = Issue.find(1) - assert_equal 1, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 6, issue.priority_id - assert_equal 1, issue.category_id - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert mail.subject.starts_with?("[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}]") - assert_mail_body_match "Tracker changed from Bug to Feature request", mail - end - - def test_put_update_with_custom_field_change - @request.session[:user_id] = 2 - issue = Issue.find(1) - assert_equal '125', issue.custom_value_for(2).value - - assert_difference('Journal.count') do - assert_difference('JournalDetail.count', 3) do - put :update, :id => 1, :issue => {:subject => 'Custom field change', - :priority_id => '6', - :category_id => '1', # no change - :custom_field_values => { '2' => 'New custom value' } - } - end - end - assert_redirected_to :action => 'show', :id => '1' - issue.reload - assert_equal 'New custom value', issue.custom_value_for(2).value - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_mail_body_match "Searchable field changed from 125 to New custom value", mail - end - - def test_put_update_with_multi_custom_field_change - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(1) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - - @request.session[:user_id] = 2 - assert_difference('Journal.count') do - assert_difference('JournalDetail.count', 3) do - put :update, :id => 1, - :issue => { - :subject => 'Custom field change', - :custom_field_values => { '1' => ['', 'Oracle', 'PostgreSQL'] } - } - end - end - assert_redirected_to :action => 'show', :id => '1' - assert_equal ['Oracle', 'PostgreSQL'], Issue.find(1).custom_field_value(1).sort - end - - def test_put_update_with_status_and_assignee_change - issue = Issue.find(1) - assert_equal 1, issue.status_id - @request.session[:user_id] = 2 - assert_difference('TimeEntry.count', 0) do - put :update, - :id => 1, - :issue => { :status_id => 2, :assigned_to_id => 3, :notes => 'Assigned to dlopper' }, - :time_entry => { :hours => '', :comments => '', :activity_id => TimeEntryActivity.first } - end - assert_redirected_to :action => 'show', :id => '1' - issue.reload - assert_equal 2, issue.status_id - j = Journal.order('id DESC').first - assert_equal 'Assigned to dlopper', j.notes - assert_equal 2, j.details.size - - mail = ActionMailer::Base.deliveries.last - assert_mail_body_match "Status changed from New to Assigned", mail - # subject should contain the new status - assert mail.subject.include?("(#{ IssueStatus.find(2).name })") - end - - def test_put_update_with_note_only - notes = 'Note added by IssuesControllerTest#test_update_with_note_only' - # anonymous user - put :update, - :id => 1, - :issue => { :notes => notes } - assert_redirected_to :action => 'show', :id => '1' - j = Journal.order('id DESC').first - assert_equal notes, j.notes - assert_equal 0, j.details.size - assert_equal User.anonymous, j.user - - mail = ActionMailer::Base.deliveries.last - assert_mail_body_match notes, mail - end - - def test_put_update_with_private_note_only - notes = 'Private note' - @request.session[:user_id] = 2 - - assert_difference 'Journal.count' do - put :update, :id => 1, :issue => {:notes => notes, :private_notes => '1'} - assert_redirected_to :action => 'show', :id => '1' - end - - j = Journal.order('id DESC').first - assert_equal notes, j.notes - assert_equal true, j.private_notes - end - - def test_put_update_with_private_note_and_changes - notes = 'Private note' - @request.session[:user_id] = 2 - - assert_difference 'Journal.count', 2 do - put :update, :id => 1, :issue => {:subject => 'New subject', :notes => notes, :private_notes => '1'} - assert_redirected_to :action => 'show', :id => '1' - end - - j = Journal.order('id DESC').first - assert_equal notes, j.notes - assert_equal true, j.private_notes - assert_equal 0, j.details.count - - j = Journal.order('id DESC').offset(1).first - assert_nil j.notes - assert_equal false, j.private_notes - assert_equal 1, j.details.count - end - - def test_put_update_with_note_and_spent_time - @request.session[:user_id] = 2 - spent_hours_before = Issue.find(1).spent_hours - assert_difference('TimeEntry.count') do - put :update, - :id => 1, - :issue => { :notes => '2.5 hours added' }, - :time_entry => { :hours => '2.5', :comments => 'test_put_update_with_note_and_spent_time', :activity_id => TimeEntryActivity.first.id } - end - assert_redirected_to :action => 'show', :id => '1' - - issue = Issue.find(1) - - j = Journal.order('id DESC').first - assert_equal '2.5 hours added', j.notes - assert_equal 0, j.details.size - - t = issue.time_entries.find_by_comments('test_put_update_with_note_and_spent_time') - assert_not_nil t - assert_equal 2.5, t.hours - assert_equal spent_hours_before + 2.5, issue.spent_hours - end - - def test_put_update_should_preserve_parent_issue_even_if_not_visible - parent = Issue.generate!(:project_id => 1, :is_private => true) - issue = Issue.generate!(:parent_issue_id => parent.id) - assert !parent.visible?(User.find(3)) - @request.session[:user_id] = 3 - - get :edit, :id => issue.id - assert_select 'input[name=?][value=?]', 'issue[parent_issue_id]', parent.id.to_s - - put :update, :id => issue.id, :issue => {:subject => 'New subject', :parent_issue_id => parent.id.to_s} - assert_response 302 - assert_equal parent, issue.parent - end - - def test_put_update_with_attachment_only - set_tmp_attachments_directory - - # Delete all fixtured journals, a race condition can occur causing the wrong - # journal to get fetched in the next find. - Journal.delete_all - - # anonymous user - assert_difference 'Attachment.count' do - put :update, :id => 1, - :issue => {:notes => ''}, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - end - - assert_redirected_to :action => 'show', :id => '1' - j = Issue.find(1).journals.reorder('id DESC').first - assert j.notes.blank? - assert_equal 1, j.details.size - assert_equal 'testfile.txt', j.details.first.value - assert_equal User.anonymous, j.user - - attachment = Attachment.first(:order => 'id DESC') - assert_equal Issue.find(1), attachment.container - assert_equal User.anonymous, attachment.author - assert_equal 'testfile.txt', attachment.filename - assert_equal 'text/plain', attachment.content_type - assert_equal 'test file', attachment.description - assert_equal 59, attachment.filesize - assert File.exists?(attachment.diskfile) - assert_equal 59, File.size(attachment.diskfile) - - mail = ActionMailer::Base.deliveries.last - assert_mail_body_match 'testfile.txt', mail - end - - def test_put_update_with_failure_should_save_attachments - set_tmp_attachments_directory - @request.session[:user_id] = 2 - - assert_no_difference 'Journal.count' do - assert_difference 'Attachment.count' do - put :update, :id => 1, - :issue => { :subject => '' }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - assert_response :success - assert_template 'edit' - end - end - - attachment = Attachment.first(:order => 'id DESC') - assert_equal 'testfile.txt', attachment.filename - assert File.exists?(attachment.diskfile) - assert_nil attachment.container - - assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token - assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt' - end - - def test_put_update_with_failure_should_keep_saved_attachments - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - @request.session[:user_id] = 2 - - assert_no_difference 'Journal.count' do - assert_no_difference 'Attachment.count' do - put :update, :id => 1, - :issue => { :subject => '' }, - :attachments => {'p0' => {'token' => attachment.token}} - assert_response :success - assert_template 'edit' - end - end - - assert_select 'input[name=?][value=?]', 'attachments[p0][token]', attachment.token - assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'testfile.txt' - end - - def test_put_update_should_attach_saved_attachments - set_tmp_attachments_directory - attachment = Attachment.create!(:file => uploaded_test_file("testfile.txt", "text/plain"), :author_id => 2) - @request.session[:user_id] = 2 - - assert_difference 'Journal.count' do - assert_difference 'JournalDetail.count' do - assert_no_difference 'Attachment.count' do - put :update, :id => 1, - :issue => {:notes => 'Attachment added'}, - :attachments => {'p0' => {'token' => attachment.token}} - assert_redirected_to '/issues/1' - end - end - end - - attachment.reload - assert_equal Issue.find(1), attachment.container - - journal = Journal.first(:order => 'id DESC') - assert_equal 1, journal.details.size - assert_equal 'testfile.txt', journal.details.first.value - end - - def test_put_update_with_attachment_that_fails_to_save - set_tmp_attachments_directory - - # Delete all fixtured journals, a race condition can occur causing the wrong - # journal to get fetched in the next find. - Journal.delete_all - - # Mock out the unsaved attachment - Attachment.any_instance.stubs(:create).returns(Attachment.new) - - # anonymous user - put :update, - :id => 1, - :issue => {:notes => ''}, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - assert_redirected_to :action => 'show', :id => '1' - assert_equal '1 file(s) could not be saved.', flash[:warning] - end - - def test_put_update_with_no_change - issue = Issue.find(1) - issue.journals.clear - ActionMailer::Base.deliveries.clear - - put :update, - :id => 1, - :issue => {:notes => ''} - assert_redirected_to :action => 'show', :id => '1' - - issue.reload - assert issue.journals.empty? - # No email should be sent - assert ActionMailer::Base.deliveries.empty? - end - - def test_put_update_should_send_a_notification - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - issue = Issue.find(1) - old_subject = issue.subject - new_subject = 'Subject modified by IssuesControllerTest#test_post_edit' - - put :update, :id => 1, :issue => {:subject => new_subject, - :priority_id => '6', - :category_id => '1' # no change - } - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_put_update_with_invalid_spent_time_hours_only - @request.session[:user_id] = 2 - notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time' - - assert_no_difference('Journal.count') do - put :update, - :id => 1, - :issue => {:notes => notes}, - :time_entry => {"comments"=>"", "activity_id"=>"", "hours"=>"2z"} - end - assert_response :success - assert_template 'edit' - - assert_error_tag :descendant => {:content => /Activity can't be blank/} - assert_select 'textarea[name=?]', 'issue[notes]', :text => notes - assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2z' - end - - def test_put_update_with_invalid_spent_time_comments_only - @request.session[:user_id] = 2 - notes = 'Note added by IssuesControllerTest#test_post_edit_with_invalid_spent_time' - - assert_no_difference('Journal.count') do - put :update, - :id => 1, - :issue => {:notes => notes}, - :time_entry => {"comments"=>"this is my comment", "activity_id"=>"", "hours"=>""} - end - assert_response :success - assert_template 'edit' - - assert_error_tag :descendant => {:content => /Activity can't be blank/} - assert_error_tag :descendant => {:content => /Hours can't be blank/} - assert_select 'textarea[name=?]', 'issue[notes]', :text => notes - assert_select 'input[name=?][value=?]', 'time_entry[comments]', 'this is my comment' - end - - def test_put_update_should_allow_fixed_version_to_be_set_to_a_subproject - issue = Issue.find(2) - @request.session[:user_id] = 2 - - put :update, - :id => issue.id, - :issue => { - :fixed_version_id => 4 - } - - assert_response :redirect - issue.reload - assert_equal 4, issue.fixed_version_id - assert_not_equal issue.project_id, issue.fixed_version.project_id - end - - def test_put_update_should_redirect_back_using_the_back_url_parameter - issue = Issue.find(2) - @request.session[:user_id] = 2 - - put :update, - :id => issue.id, - :issue => { - :fixed_version_id => 4 - }, - :back_url => '/issues' - - assert_response :redirect - assert_redirected_to '/issues' - end - - def test_put_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host - issue = Issue.find(2) - @request.session[:user_id] = 2 - - put :update, - :id => issue.id, - :issue => { - :fixed_version_id => 4 - }, - :back_url => 'http://google.com' - - assert_response :redirect - assert_redirected_to :controller => 'issues', :action => 'show', :id => issue.id - end - - def test_get_bulk_edit - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - assert_response :success - assert_template 'bulk_edit' - - assert_select 'ul#bulk-selection' do - assert_select 'li', 2 - assert_select 'li a', :text => 'Bug #1' - end - - assert_select 'form#bulk_edit_form[action=?]', '/issues/bulk_update' do - assert_select 'input[name=?]', 'ids[]', 2 - assert_select 'input[name=?][value=1][type=hidden]', 'ids[]' - - assert_select 'select[name=?]', 'issue[project_id]' - assert_select 'input[name=?]', 'issue[parent_issue_id]' - - # Project specific custom field, date type - field = CustomField.find(9) - assert !field.is_for_all? - assert_equal 'date', field.field_format - assert_select 'input[name=?]', 'issue[custom_field_values][9]' - - # System wide custom field - assert CustomField.find(1).is_for_all? - assert_select 'select[name=?]', 'issue[custom_field_values][1]' - - # Be sure we don't display inactive IssuePriorities - assert ! IssuePriority.find(15).active? - assert_select 'select[name=?]', 'issue[priority_id]' do - assert_select 'option[value=15]', 0 - end - end - end - - def test_get_bulk_edit_on_different_projects - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2, 6] - assert_response :success - assert_template 'bulk_edit' - - # Can not set issues from different projects as children of an issue - assert_select 'input[name=?]', 'issue[parent_issue_id]', 0 - - # Project specific custom field, date type - field = CustomField.find(9) - assert !field.is_for_all? - assert !field.project_ids.include?(Issue.find(6).project_id) - assert_select 'input[name=?]', 'issue[custom_field_values][9]', 0 - end - - def test_get_bulk_edit_with_user_custom_field - field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true) - - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - assert_response :success - assert_template 'bulk_edit' - - assert_select 'select.user_cf[name=?]', "issue[custom_field_values][#{field.id}]" do - assert_select 'option', Project.find(1).users.count + 2 # "no change" + "none" options - end - end - - def test_get_bulk_edit_with_version_custom_field - field = IssueCustomField.create!(:name => 'Affected version', :field_format => 'version', :is_for_all => true) - - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - assert_response :success - assert_template 'bulk_edit' - - assert_select 'select.version_cf[name=?]', "issue[custom_field_values][#{field.id}]" do - assert_select 'option', Project.find(1).shared_versions.count + 2 # "no change" + "none" options - end - end - - def test_get_bulk_edit_with_multi_custom_field - field = CustomField.find(1) - field.update_attribute :multiple, true - - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - assert_response :success - assert_template 'bulk_edit' - - assert_select 'select[name=?]', 'issue[custom_field_values][1][]' do - assert_select 'option', field.possible_values.size + 1 # "none" options - end - end - - def test_bulk_edit_should_only_propose_statuses_allowed_for_all_issues - WorkflowTransition.delete_all - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 1) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 3) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 1, :new_status_id => 4) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 1) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 3) - WorkflowTransition.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :new_status_id => 5) - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - - assert_response :success - statuses = assigns(:available_statuses) - assert_not_nil statuses - assert_equal [1, 3], statuses.map(&:id).sort - - assert_select 'select[name=?]', 'issue[status_id]' do - assert_select 'option', 3 # 2 statuses + "no change" option - end - end - - def test_bulk_edit_should_propose_target_project_open_shared_versions - @request.session[:user_id] = 2 - post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1} - assert_response :success - assert_template 'bulk_edit' - assert_equal Project.find(1).shared_versions.open.all.sort, assigns(:versions).sort - - assert_select 'select[name=?]', 'issue[fixed_version_id]' do - assert_select 'option', :text => '2.0' - end - end - - def test_bulk_edit_should_propose_target_project_categories - @request.session[:user_id] = 2 - post :bulk_edit, :ids => [1, 2, 6], :issue => {:project_id => 1} - assert_response :success - assert_template 'bulk_edit' - assert_equal Project.find(1).issue_categories.sort, assigns(:categories).sort - - assert_select 'select[name=?]', 'issue[category_id]' do - assert_select 'option', :text => 'Recipes' - end - end - - def test_bulk_update - @request.session[:user_id] = 2 - # update issues priority - post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing', - :issue => {:priority_id => 7, - :assigned_to_id => '', - :custom_field_values => {'2' => ''}} - - assert_response 302 - # check that the issues were updated - assert_equal [7, 7], Issue.find_all_by_id([1, 2]).collect {|i| i.priority.id} - - issue = Issue.find(1) - journal = issue.journals.reorder('created_on DESC').first - assert_equal '125', issue.custom_value_for(2).value - assert_equal 'Bulk editing', journal.notes - assert_equal 1, journal.details.size - end - - def test_bulk_update_with_group_assignee - group = Group.find(11) - project = Project.find(1) - project.members << Member.new(:principal => group, :roles => [Role.givable.first]) - - @request.session[:user_id] = 2 - # update issues assignee - post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing', - :issue => {:priority_id => '', - :assigned_to_id => group.id, - :custom_field_values => {'2' => ''}} - - assert_response 302 - assert_equal [group, group], Issue.find_all_by_id([1, 2]).collect {|i| i.assigned_to} - end - - def test_bulk_update_on_different_projects - @request.session[:user_id] = 2 - # update issues priority - post :bulk_update, :ids => [1, 2, 6], :notes => 'Bulk editing', - :issue => {:priority_id => 7, - :assigned_to_id => '', - :custom_field_values => {'2' => ''}} - - assert_response 302 - # check that the issues were updated - assert_equal [7, 7, 7], Issue.find([1,2,6]).map(&:priority_id) - - issue = Issue.find(1) - journal = issue.journals.reorder('created_on DESC').first - assert_equal '125', issue.custom_value_for(2).value - assert_equal 'Bulk editing', journal.notes - assert_equal 1, journal.details.size - end - - def test_bulk_update_on_different_projects_without_rights - @request.session[:user_id] = 3 - user = User.find(3) - action = { :controller => "issues", :action => "bulk_update" } - assert user.allowed_to?(action, Issue.find(1).project) - assert ! user.allowed_to?(action, Issue.find(6).project) - post :bulk_update, :ids => [1, 6], :notes => 'Bulk should fail', - :issue => {:priority_id => 7, - :assigned_to_id => '', - :custom_field_values => {'2' => ''}} - assert_response 403 - assert_not_equal "Bulk should fail", Journal.last.notes - end - - def test_bullk_update_should_send_a_notification - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - post(:bulk_update, - { - :ids => [1, 2], - :notes => 'Bulk editing', - :issue => { - :priority_id => 7, - :assigned_to_id => '', - :custom_field_values => {'2' => ''} - } - }) - - assert_response 302 - assert_equal 2, ActionMailer::Base.deliveries.size - end - - def test_bulk_update_project - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'} - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - # Issues moved to project 2 - assert_equal 2, Issue.find(1).project_id - assert_equal 2, Issue.find(2).project_id - # No tracker change - assert_equal 1, Issue.find(1).tracker_id - assert_equal 2, Issue.find(2).tracker_id - end - - def test_bulk_update_project_on_single_issue_should_follow_when_needed - @request.session[:user_id] = 2 - post :bulk_update, :id => 1, :issue => {:project_id => '2'}, :follow => '1' - assert_redirected_to '/issues/1' - end - - def test_bulk_update_project_on_multiple_issues_should_follow_when_needed - @request.session[:user_id] = 2 - post :bulk_update, :id => [1, 2], :issue => {:project_id => '2'}, :follow => '1' - assert_redirected_to '/projects/onlinestore/issues' - end - - def test_bulk_update_tracker - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :issue => {:tracker_id => '2'} - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - assert_equal 2, Issue.find(1).tracker_id - assert_equal 2, Issue.find(2).tracker_id - end - - def test_bulk_update_status - @request.session[:user_id] = 2 - # update issues priority - post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing status', - :issue => {:priority_id => '', - :assigned_to_id => '', - :status_id => '5'} - - assert_response 302 - issue = Issue.find(1) - assert issue.closed? - end - - def test_bulk_update_priority - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6} - - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - assert_equal 6, Issue.find(1).priority_id - assert_equal 6, Issue.find(2).priority_id - end - - def test_bulk_update_with_notes - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :notes => 'Moving two issues' - - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - assert_equal 'Moving two issues', Issue.find(1).journals.sort_by(&:id).last.notes - assert_equal 'Moving two issues', Issue.find(2).journals.sort_by(&:id).last.notes - end - - def test_bulk_update_parent_id - IssueRelation.delete_all - - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 3], - :notes => 'Bulk editing parent', - :issue => {:priority_id => '', :assigned_to_id => '', :status_id => '', :parent_issue_id => '2'} - - assert_response 302 - parent = Issue.find(2) - assert_equal parent.id, Issue.find(1).parent_id - assert_equal parent.id, Issue.find(3).parent_id - assert_equal [1, 3], parent.children.collect(&:id).sort - end - - def test_bulk_update_custom_field - @request.session[:user_id] = 2 - # update issues priority - post :bulk_update, :ids => [1, 2], :notes => 'Bulk editing custom field', - :issue => {:priority_id => '', - :assigned_to_id => '', - :custom_field_values => {'2' => '777'}} - - assert_response 302 - - issue = Issue.find(1) - journal = issue.journals.reorder('created_on DESC').first - assert_equal '777', issue.custom_value_for(2).value - assert_equal 1, journal.details.size - assert_equal '125', journal.details.first.old_value - assert_equal '777', journal.details.first.value - end - - def test_bulk_update_custom_field_to_blank - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing custom field', - :issue => {:priority_id => '', - :assigned_to_id => '', - :custom_field_values => {'1' => '__none__'}} - assert_response 302 - assert_equal '', Issue.find(1).custom_field_value(1) - assert_equal '', Issue.find(3).custom_field_value(1) - end - - def test_bulk_update_multi_custom_field - field = CustomField.find(1) - field.update_attribute :multiple, true - - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2, 3], :notes => 'Bulk editing multi custom field', - :issue => {:priority_id => '', - :assigned_to_id => '', - :custom_field_values => {'1' => ['MySQL', 'Oracle']}} - - assert_response 302 - - assert_equal ['MySQL', 'Oracle'], Issue.find(1).custom_field_value(1).sort - assert_equal ['MySQL', 'Oracle'], Issue.find(3).custom_field_value(1).sort - # the custom field is not associated with the issue tracker - assert_nil Issue.find(2).custom_field_value(1) - end - - def test_bulk_update_multi_custom_field_to_blank - field = CustomField.find(1) - field.update_attribute :multiple, true - - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 3], :notes => 'Bulk editing multi custom field', - :issue => {:priority_id => '', - :assigned_to_id => '', - :custom_field_values => {'1' => ['__none__']}} - assert_response 302 - assert_equal [''], Issue.find(1).custom_field_value(1) - assert_equal [''], Issue.find(3).custom_field_value(1) - end - - def test_bulk_update_unassign - assert_not_nil Issue.find(2).assigned_to - @request.session[:user_id] = 2 - # unassign issues - post :bulk_update, :ids => [1, 2], :notes => 'Bulk unassigning', :issue => {:assigned_to_id => 'none'} - assert_response 302 - # check that the issues were updated - assert_nil Issue.find(2).assigned_to - end - - def test_post_bulk_update_should_allow_fixed_version_to_be_set_to_a_subproject - @request.session[:user_id] = 2 - - post :bulk_update, :ids => [1,2], :issue => {:fixed_version_id => 4} - - assert_response :redirect - issues = Issue.find([1,2]) - issues.each do |issue| - assert_equal 4, issue.fixed_version_id - assert_not_equal issue.project_id, issue.fixed_version.project_id - end - end - - def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1,2], :back_url => '/issues' - - assert_response :redirect - assert_redirected_to '/issues' - end - - def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1,2], :back_url => 'http://google.com' - - assert_response :redirect - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => Project.find(1).identifier - end - - def test_bulk_update_with_failure_should_set_flash - @request.session[:user_id] = 2 - Issue.update_all("subject = ''", "id = 2") # Make it invalid - post :bulk_update, :ids => [1, 2], :issue => {:priority_id => 6} - - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook' - assert_equal 'Failed to save 1 issue(s) on 2 selected: #2.', flash[:error] - end - - def test_get_bulk_copy - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2, 3], :copy => '1' - assert_response :success - assert_template 'bulk_edit' - - issues = assigns(:issues) - assert_not_nil issues - assert_equal [1, 2, 3], issues.map(&:id).sort - - assert_select 'input[name=copy_attachments]' - end - - def test_bulk_copy_to_another_project - @request.session[:user_id] = 2 - assert_difference 'Issue.count', 2 do - assert_no_difference 'Project.find(1).issues.count' do - post :bulk_update, :ids => [1, 2], :issue => {:project_id => '2'}, :copy => '1' - end - end - assert_redirected_to '/projects/ecookbook/issues' - - copies = Issue.all(:order => 'id DESC', :limit => issues.size) - copies.each do |copy| - assert_equal 2, copy.project_id - end - end - - def test_bulk_copy_should_allow_not_changing_the_issue_attributes - @request.session[:user_id] = 2 - issues = [ - Issue.create!(:project_id => 1, :tracker_id => 1, :status_id => 1, :priority_id => 2, :subject => 'issue 1', :author_id => 1, :assigned_to_id => nil), - Issue.create!(:project_id => 2, :tracker_id => 3, :status_id => 2, :priority_id => 1, :subject => 'issue 2', :author_id => 2, :assigned_to_id => 3) - ] - - assert_difference 'Issue.count', issues.size do - post :bulk_update, :ids => issues.map(&:id), :copy => '1', - :issue => { - :project_id => '', :tracker_id => '', :assigned_to_id => '', - :status_id => '', :start_date => '', :due_date => '' - } - end - - copies = Issue.all(:order => 'id DESC', :limit => issues.size) - issues.each do |orig| - copy = copies.detect {|c| c.subject == orig.subject} - assert_not_nil copy - assert_equal orig.project_id, copy.project_id - assert_equal orig.tracker_id, copy.tracker_id - assert_equal orig.status_id, copy.status_id - assert_equal orig.assigned_to_id, copy.assigned_to_id - assert_equal orig.priority_id, copy.priority_id - end - end - - def test_bulk_copy_should_allow_changing_the_issue_attributes - # Fixes random test failure with Mysql - # where Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) - # doesn't return the expected results - Issue.delete_all("project_id=2") - - @request.session[:user_id] = 2 - assert_difference 'Issue.count', 2 do - assert_no_difference 'Project.find(1).issues.count' do - post :bulk_update, :ids => [1, 2], :copy => '1', - :issue => { - :project_id => '2', :tracker_id => '', :assigned_to_id => '4', - :status_id => '1', :start_date => '2009-12-01', :due_date => '2009-12-31' - } - end - end - - copied_issues = Issue.all(:limit => 2, :order => 'id desc', :conditions => {:project_id => 2}) - assert_equal 2, copied_issues.size - copied_issues.each do |issue| - assert_equal 2, issue.project_id, "Project is incorrect" - assert_equal 4, issue.assigned_to_id, "Assigned to is incorrect" - assert_equal 1, issue.status_id, "Status is incorrect" - assert_equal '2009-12-01', issue.start_date.to_s, "Start date is incorrect" - assert_equal '2009-12-31', issue.due_date.to_s, "Due date is incorrect" - end - end - - def test_bulk_copy_should_allow_adding_a_note - @request.session[:user_id] = 2 - assert_difference 'Issue.count', 1 do - post :bulk_update, :ids => [1], :copy => '1', - :notes => 'Copying one issue', - :issue => { - :project_id => '', :tracker_id => '', :assigned_to_id => '4', - :status_id => '3', :start_date => '2009-12-01', :due_date => '2009-12-31' - } - end - - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.journals.size - journal = issue.journals.first - assert_equal 0, journal.details.size - assert_equal 'Copying one issue', journal.notes - end - - def test_bulk_copy_should_allow_not_copying_the_attachments - attachment_count = Issue.find(3).attachments.size - assert attachment_count > 0 - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', 1 do - assert_no_difference 'Attachment.count' do - post :bulk_update, :ids => [3], :copy => '1', - :issue => { - :project_id => '' - } - end - end - end - - def test_bulk_copy_should_allow_copying_the_attachments - attachment_count = Issue.find(3).attachments.size - assert attachment_count > 0 - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', 1 do - assert_difference 'Attachment.count', attachment_count do - post :bulk_update, :ids => [3], :copy => '1', :copy_attachments => '1', - :issue => { - :project_id => '' - } - end - end - end - - def test_bulk_copy_should_add_relations_with_copied_issues - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', 2 do - assert_difference 'IssueRelation.count', 2 do - post :bulk_update, :ids => [1, 3], :copy => '1', - :issue => { - :project_id => '1' - } - end - end - end - - def test_bulk_copy_should_allow_not_copying_the_subtasks - issue = Issue.generate_with_descendants! - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', 1 do - post :bulk_update, :ids => [issue.id], :copy => '1', - :issue => { - :project_id => '' - } - end - end - - def test_bulk_copy_should_allow_copying_the_subtasks - issue = Issue.generate_with_descendants! - count = issue.descendants.count - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', count+1 do - post :bulk_update, :ids => [issue.id], :copy => '1', :copy_subtasks => '1', - :issue => { - :project_id => '' - } - end - copy = Issue.where(:parent_id => nil).order("id DESC").first - assert_equal count, copy.descendants.count - end - - def test_bulk_copy_should_not_copy_selected_subtasks_twice - issue = Issue.generate_with_descendants! - count = issue.descendants.count - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', count+1 do - post :bulk_update, :ids => issue.self_and_descendants.map(&:id), :copy => '1', :copy_subtasks => '1', - :issue => { - :project_id => '' - } - end - copy = Issue.where(:parent_id => nil).order("id DESC").first - assert_equal count, copy.descendants.count - end - - def test_bulk_copy_to_another_project_should_follow_when_needed - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1], :copy => '1', :issue => {:project_id => 2}, :follow => '1' - issue = Issue.first(:order => 'id DESC') - assert_redirected_to :controller => 'issues', :action => 'show', :id => issue - end - - def test_destroy_issue_with_no_time_entries - assert_nil TimeEntry.find_by_issue_id(2) - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', -1 do - delete :destroy, :id => 2 - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_nil Issue.find_by_id(2) - end - - def test_destroy_issues_with_time_entries - @request.session[:user_id] = 2 - - assert_no_difference 'Issue.count' do - delete :destroy, :ids => [1, 3] - end - assert_response :success - assert_template 'destroy' - assert_not_nil assigns(:hours) - assert Issue.find_by_id(1) && Issue.find_by_id(3) - - assert_select 'form' do - assert_select 'input[name=_method][value=delete]' - end - end - - def test_destroy_issues_and_destroy_time_entries - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', -2 do - assert_difference 'TimeEntry.count', -3 do - delete :destroy, :ids => [1, 3], :todo => 'destroy' - end - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert !(Issue.find_by_id(1) || Issue.find_by_id(3)) - assert_nil TimeEntry.find_by_id([1, 2]) - end - - def test_destroy_issues_and_assign_time_entries_to_project - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', -2 do - assert_no_difference 'TimeEntry.count' do - delete :destroy, :ids => [1, 3], :todo => 'nullify' - end - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert !(Issue.find_by_id(1) || Issue.find_by_id(3)) - assert_nil TimeEntry.find(1).issue_id - assert_nil TimeEntry.find(2).issue_id - end - - def test_destroy_issues_and_reassign_time_entries_to_another_issue - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', -2 do - assert_no_difference 'TimeEntry.count' do - delete :destroy, :ids => [1, 3], :todo => 'reassign', :reassign_to_id => 2 - end - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert !(Issue.find_by_id(1) || Issue.find_by_id(3)) - assert_equal 2, TimeEntry.find(1).issue_id - assert_equal 2, TimeEntry.find(2).issue_id - end - - def test_destroy_issues_from_different_projects - @request.session[:user_id] = 2 - - assert_difference 'Issue.count', -3 do - delete :destroy, :ids => [1, 2, 6], :todo => 'destroy' - end - assert_redirected_to :controller => 'issues', :action => 'index' - assert !(Issue.find_by_id(1) || Issue.find_by_id(2) || Issue.find_by_id(6)) - end - - def test_destroy_parent_and_child_issues - parent = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Parent Issue') - child = Issue.create!(:project_id => 1, :author_id => 1, :tracker_id => 1, :subject => 'Child Issue', :parent_issue_id => parent.id) - assert child.is_descendant_of?(parent.reload) - - @request.session[:user_id] = 2 - assert_difference 'Issue.count', -2 do - delete :destroy, :ids => [parent.id, child.id], :todo => 'destroy' - end - assert_response 302 - end - - def test_destroy_invalid_should_respond_with_404 - @request.session[:user_id] = 2 - assert_no_difference 'Issue.count' do - delete :destroy, :id => 999 - end - assert_response 404 - end - - def test_default_search_scope - get :index - - assert_select 'div#quick-search form' do - assert_select 'input[name=issues][value=1][type=hidden]' - end - end -end diff --git a/test/functional/issues_controller_transaction_test.rb b/test/functional/issues_controller_transaction_test.rb deleted file mode 100644 index 4841b2eff..000000000 --- a/test/functional/issues_controller_transaction_test.rb +++ /dev/null @@ -1,263 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) -require 'issues_controller' - -class IssuesControllerTransactionTest < ActionController::TestCase - tests IssuesController - fixtures :projects, - :users, - :roles, - :members, - :member_roles, - :issues, - :issue_statuses, - :versions, - :trackers, - :projects_trackers, - :issue_categories, - :enabled_modules, - :enumerations, - :attachments, - :workflows, - :custom_fields, - :custom_values, - :custom_fields_projects, - :custom_fields_trackers, - :time_entries, - :journals, - :journal_details, - :queries - - self.use_transactional_fixtures = false - - def setup - User.current = nil - end - - def test_update_stale_issue_should_not_update_the_issue - issue = Issue.find(2) - @request.session[:user_id] = 2 - - assert_no_difference 'Journal.count' do - assert_no_difference 'TimeEntry.count' do - put :update, - :id => issue.id, - :issue => { - :fixed_version_id => 4, - :notes => 'My notes', - :lock_version => (issue.lock_version - 1) - }, - :time_entry => { :hours => '2.5', :comments => '', :activity_id => TimeEntryActivity.first.id } - end - end - - assert_response :success - assert_template 'edit' - - assert_select 'div.conflict' - assert_select 'input[name=?][value=?]', 'conflict_resolution', 'overwrite' - assert_select 'input[name=?][value=?]', 'conflict_resolution', 'add_notes' - assert_select 'label' do - assert_select 'input[name=?][value=?]', 'conflict_resolution', 'cancel' - assert_select 'a[href=/issues/2]' - end - end - - def test_update_stale_issue_should_save_attachments - set_tmp_attachments_directory - issue = Issue.find(2) - @request.session[:user_id] = 2 - - assert_no_difference 'Journal.count' do - assert_no_difference 'TimeEntry.count' do - assert_difference 'Attachment.count' do - put :update, - :id => issue.id, - :issue => { - :fixed_version_id => 4, - :notes => 'My notes', - :lock_version => (issue.lock_version - 1) - }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}}, - :time_entry => { :hours => '2.5', :comments => '', :activity_id => TimeEntryActivity.first.id } - end - end - end - - assert_response :success - assert_template 'edit' - attachment = Attachment.first(:order => 'id DESC') - assert_tag 'input', :attributes => {:name => 'attachments[p0][token]', :value => attachment.token} - assert_tag 'input', :attributes => {:name => 'attachments[p0][filename]', :value => 'testfile.txt'} - end - - def test_update_stale_issue_without_notes_should_not_show_add_notes_option - issue = Issue.find(2) - @request.session[:user_id] = 2 - - put :update, :id => issue.id, - :issue => { - :fixed_version_id => 4, - :notes => '', - :lock_version => (issue.lock_version - 1) - } - - assert_tag 'div', :attributes => {:class => 'conflict'} - assert_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'overwrite'} - assert_no_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'add_notes'} - assert_tag 'input', :attributes => {:name => 'conflict_resolution', :value => 'cancel'} - end - - def test_update_stale_issue_should_show_conflicting_journals - @request.session[:user_id] = 2 - - put :update, :id => 1, - :issue => { - :fixed_version_id => 4, - :notes => '', - :lock_version => 2 - }, - :last_journal_id => 1 - - assert_not_nil assigns(:conflict_journals) - assert_equal 1, assigns(:conflict_journals).size - assert_equal 2, assigns(:conflict_journals).first.id - assert_tag 'div', :attributes => {:class => 'conflict'}, - :descendant => {:content => /Some notes with Redmine links/} - end - - def test_update_stale_issue_without_previous_journal_should_show_all_journals - @request.session[:user_id] = 2 - - put :update, :id => 1, - :issue => { - :fixed_version_id => 4, - :notes => '', - :lock_version => 2 - }, - :last_journal_id => '' - - assert_not_nil assigns(:conflict_journals) - assert_equal 2, assigns(:conflict_journals).size - assert_tag 'div', :attributes => {:class => 'conflict'}, - :descendant => {:content => /Some notes with Redmine links/} - assert_tag 'div', :attributes => {:class => 'conflict'}, - :descendant => {:content => /Journal notes/} - end - - def test_update_stale_issue_should_show_private_journals_with_permission_only - journal = Journal.create!(:journalized => Issue.find(1), :notes => 'Privates notes', :private_notes => true, :user_id => 1) - - @request.session[:user_id] = 2 - put :update, :id => 1, :issue => {:fixed_version_id => 4, :lock_version => 2}, :last_journal_id => '' - assert_include journal, assigns(:conflict_journals) - - Role.find(1).remove_permission! :view_private_notes - put :update, :id => 1, :issue => {:fixed_version_id => 4, :lock_version => 2}, :last_journal_id => '' - assert_not_include journal, assigns(:conflict_journals) - end - - def test_update_stale_issue_with_overwrite_conflict_resolution_should_update - @request.session[:user_id] = 2 - - assert_difference 'Journal.count' do - put :update, :id => 1, - :issue => { - :fixed_version_id => 4, - :notes => 'overwrite_conflict_resolution', - :lock_version => 2 - }, - :conflict_resolution => 'overwrite' - end - - assert_response 302 - issue = Issue.find(1) - assert_equal 4, issue.fixed_version_id - journal = Journal.first(:order => 'id DESC') - assert_equal 'overwrite_conflict_resolution', journal.notes - assert journal.details.any? - end - - def test_update_stale_issue_with_add_notes_conflict_resolution_should_update - @request.session[:user_id] = 2 - - assert_difference 'Journal.count' do - put :update, :id => 1, - :issue => { - :fixed_version_id => 4, - :notes => 'add_notes_conflict_resolution', - :lock_version => 2 - }, - :conflict_resolution => 'add_notes' - end - - assert_response 302 - issue = Issue.find(1) - assert_nil issue.fixed_version_id - journal = Journal.first(:order => 'id DESC') - assert_equal 'add_notes_conflict_resolution', journal.notes - assert journal.details.empty? - end - - def test_update_stale_issue_with_cancel_conflict_resolution_should_redirect_without_updating - @request.session[:user_id] = 2 - - assert_no_difference 'Journal.count' do - put :update, :id => 1, - :issue => { - :fixed_version_id => 4, - :notes => 'add_notes_conflict_resolution', - :lock_version => 2 - }, - :conflict_resolution => 'cancel' - end - - assert_redirected_to '/issues/1' - issue = Issue.find(1) - assert_nil issue.fixed_version_id - end - - def test_put_update_with_spent_time_and_failure_should_not_add_spent_time - @request.session[:user_id] = 2 - - assert_no_difference('TimeEntry.count') do - put :update, - :id => 1, - :issue => { :subject => '' }, - :time_entry => { :hours => '2.5', :comments => 'should not be added', :activity_id => TimeEntryActivity.first.id } - assert_response :success - end - - assert_select 'input[name=?][value=?]', 'time_entry[hours]', '2.5' - assert_select 'input[name=?][value=?]', 'time_entry[comments]', 'should not be added' - assert_select 'select[name=?]', 'time_entry[activity_id]' do - assert_select 'option[value=?][selected=selected]', TimeEntryActivity.first.id - end - end - - def test_index_should_rescue_invalid_sql_query - IssueQuery.any_instance.stubs(:statement).returns("INVALID STATEMENT") - - get :index - assert_response 500 - assert_tag 'p', :content => /An error occurred/ - assert_nil session[:query] - assert_nil session[:issues_index_sort] - end -end diff --git a/test/functional/journals_controller_test.rb b/test/functional/journals_controller_test.rb deleted file mode 100644 index 221257090..000000000 --- a/test/functional/journals_controller_test.rb +++ /dev/null @@ -1,147 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class JournalsControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :issues, :journals, :journal_details, :enabled_modules, - :trackers, :issue_statuses, :enumerations, :custom_fields, :custom_values, :custom_fields_projects - - def setup - User.current = nil - end - - def test_index - get :index, :project_id => 1 - assert_response :success - assert_not_nil assigns(:journals) - assert_equal 'application/atom+xml', @response.content_type - end - - def test_index_should_return_privates_notes_with_permission_only - journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true, :user_id => 1) - @request.session[:user_id] = 2 - - get :index, :project_id => 1 - assert_response :success - assert_include journal, assigns(:journals) - - Role.find(1).remove_permission! :view_private_notes - get :index, :project_id => 1 - assert_response :success - assert_not_include journal, assigns(:journals) - end - - def test_diff - get :diff, :id => 3, :detail_id => 4 - assert_response :success - assert_template 'diff' - - assert_tag 'span', - :attributes => {:class => 'diff_out'}, - :content => /removed/ - assert_tag 'span', - :attributes => {:class => 'diff_in'}, - :content => /added/ - end - - def test_reply_to_issue - @request.session[:user_id] = 2 - xhr :get, :new, :id => 6 - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - assert_include '> This is an issue', response.body - end - - def test_reply_to_issue_without_permission - @request.session[:user_id] = 7 - xhr :get, :new, :id => 6 - assert_response 403 - end - - def test_reply_to_note - @request.session[:user_id] = 2 - xhr :get, :new, :id => 6, :journal_id => 4 - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - assert_include '> A comment with a private version', response.body - end - - def test_reply_to_private_note_should_fail_without_permission - journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true) - @request.session[:user_id] = 2 - - xhr :get, :new, :id => 2, :journal_id => journal.id - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - assert_include '> Privates notes', response.body - - Role.find(1).remove_permission! :view_private_notes - xhr :get, :new, :id => 2, :journal_id => journal.id - assert_response 404 - end - - def test_edit_xhr - @request.session[:user_id] = 1 - xhr :get, :edit, :id => 2 - assert_response :success - assert_template 'edit' - assert_equal 'text/javascript', response.content_type - assert_include 'textarea', response.body - end - - def test_edit_private_note_should_fail_without_permission - journal = Journal.create!(:journalized => Issue.find(2), :notes => 'Privates notes', :private_notes => true) - @request.session[:user_id] = 2 - Role.find(1).add_permission! :edit_issue_notes - - xhr :get, :edit, :id => journal.id - assert_response :success - assert_template 'edit' - assert_equal 'text/javascript', response.content_type - assert_include 'textarea', response.body - - Role.find(1).remove_permission! :view_private_notes - xhr :get, :edit, :id => journal.id - assert_response 404 - end - - def test_update_xhr - @request.session[:user_id] = 1 - xhr :post, :edit, :id => 2, :notes => 'Updated notes' - assert_response :success - assert_template 'update' - assert_equal 'text/javascript', response.content_type - assert_equal 'Updated notes', Journal.find(2).notes - assert_include 'journal-2-notes', response.body - end - - def test_update_xhr_with_empty_notes_should_delete_the_journal - @request.session[:user_id] = 1 - assert_difference 'Journal.count', -1 do - xhr :post, :edit, :id => 2, :notes => '' - assert_response :success - assert_template 'update' - assert_equal 'text/javascript', response.content_type - end - assert_nil Journal.find_by_id(2) - assert_include 'change-2', response.body - end -end diff --git a/test/functional/mail_handler_controller_test.rb b/test/functional/mail_handler_controller_test.rb deleted file mode 100644 index 7431066f6..000000000 --- a/test/functional/mail_handler_controller_test.rb +++ /dev/null @@ -1,74 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class MailHandlerControllerTest < ActionController::TestCase - fixtures :users, :projects, :enabled_modules, :roles, :members, :member_roles, :issues, :issue_statuses, - :trackers, :projects_trackers, :enumerations - - FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler' - - def setup - User.current = nil - end - - def test_should_create_issue - # Enable API and set a key - Setting.mail_handler_api_enabled = 1 - Setting.mail_handler_api_key = 'secret' - - assert_difference 'Issue.count' do - post :index, :key => 'secret', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml')) - end - assert_response 201 - end - - def test_should_respond_with_422_if_not_created - Project.find('onlinestore').destroy - - Setting.mail_handler_api_enabled = 1 - Setting.mail_handler_api_key = 'secret' - - assert_no_difference 'Issue.count' do - post :index, :key => 'secret', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml')) - end - assert_response 422 - end - - def test_should_not_allow_with_api_disabled - # Disable API - Setting.mail_handler_api_enabled = 0 - Setting.mail_handler_api_key = 'secret' - - assert_no_difference 'Issue.count' do - post :index, :key => 'secret', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml')) - end - assert_response 403 - end - - def test_should_not_allow_with_wrong_key - # Disable API - Setting.mail_handler_api_enabled = 1 - Setting.mail_handler_api_key = 'secret' - - assert_no_difference 'Issue.count' do - post :index, :key => 'wrong', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml')) - end - assert_response 403 - end -end diff --git a/test/functional/members_controller_test.rb b/test/functional/members_controller_test.rb deleted file mode 100644 index 993dfaed7..000000000 --- a/test/functional/members_controller_test.rb +++ /dev/null @@ -1,111 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class MembersControllerTest < ActionController::TestCase - fixtures :projects, :members, :member_roles, :roles, :users - - def setup - User.current = nil - @request.session[:user_id] = 2 - end - - def test_create - assert_difference 'Member.count' do - post :create, :project_id => 1, :membership => {:role_ids => [1], :user_id => 7} - end - assert_redirected_to '/projects/ecookbook/settings/members' - assert User.find(7).member_of?(Project.find(1)) - end - - def test_create_multiple - assert_difference 'Member.count', 3 do - post :create, :project_id => 1, :membership => {:role_ids => [1], :user_ids => [7, 8, 9]} - end - assert_redirected_to '/projects/ecookbook/settings/members' - assert User.find(7).member_of?(Project.find(1)) - end - - def test_xhr_create - assert_difference 'Member.count', 3 do - xhr :post, :create, :project_id => 1, :membership => {:role_ids => [1], :user_ids => [7, 8, 9]} - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - end - assert User.find(7).member_of?(Project.find(1)) - assert User.find(8).member_of?(Project.find(1)) - assert User.find(9).member_of?(Project.find(1)) - assert_include 'tab-content-members', response.body - end - - def test_xhr_create_with_failure - assert_no_difference 'Member.count' do - xhr :post, :create, :project_id => 1, :membership => {:role_ids => [], :user_ids => [7, 8, 9]} - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - end - assert_match /alert/, response.body, "Alert message not sent" - end - - def test_edit - assert_no_difference 'Member.count' do - put :update, :id => 2, :membership => {:role_ids => [1], :user_id => 3} - end - assert_redirected_to '/projects/ecookbook/settings/members' - end - - def test_xhr_edit - assert_no_difference 'Member.count' do - xhr :put, :update, :id => 2, :membership => {:role_ids => [1], :user_id => 3} - assert_response :success - assert_template 'update' - assert_equal 'text/javascript', response.content_type - end - member = Member.find(2) - assert_equal [1], member.role_ids - assert_equal 3, member.user_id - assert_include 'tab-content-members', response.body - end - - def test_destroy - assert_difference 'Member.count', -1 do - delete :destroy, :id => 2 - end - assert_redirected_to '/projects/ecookbook/settings/members' - assert !User.find(3).member_of?(Project.find(1)) - end - - def test_xhr_destroy - assert_difference 'Member.count', -1 do - xhr :delete, :destroy, :id => 2 - assert_response :success - assert_template 'destroy' - assert_equal 'text/javascript', response.content_type - end - assert_nil Member.find_by_id(2) - assert_include 'tab-content-members', response.body - end - - def test_autocomplete - get :autocomplete, :project_id => 1, :q => 'mis', :format => 'js' - assert_response :success - assert_include 'User Misc', response.body - end -end diff --git a/test/functional/memos_controller_test.rb b/test/functional/memos_controller_test.rb deleted file mode 100644 index 76c0e3748..000000000 --- a/test/functional/memos_controller_test.rb +++ /dev/null @@ -1,11 +0,0 @@ -require 'test_helper' - -class MemosControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end - def test_memo_create_fail - memo = Memo.create(:subject => nil) - assert true - end -end diff --git a/test/functional/messages_controller_test.rb b/test/functional/messages_controller_test.rb deleted file mode 100644 index 8091610cd..000000000 --- a/test/functional/messages_controller_test.rb +++ /dev/null @@ -1,217 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class MessagesControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :boards, :messages, :enabled_modules - - def setup - User.current = nil - end - - def test_show - get :show, :board_id => 1, :id => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:board) - assert_not_nil assigns(:project) - assert_not_nil assigns(:topic) - end - - def test_show_should_contain_reply_field_tags_for_quoting - @request.session[:user_id] = 2 - get :show, :board_id => 1, :id => 1 - assert_response :success - - # tags required by MessagesController#quote - assert_tag 'input', :attributes => {:id => 'message_subject'} - assert_tag 'textarea', :attributes => {:id => 'message_content'} - assert_tag 'div', :attributes => {:id => 'reply'} - end - - def test_show_with_pagination - message = Message.find(1) - assert_difference 'Message.count', 30 do - 30.times do - message.children << Message.new(:subject => 'Reply', :content => 'Reply body', :author_id => 2, :board_id => 1) - end - end - get :show, :board_id => 1, :id => 1, :r => message.children.last(:order => 'id').id - assert_response :success - assert_template 'show' - replies = assigns(:replies) - assert_not_nil replies - assert !replies.include?(message.children.first(:order => 'id')) - assert replies.include?(message.children.last(:order => 'id')) - end - - def test_show_with_reply_permission - @request.session[:user_id] = 2 - get :show, :board_id => 1, :id => 1 - assert_response :success - assert_template 'show' - assert_tag :div, :attributes => { :id => 'reply' }, - :descendant => { :tag => 'textarea', :attributes => { :id => 'message_content' } } - end - - def test_show_message_not_found - get :show, :board_id => 1, :id => 99999 - assert_response 404 - end - - def test_show_message_from_invalid_board_should_respond_with_404 - get :show, :board_id => 999, :id => 1 - assert_response 404 - end - - def test_get_new - @request.session[:user_id] = 2 - get :new, :board_id => 1 - assert_response :success - assert_template 'new' - end - - def test_get_new_with_invalid_board - @request.session[:user_id] = 2 - get :new, :board_id => 99 - assert_response 404 - end - - def test_post_new - @request.session[:user_id] = 2 - ActionMailer::Base.deliveries.clear - - with_settings :notified_events => %w(message_posted) do - post :new, :board_id => 1, - :message => { :subject => 'Test created message', - :content => 'Message body'} - end - message = Message.find_by_subject('Test created message') - assert_not_nil message - assert_redirected_to "/boards/1/topics/#{message.to_param}" - assert_equal 'Message body', message.content - assert_equal 2, message.author_id - assert_equal 1, message.board_id - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_equal "[#{message.board.project.name} - #{message.board.name} - msg#{message.root.id}] Test created message", mail.subject - assert_mail_body_match 'Message body', mail - # author - assert mail.bcc.include?('jsmith@somenet.foo') - # project member - assert mail.bcc.include?('dlopper@somenet.foo') - end - - def test_get_edit - @request.session[:user_id] = 2 - get :edit, :board_id => 1, :id => 1 - assert_response :success - assert_template 'edit' - end - - def test_post_edit - @request.session[:user_id] = 2 - post :edit, :board_id => 1, :id => 1, - :message => { :subject => 'New subject', - :content => 'New body'} - assert_redirected_to '/boards/1/topics/1' - message = Message.find(1) - assert_equal 'New subject', message.subject - assert_equal 'New body', message.content - end - - def test_post_edit_sticky_and_locked - @request.session[:user_id] = 2 - post :edit, :board_id => 1, :id => 1, - :message => { :subject => 'New subject', - :content => 'New body', - :locked => '1', - :sticky => '1'} - assert_redirected_to '/boards/1/topics/1' - message = Message.find(1) - assert_equal true, message.sticky? - assert_equal true, message.locked? - end - - def test_post_edit_should_allow_to_change_board - @request.session[:user_id] = 2 - post :edit, :board_id => 1, :id => 1, - :message => { :subject => 'New subject', - :content => 'New body', - :board_id => 2} - assert_redirected_to '/boards/2/topics/1' - message = Message.find(1) - assert_equal Board.find(2), message.board - end - - def test_reply - @request.session[:user_id] = 2 - post :reply, :board_id => 1, :id => 1, :reply => { :content => 'This is a test reply', :subject => 'Test reply' } - reply = Message.order('id DESC').first - assert_redirected_to "/boards/1/topics/1?r=#{reply.id}" - assert Message.find_by_subject('Test reply') - end - - def test_destroy_topic - @request.session[:user_id] = 2 - assert_difference 'Message.count', -3 do - post :destroy, :board_id => 1, :id => 1 - end - assert_redirected_to '/projects/ecookbook/boards/1' - assert_nil Message.find_by_id(1) - end - - def test_destroy_reply - @request.session[:user_id] = 2 - assert_difference 'Message.count', -1 do - post :destroy, :board_id => 1, :id => 2 - end - assert_redirected_to '/boards/1/topics/1?r=2' - assert_nil Message.find_by_id(2) - end - - def test_quote - @request.session[:user_id] = 2 - xhr :get, :quote, :board_id => 1, :id => 3 - assert_response :success - assert_equal 'text/javascript', response.content_type - assert_template 'quote' - assert_include 'RE: First post', response.body - assert_include '> An other reply', response.body - end - - def test_preview_new - @request.session[:user_id] = 2 - post :preview, - :board_id => 1, - :message => {:subject => "", :content => "Previewed text"} - assert_response :success - assert_template 'common/_preview' - end - - def test_preview_edit - @request.session[:user_id] = 2 - post :preview, - :id => 4, - :board_id => 1, - :message => {:subject => "", :content => "Previewed text"} - assert_response :success - assert_template 'common/_preview' - end -end diff --git a/test/functional/my_controller_test.rb b/test/functional/my_controller_test.rb deleted file mode 100644 index c15cbcc06..000000000 --- a/test/functional/my_controller_test.rb +++ /dev/null @@ -1,248 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class MyControllerTest < ActionController::TestCase - fixtures :users, :user_preferences, :roles, :projects, :members, :member_roles, - :issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources - - def setup - @request.session[:user_id] = 2 - end - - def test_index - get :index - assert_response :success - assert_template 'page' - end - - def test_page - get :page - assert_response :success - assert_template 'page' - end - - def test_page_with_timelog_block - preferences = User.find(2).pref - preferences[:my_page_layout] = {'top' => ['timelog']} - preferences.save! - TimeEntry.create!(:user => User.find(2), :spent_on => Date.yesterday, :issue_id => 1, :hours => 2.5, :activity_id => 10) - - get :page - assert_response :success - assert_select 'tr.time-entry' do - assert_select 'td.subject a[href=/issues/1]' - assert_select 'td.hours', :text => '2.50' - end - end - - def test_page_with_all_blocks - blocks = MyController::BLOCKS.keys - preferences = User.find(2).pref - preferences[:my_page_layout] = {'top' => blocks} - preferences.save! - - get :page - assert_response :success - assert_select 'div.mypage-box', blocks.size - end - - def test_my_account_should_show_editable_custom_fields - get :account - assert_response :success - assert_template 'account' - assert_equal User.find(2), assigns(:user) - - assert_tag :input, :attributes => { :name => 'user[custom_field_values][4]'} - end - - def test_my_account_should_not_show_non_editable_custom_fields - UserCustomField.find(4).update_attribute :editable, false - - get :account - assert_response :success - assert_template 'account' - assert_equal User.find(2), assigns(:user) - - assert_no_tag :input, :attributes => { :name => 'user[custom_field_values][4]'} - end - - def test_update_account - post :account, - :user => { - :firstname => "Joe", - :login => "root", - :admin => 1, - :group_ids => ['10'], - :custom_field_values => {"4" => "0100562500"} - } - - assert_redirected_to '/my/account' - user = User.find(2) - assert_equal user, assigns(:user) - assert_equal "Joe", user.firstname - assert_equal "jsmith", user.login - assert_equal "0100562500", user.custom_value_for(4).value - # ignored - assert !user.admin? - assert user.groups.empty? - end - - def test_my_account_should_show_destroy_link - get :account - assert_select 'a[href=/my/account/destroy]' - end - - def test_get_destroy_should_display_the_destroy_confirmation - get :destroy - assert_response :success - assert_template 'destroy' - assert_select 'form[action=/my/account/destroy]' do - assert_select 'input[name=confirm]' - end - end - - def test_post_destroy_without_confirmation_should_not_destroy_account - assert_no_difference 'User.count' do - post :destroy - end - assert_response :success - assert_template 'destroy' - end - - def test_post_destroy_without_confirmation_should_destroy_account - assert_difference 'User.count', -1 do - post :destroy, :confirm => '1' - end - assert_redirected_to '/' - assert_match /deleted/i, flash[:notice] - end - - def test_post_destroy_with_unsubscribe_not_allowed_should_not_destroy_account - User.any_instance.stubs(:own_account_deletable?).returns(false) - - assert_no_difference 'User.count' do - post :destroy, :confirm => '1' - end - assert_redirected_to '/my/account' - end - - def test_change_password - get :password - assert_response :success - assert_template 'password' - - # non matching password confirmation - post :password, :password => 'jsmith', - :new_password => 'secret123', - :new_password_confirmation => 'secret1234' - assert_response :success - assert_template 'password' - assert_error_tag :content => /Password doesn't match confirmation/ - - # wrong password - post :password, :password => 'wrongpassword', - :new_password => 'secret123', - :new_password_confirmation => 'secret123' - assert_response :success - assert_template 'password' - assert_equal 'Wrong password', flash[:error] - - # good password - post :password, :password => 'jsmith', - :new_password => 'secret123', - :new_password_confirmation => 'secret123' - assert_redirected_to '/my/account' - assert User.try_to_login('jsmith', 'secret123') - end - - def test_change_password_should_redirect_if_user_cannot_change_its_password - User.find(2).update_attribute(:auth_source_id, 1) - - get :password - assert_not_nil flash[:error] - assert_redirected_to '/my/account' - end - - def test_page_layout - get :page_layout - assert_response :success - assert_template 'page_layout' - end - - def test_add_block - post :add_block, :block => 'issuesreportedbyme' - assert_redirected_to '/my/page_layout' - assert User.find(2).pref[:my_page_layout]['top'].include?('issuesreportedbyme') - end - - def test_add_invalid_block_should_redirect - post :add_block, :block => 'invalid' - assert_redirected_to '/my/page_layout' - end - - def test_remove_block - post :remove_block, :block => 'issuesassignedtome' - assert_redirected_to '/my/page_layout' - assert !User.find(2).pref[:my_page_layout].values.flatten.include?('issuesassignedtome') - end - - def test_order_blocks - xhr :post, :order_blocks, :group => 'left', 'blocks' => ['documents', 'calendar', 'latestnews'] - assert_response :success - assert_equal ['documents', 'calendar', 'latestnews'], User.find(2).pref[:my_page_layout]['left'] - end - - def test_reset_rss_key_with_existing_key - @previous_token_value = User.find(2).rss_key # Will generate one if it's missing - post :reset_rss_key - - assert_not_equal @previous_token_value, User.find(2).rss_key - assert User.find(2).rss_token - assert_match /reset/, flash[:notice] - assert_redirected_to '/my/account' - end - - def test_reset_rss_key_without_existing_key - assert_nil User.find(2).rss_token - post :reset_rss_key - - assert User.find(2).rss_token - assert_match /reset/, flash[:notice] - assert_redirected_to '/my/account' - end - - def test_reset_api_key_with_existing_key - @previous_token_value = User.find(2).api_key # Will generate one if it's missing - post :reset_api_key - - assert_not_equal @previous_token_value, User.find(2).api_key - assert User.find(2).api_token - assert_match /reset/, flash[:notice] - assert_redirected_to '/my/account' - end - - def test_reset_api_key_without_existing_key - assert_nil User.find(2).api_token - post :reset_api_key - - assert User.find(2).api_token - assert_match /reset/, flash[:notice] - assert_redirected_to '/my/account' - end -end diff --git a/test/functional/news_controller_test.rb b/test/functional/news_controller_test.rb deleted file mode 100644 index ed7a9c100..000000000 --- a/test/functional/news_controller_test.rb +++ /dev/null @@ -1,165 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class NewsControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :news, :comments - - def setup - User.current = nil - end - - def test_index - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:newss) - assert_nil assigns(:project) - end - - def test_index_with_project - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:newss) - end - - def test_index_with_invalid_project_should_respond_with_404 - get :index, :project_id => 999 - assert_response 404 - end - - def test_show - get :show, :id => 1 - assert_response :success - assert_template 'show' - assert_tag :tag => 'h2', :content => /eCookbook first release/ - end - - def test_show_should_show_attachments - attachment = Attachment.first - attachment.container = News.find(1) - attachment.save! - - get :show, :id => 1 - assert_response :success - assert_tag 'a', :content => attachment.filename - end - - def test_show_not_found - get :show, :id => 999 - assert_response 404 - end - - def test_get_new - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - end - - def test_post_create - ActionMailer::Base.deliveries.clear - @request.session[:user_id] = 2 - - with_settings :notified_events => %w(news_added) do - post :create, :project_id => 1, :news => { :title => 'NewsControllerTest', - :description => 'This is the description', - :summary => '' } - end - assert_redirected_to '/projects/ecookbook/news' - - news = News.find_by_title('NewsControllerTest') - assert_not_nil news - assert_equal 'This is the description', news.description - assert_equal User.find(2), news.author - assert_equal Project.find(1), news.project - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_post_create_with_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - assert_difference 'News.count' do - assert_difference 'Attachment.count' do - post :create, :project_id => 1, - :news => { :title => 'Test', :description => 'This is the description' }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - end - end - attachment = Attachment.first(:order => 'id DESC') - news = News.first(:order => 'id DESC') - assert_equal news, attachment.container - end - - def test_post_create_with_validation_failure - @request.session[:user_id] = 2 - post :create, :project_id => 1, :news => { :title => '', - :description => 'This is the description', - :summary => '' } - assert_response :success - assert_template 'new' - assert_not_nil assigns(:news) - assert assigns(:news).new_record? - assert_error_tag :content => /title can't be blank/i - end - - def test_get_edit - @request.session[:user_id] = 2 - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - end - - def test_put_update - @request.session[:user_id] = 2 - put :update, :id => 1, :news => { :description => 'Description changed by test_post_edit' } - assert_redirected_to '/news/1' - news = News.find(1) - assert_equal 'Description changed by test_post_edit', news.description - end - - def test_put_update_with_attachment - set_tmp_attachments_directory - @request.session[:user_id] = 2 - assert_no_difference 'News.count' do - assert_difference 'Attachment.count' do - put :update, :id => 1, - :news => { :description => 'This is the description' }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - end - end - attachment = Attachment.first(:order => 'id DESC') - assert_equal News.find(1), attachment.container - end - - def test_update_with_failure - @request.session[:user_id] = 2 - put :update, :id => 1, :news => { :description => '' } - assert_response :success - assert_template 'edit' - assert_error_tag :content => /description can't be blank/i - end - - def test_destroy - @request.session[:user_id] = 2 - delete :destroy, :id => 1 - assert_redirected_to '/projects/ecookbook/news' - assert_nil News.find_by_id(1) - end -end diff --git a/test/functional/no_uses_controller_test.rb b/test/functional/no_uses_controller_test.rb deleted file mode 100644 index 255b03dc4..000000000 --- a/test/functional/no_uses_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class NoUsesControllerTest < ActionController::TestCase - setup do - @no_use = no_uses(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:no_uses) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create no_use" do - assert_difference('NoUse.count') do - post :create, no_use: { } - end - - assert_redirected_to no_use_path(assigns(:no_use)) - end - - test "should show no_use" do - get :show, id: @no_use - assert_response :success - end - - test "should get edit" do - get :edit, id: @no_use - assert_response :success - end - - test "should update no_use" do - put :update, id: @no_use, no_use: { } - assert_redirected_to no_use_path(assigns(:no_use)) - end - - test "should destroy no_use" do - assert_difference('NoUse.count', -1) do - delete :destroy, id: @no_use - end - - assert_redirected_to no_uses_path - end -end diff --git a/test/functional/notificationcomments_controller_test.rb b/test/functional/notificationcomments_controller_test.rb deleted file mode 100644 index 21496467e..000000000 --- a/test/functional/notificationcomments_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class NotificationcommentsControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/open_source_projects_controller_test.rb b/test/functional/open_source_projects_controller_test.rb deleted file mode 100644 index 9b33a8b1f..000000000 --- a/test/functional/open_source_projects_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class OpenSourceProjectsControllerTest < ActionController::TestCase - setup do - @open_source_project = open_source_projects(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:open_source_projects) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create open_source_project" do - assert_difference('OpenSourceProject.count') do - post :create, open_source_project: { String: @open_source_project.String } - end - - assert_redirected_to open_source_project_path(assigns(:open_source_project)) - end - - test "should show open_source_project" do - get :show, id: @open_source_project - assert_response :success - end - - test "should get edit" do - get :edit, id: @open_source_project - assert_response :success - end - - test "should update open_source_project" do - put :update, id: @open_source_project, open_source_project: { String: @open_source_project.String } - assert_redirected_to open_source_project_path(assigns(:open_source_project)) - end - - test "should destroy open_source_project" do - assert_difference('OpenSourceProject.count', -1) do - delete :destroy, id: @open_source_project - end - - assert_redirected_to open_source_projects_path - end -end diff --git a/test/functional/previews_controller_test.rb b/test/functional/previews_controller_test.rb deleted file mode 100644 index 80d7f2f82..000000000 --- a/test/functional/previews_controller_test.rb +++ /dev/null @@ -1,81 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class PreviewsControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :journals, :journal_details, - :news - - def test_preview_new_issue - @request.session[:user_id] = 2 - post :issue, :project_id => '1', :issue => {:description => 'Foo'} - assert_response :success - assert_template 'preview' - assert_not_nil assigns(:description) - end - - def test_preview_issue_notes - @request.session[:user_id] = 2 - post :issue, :project_id => '1', :id => 1, - :issue => {:description => Issue.find(1).description, :notes => 'Foo'} - assert_response :success - assert_template 'preview' - assert_not_nil assigns(:notes) - end - - def test_preview_journal_notes_for_update - @request.session[:user_id] = 2 - post :issue, :project_id => '1', :id => 1, :notes => 'Foo' - assert_response :success - assert_template 'preview' - assert_not_nil assigns(:notes) - assert_tag :p, :content => 'Foo' - end - - def test_preview_new_news - get :news, :project_id => 1, - :news => {:title => '', - :description => 'News description', - :summary => ''} - assert_response :success - assert_template 'common/_preview' - assert_tag :tag => 'fieldset', :attributes => { :class => 'preview' }, - :content => /News description/ - end - - def test_existing_new_news - get :news, :project_id => 1, :id => 2, - :news => {:title => '', - :description => 'News description', - :summary => ''} - assert_response :success - assert_template 'common/_preview' - assert_equal News.find(2), assigns(:previewed) - assert_not_nil assigns(:attachments) - - assert_tag :tag => 'fieldset', :attributes => { :class => 'preview' }, - :content => /News description/ - end -end diff --git a/test/functional/project_enumerations_controller_test.rb b/test/functional/project_enumerations_controller_test.rb deleted file mode 100644 index e00abd47a..000000000 --- a/test/functional/project_enumerations_controller_test.rb +++ /dev/null @@ -1,217 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ProjectEnumerationsControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :custom_fields, :custom_fields_projects, - :custom_fields_trackers, :custom_values, - :time_entries - - self.use_transactional_fixtures = false - - def setup - @request.session[:user_id] = nil - Setting.default_language = 'en' - end - - def test_update_to_override_system_activities - @request.session[:user_id] = 2 # manager - billable_field = TimeEntryActivityCustomField.find_by_name("Billable") - - put :update, :project_id => 1, :enumerations => { - "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design, De-activate - "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"}, # Development, Change custom value - "14"=>{"parent_id"=>"14", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"}, # Inactive Activity, Activate with custom value - "11"=>{"parent_id"=>"11", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"} # QA, no changes - } - - assert_response :redirect - assert_redirected_to '/projects/ecookbook/settings/activities' - - # Created project specific activities... - project = Project.find('ecookbook') - - # ... Design - design = project.time_entry_activities.find_by_name("Design") - assert design, "Project activity not found" - - assert_equal 9, design.parent_id # Relate to the system activity - assert_not_equal design.parent.id, design.id # Different records - assert_equal design.parent.name, design.name # Same name - assert !design.active? - - # ... Development - development = project.time_entry_activities.find_by_name("Development") - assert development, "Project activity not found" - - assert_equal 10, development.parent_id # Relate to the system activity - assert_not_equal development.parent.id, development.id # Different records - assert_equal development.parent.name, development.name # Same name - assert development.active? - assert_equal "0", development.custom_value_for(billable_field).value - - # ... Inactive Activity - previously_inactive = project.time_entry_activities.find_by_name("Inactive Activity") - assert previously_inactive, "Project activity not found" - - assert_equal 14, previously_inactive.parent_id # Relate to the system activity - assert_not_equal previously_inactive.parent.id, previously_inactive.id # Different records - assert_equal previously_inactive.parent.name, previously_inactive.name # Same name - assert previously_inactive.active? - assert_equal "1", previously_inactive.custom_value_for(billable_field).value - - # ... QA - assert_equal nil, project.time_entry_activities.find_by_name("QA"), "Custom QA activity created when it wasn't modified" - end - - def test_update_will_update_project_specific_activities - @request.session[:user_id] = 2 # manager - - project_activity = TimeEntryActivity.new({ - :name => 'Project Specific', - :parent => TimeEntryActivity.first, - :project => Project.find(1), - :active => true - }) - assert project_activity.save - project_activity_two = TimeEntryActivity.new({ - :name => 'Project Specific Two', - :parent => TimeEntryActivity.last, - :project => Project.find(1), - :active => true - }) - assert project_activity_two.save - - - put :update, :project_id => 1, :enumerations => { - project_activity.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # De-activate - project_activity_two.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"} # De-activate - } - - assert_response :redirect - assert_redirected_to '/projects/ecookbook/settings/activities' - - # Created project specific activities... - project = Project.find('ecookbook') - assert_equal 2, project.time_entry_activities.count - - activity_one = project.time_entry_activities.find_by_name(project_activity.name) - assert activity_one, "Project activity not found" - assert_equal project_activity.id, activity_one.id - assert !activity_one.active? - - activity_two = project.time_entry_activities.find_by_name(project_activity_two.name) - assert activity_two, "Project activity not found" - assert_equal project_activity_two.id, activity_two.id - assert !activity_two.active? - end - - def test_update_when_creating_new_activities_will_convert_existing_data - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size - - @request.session[:user_id] = 2 # manager - put :update, :project_id => 1, :enumerations => { - "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"} # Design, De-activate - } - assert_response :redirect - - # No more TimeEntries using the system activity - assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries still assigned to system activities" - # All TimeEntries using project activity - project_specific_activity = TimeEntryActivity.find_by_parent_id_and_project_id(9, 1) - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_specific_activity.id, 1).size, "No Time Entries assigned to the project activity" - end - - def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised - # TODO: Need to cause an exception on create but these tests - # aren't setup for mocking. Just create a record now so the - # second one is a dupicate - parent = TimeEntryActivity.find(9) - TimeEntryActivity.create!({:name => parent.name, :project_id => 1, :position => parent.position, :active => true}) - TimeEntry.create!({:project_id => 1, :hours => 1.0, :user => User.find(1), :issue_id => 3, :activity_id => 10, :spent_on => '2009-01-01'}) - - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size - assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size - - @request.session[:user_id] = 2 # manager - put :update, :project_id => 1, :enumerations => { - "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design - "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"} # Development, Change custom value - } - assert_response :redirect - - # TimeEntries shouldn't have been reassigned on the failed record - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries are not assigned to system activities" - # TimeEntries shouldn't have been reassigned on the saved record either - assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size, "Time Entries are not assigned to system activities" - end - - def test_destroy - @request.session[:user_id] = 2 # manager - project_activity = TimeEntryActivity.new({ - :name => 'Project Specific', - :parent => TimeEntryActivity.first, - :project => Project.find(1), - :active => true - }) - assert project_activity.save - project_activity_two = TimeEntryActivity.new({ - :name => 'Project Specific Two', - :parent => TimeEntryActivity.last, - :project => Project.find(1), - :active => true - }) - assert project_activity_two.save - - delete :destroy, :project_id => 1 - assert_response :redirect - assert_redirected_to '/projects/ecookbook/settings/activities' - - assert_nil TimeEntryActivity.find_by_id(project_activity.id) - assert_nil TimeEntryActivity.find_by_id(project_activity_two.id) - end - - def test_destroy_should_reassign_time_entries_back_to_the_system_activity - @request.session[:user_id] = 2 # manager - project_activity = TimeEntryActivity.new({ - :name => 'Project Specific Design', - :parent => TimeEntryActivity.find(9), - :project => Project.find(1), - :active => true - }) - assert project_activity.save - assert TimeEntry.update_all("activity_id = '#{project_activity.id}'", ["project_id = ? AND activity_id = ?", 1, 9]) - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size - - delete :destroy, :project_id => 1 - assert_response :redirect - assert_redirected_to '/projects/ecookbook/settings/activities' - - assert_nil TimeEntryActivity.find_by_id(project_activity.id) - assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size, "TimeEntries still assigned to project specific activity" - assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "TimeEntries still assigned to project specific activity" - end - -end diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb deleted file mode 100644 index 848b3fa2d..000000000 --- a/test/functional/projects_controller_test.rb +++ /dev/null @@ -1,592 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ProjectsControllerTest < ActionController::TestCase - fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details, - :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages, - :attachments, :custom_fields, :custom_values, :time_entries - - def setup - @request.session[:user_id] = nil - Setting.default_language = 'en' - end - - def test_index_by_anonymous_should_not_show_private_projects - get :index - assert_response :success - assert_template 'index' - projects = assigns(:projects) - assert_not_nil projects - assert projects.all?(&:is_public?) - - assert_select 'ul' do - assert_select 'li' do - assert_select 'a', :text => 'eCookbook' - assert_select 'ul' do - assert_select 'a', :text => 'Child of private child' - end - end - end - assert_select 'a', :text => /Private child of eCookbook/, :count => 0 - end - - def test_index_atom - get :index, :format => 'atom' - assert_response :success - assert_template 'common/feed' - assert_select 'feed>title', :text => 'Redmine: Latest projects' - assert_select 'feed>entry', :count => Project.count(:conditions => Project.visible_condition(User.current)) - end - - test "#index by non-admin user with view_time_entries permission should show overall spent time link" do - @request.session[:user_id] = 3 - get :index - assert_template 'index' - assert_select 'a[href=?]', '/time_entries' - end - - test "#index by non-admin user without view_time_entries permission should not show overall spent time link" do - Role.find(2).remove_permission! :view_time_entries - Role.non_member.remove_permission! :view_time_entries - Role.anonymous.remove_permission! :view_time_entries - @request.session[:user_id] = 3 - - get :index - assert_template 'index' - assert_select 'a[href=?]', '/time_entries', 0 - end - - test "#new by admin user should accept get" do - @request.session[:user_id] = 1 - - get :new - assert_response :success - assert_template 'new' - end - - test "#new by non-admin user with add_project permission should accept get" do - Role.non_member.add_permission! :add_project - @request.session[:user_id] = 9 - - get :new - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'project[parent_id]', 0 - end - - test "#new by non-admin user with add_subprojects permission should accept get" do - Role.find(1).remove_permission! :add_project - Role.find(1).add_permission! :add_subprojects - @request.session[:user_id] = 2 - - get :new, :parent_id => 'ecookbook' - assert_response :success - assert_template 'new' - - assert_select 'select[name=?]', 'project[parent_id]' do - # parent project selected - assert_select 'option[value=1][selected=selected]' - # no empty value - assert_select 'option[value=]', 0 - end - end - - test "#create by admin user should create a new project" do - @request.session[:user_id] = 1 - - post :create, - :project => { - :name => "blog", - :description => "weblog", - :homepage => 'http://weblog', - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :tracker_ids => ['1', '3'], - # an issue custom field that is not for all project - :issue_custom_field_ids => ['9'], - :enabled_module_names => ['issue_tracking', 'news', 'repository'] - } - assert_redirected_to '/projects/blog/settings' - - project = Project.find_by_name('blog') - assert_kind_of Project, project - assert project.active? - assert_equal 'weblog', project.description - assert_equal 'http://weblog', project.homepage - assert_equal true, project.is_public? - assert_nil project.parent - assert_equal 'Beta', project.custom_value_for(3).value - assert_equal [1, 3], project.trackers.map(&:id).sort - assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort - assert project.issue_custom_fields.include?(IssueCustomField.find(9)) - end - - test "#create by admin user should create a new subproject" do - @request.session[:user_id] = 1 - - assert_difference 'Project.count' do - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :parent_id => 1 - } - assert_redirected_to '/projects/blog/settings' - end - - project = Project.find_by_name('blog') - assert_kind_of Project, project - assert_equal Project.find(1), project.parent - end - - test "#create by admin user should continue" do - @request.session[:user_id] = 1 - - assert_difference 'Project.count' do - post :create, :project => {:name => "blog", :identifier => "blog"}, :continue => 'Create and continue' - end - assert_redirected_to '/projects/new' - end - - test "#create by non-admin user with add_project permission should create a new project" do - Role.non_member.add_permission! :add_project - @request.session[:user_id] = 9 - - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :tracker_ids => ['1', '3'], - :enabled_module_names => ['issue_tracking', 'news', 'repository'] - } - - assert_redirected_to '/projects/blog/settings' - - project = Project.find_by_name('blog') - assert_kind_of Project, project - assert_equal 'weblog', project.description - assert_equal true, project.is_public? - assert_equal [1, 3], project.trackers.map(&:id).sort - assert_equal ['issue_tracking', 'news', 'repository'], project.enabled_module_names.sort - - # User should be added as a project member - assert User.find(9).member_of?(project) - assert_equal 1, project.members.size - end - - test "#create by non-admin user with add_project permission should fail with parent_id" do - Role.non_member.add_permission! :add_project - @request.session[:user_id] = 9 - - assert_no_difference 'Project.count' do - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :parent_id => 1 - } - end - assert_response :success - project = assigns(:project) - assert_kind_of Project, project - assert_not_nil project.errors[:parent_id] - end - - test "#create by non-admin user with add_subprojects permission should create a project with a parent_id" do - Role.find(1).remove_permission! :add_project - Role.find(1).add_permission! :add_subprojects - @request.session[:user_id] = 2 - - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :parent_id => 1 - } - assert_redirected_to '/projects/blog/settings' - project = Project.find_by_name('blog') - end - - test "#create by non-admin user with add_subprojects permission should fail without parent_id" do - Role.find(1).remove_permission! :add_project - Role.find(1).add_permission! :add_subprojects - @request.session[:user_id] = 2 - - assert_no_difference 'Project.count' do - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' } - } - end - assert_response :success - project = assigns(:project) - assert_kind_of Project, project - assert_not_nil project.errors[:parent_id] - end - - test "#create by non-admin user with add_subprojects permission should fail with unauthorized parent_id" do - Role.find(1).remove_permission! :add_project - Role.find(1).add_permission! :add_subprojects - @request.session[:user_id] = 2 - - assert !User.find(2).member_of?(Project.find(6)) - assert_no_difference 'Project.count' do - post :create, :project => { :name => "blog", - :description => "weblog", - :identifier => "blog", - :is_public => 1, - :custom_field_values => { '3' => 'Beta' }, - :parent_id => 6 - } - end - assert_response :success - project = assigns(:project) - assert_kind_of Project, project - assert_not_nil project.errors[:parent_id] - end - - def test_create_subproject_with_inherit_members_should_inherit_members - Role.find_by_name('Manager').add_permission! :add_subprojects - parent = Project.find(1) - @request.session[:user_id] = 2 - - assert_difference 'Project.count' do - post :create, :project => { - :name => 'inherited', :identifier => 'inherited', :parent_id => parent.id, :inherit_members => '1' - } - assert_response 302 - end - - project = Project.order('id desc').first - assert_equal 'inherited', project.name - assert_equal parent, project.parent - assert project.memberships.count > 0 - assert_equal parent.memberships.count, project.memberships.count - end - - def test_create_should_preserve_modules_on_validation_failure - with_settings :default_projects_modules => ['issue_tracking', 'repository'] do - @request.session[:user_id] = 1 - assert_no_difference 'Project.count' do - post :create, :project => { - :name => "blog", - :identifier => "", - :enabled_module_names => %w(issue_tracking news) - } - end - assert_response :success - project = assigns(:project) - assert_equal %w(issue_tracking news), project.enabled_module_names.sort - end - end - - def test_show_by_id - get :show, :id => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:project) - end - - def test_show_by_identifier - get :show, :id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_not_nil assigns(:project) - assert_equal Project.find_by_identifier('ecookbook'), assigns(:project) - - assert_select 'li', :text => /Development status/ - end - - def test_show_should_not_display_hidden_custom_fields - ProjectCustomField.find_by_name('Development status').update_attribute :visible, false - get :show, :id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_not_nil assigns(:project) - - assert_select 'li', :text => /Development status/, :count => 0 - end - - def test_show_should_not_fail_when_custom_values_are_nil - project = Project.find_by_identifier('ecookbook') - project.custom_values.first.update_attribute(:value, nil) - get :show, :id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_not_nil assigns(:project) - assert_equal Project.find_by_identifier('ecookbook'), assigns(:project) - end - - def show_archived_project_should_be_denied - project = Project.find_by_identifier('ecookbook') - project.archive! - - get :show, :id => 'ecookbook' - assert_response 403 - assert_nil assigns(:project) - assert_select 'p', :text => /archived/ - end - - def test_show_should_not_show_private_subprojects_that_are_not_visible - get :show, :id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_select 'a', :text => /Private child/, :count => 0 - end - - def test_show_should_show_private_subprojects_that_are_visible - @request.session[:user_id] = 2 # manager who is a member of the private subproject - get :show, :id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_select 'a', :text => /Private child/ - end - - def test_settings - @request.session[:user_id] = 2 # manager - get :settings, :id => 1 - assert_response :success - assert_template 'settings' - end - - def test_settings_of_subproject - @request.session[:user_id] = 2 - get :settings, :id => 'private-child' - assert_response :success - assert_template 'settings' - - assert_select 'input[type=checkbox][name=?]', 'project[inherit_members]' - end - - def test_settings_should_be_denied_for_member_on_closed_project - Project.find(1).close - @request.session[:user_id] = 2 # manager - - get :settings, :id => 1 - assert_response 403 - end - - def test_settings_should_be_denied_for_anonymous_on_closed_project - Project.find(1).close - - get :settings, :id => 1 - assert_response 302 - end - - def test_update - @request.session[:user_id] = 2 # manager - post :update, :id => 1, :project => {:name => 'Test changed name', - :issue_custom_field_ids => ['']} - assert_redirected_to '/projects/ecookbook/settings' - project = Project.find(1) - assert_equal 'Test changed name', project.name - end - - def test_update_with_failure - @request.session[:user_id] = 2 # manager - post :update, :id => 1, :project => {:name => ''} - assert_response :success - assert_template 'settings' - assert_error_tag :content => /name can't be blank/i - end - - def test_update_should_be_denied_for_member_on_closed_project - Project.find(1).close - @request.session[:user_id] = 2 # manager - - post :update, :id => 1, :project => {:name => 'Closed'} - assert_response 403 - assert_equal 'eCookbook', Project.find(1).name - end - - def test_update_should_be_denied_for_anonymous_on_closed_project - Project.find(1).close - - post :update, :id => 1, :project => {:name => 'Closed'} - assert_response 302 - assert_equal 'eCookbook', Project.find(1).name - end - - def test_modules - @request.session[:user_id] = 2 - Project.find(1).enabled_module_names = ['issue_tracking', 'news'] - - post :modules, :id => 1, :enabled_module_names => ['issue_tracking', 'repository', 'documents'] - assert_redirected_to '/projects/ecookbook/settings/modules' - assert_equal ['documents', 'issue_tracking', 'repository'], Project.find(1).enabled_module_names.sort - end - - def test_destroy_leaf_project_without_confirmation_should_show_confirmation - @request.session[:user_id] = 1 # admin - - assert_no_difference 'Project.count' do - delete :destroy, :id => 2 - assert_response :success - assert_template 'destroy' - end - end - - def test_destroy_without_confirmation_should_show_confirmation_with_subprojects - @request.session[:user_id] = 1 # admin - - assert_no_difference 'Project.count' do - delete :destroy, :id => 1 - assert_response :success - assert_template 'destroy' - end - assert_select 'strong', - :text => ['Private child of eCookbook', - 'Child of private child, eCookbook Subproject 1', - 'eCookbook Subproject 2'].join(', ') - end - - def test_destroy_with_confirmation_should_destroy_the_project_and_subprojects - @request.session[:user_id] = 1 # admin - - assert_difference 'Project.count', -5 do - delete :destroy, :id => 1, :confirm => 1 - assert_redirected_to '/admin/projects' - end - assert_nil Project.find_by_id(1) - end - - def test_archive - @request.session[:user_id] = 1 # admin - post :archive, :id => 1 - assert_redirected_to '/admin/projects' - assert !Project.find(1).active? - end - - def test_archive_with_failure - @request.session[:user_id] = 1 - Project.any_instance.stubs(:archive).returns(false) - post :archive, :id => 1 - assert_redirected_to '/admin/projects' - assert_match /project cannot be archived/i, flash[:error] - end - - def test_unarchive - @request.session[:user_id] = 1 # admin - Project.find(1).archive - post :unarchive, :id => 1 - assert_redirected_to '/admin/projects' - assert Project.find(1).active? - end - - def test_close - @request.session[:user_id] = 2 - post :close, :id => 1 - assert_redirected_to '/projects/ecookbook' - assert_equal Project::STATUS_CLOSED, Project.find(1).status - end - - def test_reopen - Project.find(1).close - @request.session[:user_id] = 2 - post :reopen, :id => 1 - assert_redirected_to '/projects/ecookbook' - assert Project.find(1).active? - end - - def test_project_breadcrumbs_should_be_limited_to_3_ancestors - CustomField.delete_all - parent = nil - 6.times do |i| - p = Project.generate_with_parent!(parent) - get :show, :id => p - assert_select '#header h1' do - assert_select 'a', :count => [i, 3].min - end - - parent = p - end - end - - def test_get_copy - @request.session[:user_id] = 1 # admin - get :copy, :id => 1 - assert_response :success - assert_template 'copy' - assert assigns(:project) - assert_equal Project.find(1).description, assigns(:project).description - assert_nil assigns(:project).id - - assert_select 'input[name=?][value=?]', 'project[enabled_module_names][]', 'issue_tracking', 1 - end - - def test_get_copy_with_invalid_source_should_respond_with_404 - @request.session[:user_id] = 1 - get :copy, :id => 99 - assert_response 404 - end - - def test_post_copy_should_copy_requested_items - @request.session[:user_id] = 1 # admin - CustomField.delete_all - - assert_difference 'Project.count' do - post :copy, :id => 1, - :project => { - :name => 'Copy', - :identifier => 'unique-copy', - :tracker_ids => ['1', '2', '3', ''], - :enabled_module_names => %w(issue_tracking time_tracking) - }, - :only => %w(issues versions) - end - project = Project.find('unique-copy') - source = Project.find(1) - assert_equal %w(issue_tracking time_tracking), project.enabled_module_names.sort - - assert_equal source.versions.count, project.versions.count, "All versions were not copied" - assert_equal source.issues.count, project.issues.count, "All issues were not copied" - assert_equal 0, project.members.count - end - - def test_post_copy_should_redirect_to_settings_when_successful - @request.session[:user_id] = 1 # admin - post :copy, :id => 1, :project => {:name => 'Copy', :identifier => 'unique-copy'} - assert_response :redirect - assert_redirected_to :controller => 'projects', :action => 'settings', :id => 'unique-copy' - end - - def test_jump_should_redirect_to_active_tab - get :show, :id => 1, :jump => 'issues' - assert_redirected_to '/projects/ecookbook/issues' - end - - def test_jump_should_not_redirect_to_inactive_tab - get :show, :id => 3, :jump => 'documents' - assert_response :success - assert_template 'show' - end - - def test_jump_should_not_redirect_to_unknown_tab - get :show, :id => 3, :jump => 'foobar' - assert_response :success - assert_template 'show' - end -end diff --git a/test/functional/queries_controller_test.rb b/test/functional/queries_controller_test.rb deleted file mode 100644 index 076f0b39e..000000000 --- a/test/functional/queries_controller_test.rb +++ /dev/null @@ -1,290 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class QueriesControllerTest < ActionController::TestCase - fixtures :projects, :users, :members, :member_roles, :roles, :trackers, :issue_statuses, :issue_categories, :enumerations, :issues, :custom_fields, :custom_values, :queries, :enabled_modules - - def setup - User.current = nil - end - - def test_index - get :index - # HTML response not implemented - assert_response 406 - end - - def test_new_project_query - @request.session[:user_id] = 2 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => nil } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => nil, - :disabled => nil } - assert_select 'select[name=?]', 'c[]' do - assert_select 'option[value=tracker]' - assert_select 'option[value=subject]' - end - end - - def test_new_global_query - @request.session[:user_id] = 2 - get :new - assert_response :success - assert_template 'new' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => 'checked', - :disabled => nil } - end - - def test_new_on_invalid_project - @request.session[:user_id] = 2 - get :new, :project_id => 'invalid' - assert_response 404 - end - - def test_create_project_public_query - @request.session[:user_id] = 2 - post :create, - :project_id => 'ecookbook', - :default_columns => '1', - :f => ["status_id", "assigned_to_id"], - :op => {"assigned_to_id" => "=", "status_id" => "o"}, - :v => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_new_project_public_query", "is_public" => "1"} - - q = Query.find_by_name('test_new_project_public_query') - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q - assert q.is_public? - assert q.has_default_columns? - assert q.valid? - end - - def test_create_project_private_query - @request.session[:user_id] = 3 - post :create, - :project_id => 'ecookbook', - :default_columns => '1', - :fields => ["status_id", "assigned_to_id"], - :operators => {"assigned_to_id" => "=", "status_id" => "o"}, - :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_new_project_private_query", "is_public" => "1"} - - q = Query.find_by_name('test_new_project_private_query') - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :query_id => q - assert !q.is_public? - assert q.has_default_columns? - assert q.valid? - end - - def test_create_global_private_query_with_custom_columns - @request.session[:user_id] = 3 - post :create, - :fields => ["status_id", "assigned_to_id"], - :operators => {"assigned_to_id" => "=", "status_id" => "o"}, - :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]}, - :query => {"name" => "test_new_global_private_query", "is_public" => "1"}, - :c => ["", "tracker", "subject", "priority", "category"] - - q = Query.find_by_name('test_new_global_private_query') - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q - assert !q.is_public? - assert !q.has_default_columns? - assert_equal [:id, :tracker, :subject, :priority, :category], q.columns.collect {|c| c.name} - assert q.valid? - end - - def test_create_global_query_with_custom_filters - @request.session[:user_id] = 3 - post :create, - :fields => ["assigned_to_id"], - :operators => {"assigned_to_id" => "="}, - :values => { "assigned_to_id" => ["me"]}, - :query => {"name" => "test_new_global_query"} - - q = Query.find_by_name('test_new_global_query') - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => nil, :query_id => q - assert !q.has_filter?(:status_id) - assert_equal ['assigned_to_id'], q.filters.keys - assert q.valid? - end - - def test_create_with_sort - @request.session[:user_id] = 1 - post :create, - :default_columns => '1', - :operators => {"status_id" => "o"}, - :values => {"status_id" => ["1"]}, - :query => {:name => "test_new_with_sort", - :is_public => "1", - :sort_criteria => {"0" => ["due_date", "desc"], "1" => ["tracker", ""]}} - - query = Query.find_by_name("test_new_with_sort") - assert_not_nil query - assert_equal [['due_date', 'desc'], ['tracker', 'asc']], query.sort_criteria - end - - def test_create_with_failure - @request.session[:user_id] = 2 - assert_no_difference '::Query.count' do - post :create, :project_id => 'ecookbook', :query => {:name => ''} - end - assert_response :success - assert_template 'new' - assert_select 'input[name=?]', 'query[name]' - end - - def test_edit_global_public_query - @request.session[:user_id] = 1 - get :edit, :id => 4 - assert_response :success - assert_template 'edit' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => 'checked' } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => 'checked', - :disabled => 'disabled' } - end - - def test_edit_global_private_query - @request.session[:user_id] = 3 - get :edit, :id => 3 - assert_response :success - assert_template 'edit' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => 'checked', - :disabled => 'disabled' } - end - - def test_edit_project_private_query - @request.session[:user_id] = 3 - get :edit, :id => 2 - assert_response :success - assert_template 'edit' - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]' } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => nil, - :disabled => nil } - end - - def test_edit_project_public_query - @request.session[:user_id] = 2 - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query[is_public]', - :checked => 'checked' - } - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'query_is_for_all', - :checked => nil, - :disabled => 'disabled' } - end - - def test_edit_sort_criteria - @request.session[:user_id] = 1 - get :edit, :id => 5 - assert_response :success - assert_template 'edit' - assert_tag :tag => 'select', :attributes => { :name => 'query[sort_criteria][0][]' }, - :child => { :tag => 'option', :attributes => { :value => 'priority', - :selected => 'selected' } } - assert_tag :tag => 'select', :attributes => { :name => 'query[sort_criteria][0][]' }, - :child => { :tag => 'option', :attributes => { :value => 'desc', - :selected => 'selected' } } - end - - def test_edit_invalid_query - @request.session[:user_id] = 2 - get :edit, :id => 99 - assert_response 404 - end - - def test_udpate_global_private_query - @request.session[:user_id] = 3 - put :update, - :id => 3, - :default_columns => '1', - :fields => ["status_id", "assigned_to_id"], - :operators => {"assigned_to_id" => "=", "status_id" => "o"}, - :values => { "assigned_to_id" => ["me"], "status_id" => ["1"]}, - :query => {"name" => "test_edit_global_private_query", "is_public" => "1"} - - assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 3 - q = Query.find_by_name('test_edit_global_private_query') - assert !q.is_public? - assert q.has_default_columns? - assert q.valid? - end - - def test_update_global_public_query - @request.session[:user_id] = 1 - put :update, - :id => 4, - :default_columns => '1', - :fields => ["status_id", "assigned_to_id"], - :operators => {"assigned_to_id" => "=", "status_id" => "o"}, - :values => { "assigned_to_id" => ["1"], "status_id" => ["1"]}, - :query => {"name" => "test_edit_global_public_query", "is_public" => "1"} - - assert_redirected_to :controller => 'issues', :action => 'index', :query_id => 4 - q = Query.find_by_name('test_edit_global_public_query') - assert q.is_public? - assert q.has_default_columns? - assert q.valid? - end - - def test_update_with_failure - @request.session[:user_id] = 1 - put :update, :id => 4, :query => {:name => ''} - assert_response :success - assert_template 'edit' - end - - def test_destroy - @request.session[:user_id] = 2 - delete :destroy, :id => 1 - assert_redirected_to :controller => 'issues', :action => 'index', :project_id => 'ecookbook', :set_filter => 1, :query_id => nil - assert_nil Query.find_by_id(1) - end - - def test_backslash_should_be_escaped_in_filters - @request.session[:user_id] = 2 - get :new, :subject => 'foo/bar' - assert_response :success - assert_template 'new' - assert_include 'addFilter("subject", "=", ["foo\/bar"]);', response.body - end -end diff --git a/test/functional/reports_controller_test.rb b/test/functional/reports_controller_test.rb deleted file mode 100644 index a7faaf556..000000000 --- a/test/functional/reports_controller_test.rb +++ /dev/null @@ -1,67 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ReportsControllerTest < ActionController::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :versions - - def test_get_issue_report - get :issue_report, :id => 1 - - assert_response :success - assert_template 'issue_report' - - [:issues_by_tracker, :issues_by_version, :issues_by_category, :issues_by_assigned_to, - :issues_by_author, :issues_by_subproject, :issues_by_priority].each do |ivar| - assert_not_nil assigns(ivar) - end - - assert_equal IssuePriority.all.reverse, assigns(:priorities) - end - - def test_get_issue_report_details - %w(tracker version priority category assigned_to author subproject).each do |detail| - get :issue_report_details, :id => 1, :detail => detail - - assert_response :success - assert_template 'issue_report_details' - assert_not_nil assigns(:field) - assert_not_nil assigns(:rows) - assert_not_nil assigns(:data) - assert_not_nil assigns(:report_title) - end - end - - def test_get_issue_report_details_by_priority - get :issue_report_details, :id => 1, :detail => 'priority' - assert_equal IssuePriority.all.reverse, assigns(:rows) - end - - def test_get_issue_report_details_with_an_invalid_detail - get :issue_report_details, :id => 1, :detail => 'invalid' - - assert_redirected_to '/projects/ecookbook/issues/report' - end -end diff --git a/test/functional/repositories_bazaar_controller_test.rb b/test/functional/repositories_bazaar_controller_test.rb deleted file mode 100644 index 1b34f76b3..000000000 --- a/test/functional/repositories_bazaar_controller_test.rb +++ /dev/null @@ -1,198 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesBazaarControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository/trunk').to_s - PRJ_ID = 3 - - def setup - User.current = nil - @project = Project.find(PRJ_ID) - @repository = Repository::Bazaar.create( - :project => @project, - :url => REPOSITORY_PATH, - :log_encoding => 'UTF-8') - assert @repository - end - - if File.directory?(REPOSITORY_PATH) - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Bazaar' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Bazaar, assigns(:repository) - assert assigns(:repository).new_record? - end - - def test_browse_root - get :show, :id => PRJ_ID - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 2, assigns(:entries).size - assert assigns(:entries).detect {|e| e.name == 'directory' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'doc-mkdir.txt' && e.kind == 'file'} - end - - def test_browse_directory - get :show, :id => PRJ_ID, :path => repository_path_hash(['directory'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['doc-ls.txt', 'document.txt', 'edit.png'], assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'edit.png'} - assert_not_nil entry - assert_equal 'file', entry.kind - assert_equal 'directory/edit.png', entry.path - end - - def test_browse_at_given_revision - get :show, :id => PRJ_ID, :path => repository_path_hash([])[:param], - :rev => 3 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['directory', 'doc-deleted.txt', 'doc-ls.txt', 'doc-mkdir.txt'], - assigns(:entries).collect(&:name) - end - - def test_changes - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['doc-mkdir.txt'])[:param] - assert_response :success - assert_template 'changes' - assert_tag :tag => 'h2', :content => 'doc-mkdir.txt' - end - - def test_entry_show - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['directory', 'doc-ls.txt'])[:param] - assert_response :success - assert_template 'entry' - # Line 19 - assert_tag :tag => 'th', - :content => /29/, - :attributes => { :class => /line-num/ }, - :sibling => { :tag => 'td', :content => /Show help message/ } - end - - def test_entry_download - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['directory', 'doc-ls.txt'])[:param], - :format => 'raw' - assert_response :success - # File content - assert @response.body.include?('Show help message') - end - - def test_directory_entry - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['directory'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entry) - assert_equal 'directory', assigns(:entry).name - end - - def test_diff - # Full diff of changeset 3 - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 3, :type => dt - assert_response :success - assert_template 'diff' - # Line 11 removed - assert_tag :tag => 'th', - :content => '11', - :sibling => { :tag => 'td', - :attributes => { :class => /diff_out/ }, - :content => /Display more information/ } - end - end - - def test_annotate - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['doc-mkdir.txt'])[:param] - assert_response :success - assert_template 'annotate' - assert_tag :tag => 'th', :content => '2', - :sibling => { - :tag => 'td', - :child => { - :tag => 'a', - :content => '3' - } - } - assert_tag :tag => 'th', :content => '2', - :sibling => { :tag => 'td', :content => /jsmith/ } - assert_tag :tag => 'th', :content => '2', - :sibling => { - :tag => 'td', - :child => { - :tag => 'a', - :content => '3' - } - } - assert_tag :tag => 'th', :content => '2', - :sibling => { :tag => 'td', :content => /Main purpose/ } - end - - def test_destroy_valid_repository - @request.session[:user_id] = 1 # admin - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - assert @repository.changesets.count > 0 - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Bazaar.create!( - :project => @project, - :url => "/invalid", - :log_encoding => 'UTF-8') - @repository.fetch_changesets - @repository.reload - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "Bazaar test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/repositories_controller_test.rb b/test/functional/repositories_controller_test.rb deleted file mode 100644 index f7df422a3..000000000 --- a/test/functional/repositories_controller_test.rb +++ /dev/null @@ -1,264 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, - :repositories, :issues, :issue_statuses, :changesets, :changes, - :issue_categories, :enumerations, :custom_fields, :custom_values, :trackers - - def setup - User.current = nil - end - - def test_new - @request.session[:user_id] = 1 - get :new, :project_id => 'subproject1' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Subversion, assigns(:repository) - assert assigns(:repository).new_record? - assert_tag 'input', :attributes => {:name => 'repository[url]', :disabled => nil} - end - - def test_new_should_propose_enabled_scm_only - @request.session[:user_id] = 1 - with_settings :enabled_scm => ['Mercurial', 'Git'] do - get :new, :project_id => 'subproject1' - end - assert_response :success - assert_template 'new' - assert_kind_of Repository::Mercurial, assigns(:repository) - assert_tag 'select', :attributes => {:name => 'repository_scm'}, - :children => {:count => 3} - assert_tag 'select', :attributes => {:name => 'repository_scm'}, - :child => {:tag => 'option', :attributes => {:value => 'Mercurial', :selected => 'selected'}} - assert_tag 'select', :attributes => {:name => 'repository_scm'}, - :child => {:tag => 'option', :attributes => {:value => 'Git', :selected => nil}} - end - - def test_create - @request.session[:user_id] = 1 - assert_difference 'Repository.count' do - post :create, :project_id => 'subproject1', - :repository_scm => 'Subversion', - :repository => {:url => 'file:///test', :is_default => '1', :identifier => ''} - end - assert_response 302 - repository = Repository.first(:order => 'id DESC') - assert_kind_of Repository::Subversion, repository - assert_equal 'file:///test', repository.url - end - - def test_create_with_failure - @request.session[:user_id] = 1 - assert_no_difference 'Repository.count' do - post :create, :project_id => 'subproject1', - :repository_scm => 'Subversion', - :repository => {:url => 'invalid'} - end - assert_response :success - assert_template 'new' - assert_kind_of Repository::Subversion, assigns(:repository) - assert assigns(:repository).new_record? - end - - def test_edit - @request.session[:user_id] = 1 - get :edit, :id => 11 - assert_response :success - assert_template 'edit' - assert_equal Repository.find(11), assigns(:repository) - assert_tag 'input', :attributes => {:name => 'repository[url]', :value => 'svn://localhost/test', :disabled => 'disabled'} - end - - def test_update - @request.session[:user_id] = 1 - put :update, :id => 11, :repository => {:password => 'test_update'} - assert_response 302 - assert_equal 'test_update', Repository.find(11).password - end - - def test_update_with_failure - @request.session[:user_id] = 1 - put :update, :id => 11, :repository => {:password => 'x'*260} - assert_response :success - assert_template 'edit' - assert_equal Repository.find(11), assigns(:repository) - end - - def test_destroy - @request.session[:user_id] = 1 - assert_difference 'Repository.count', -1 do - delete :destroy, :id => 11 - end - assert_response 302 - assert_nil Repository.find_by_id(11) - end - - def test_revisions - get :revisions, :id => 1 - assert_response :success - assert_template 'revisions' - assert_equal Repository.find(10), assigns(:repository) - assert_not_nil assigns(:changesets) - end - - def test_revisions_for_other_repository - repository = Repository::Subversion.create!(:project_id => 1, :identifier => 'foo', :url => 'file:///foo') - - get :revisions, :id => 1, :repository_id => 'foo' - assert_response :success - assert_template 'revisions' - assert_equal repository, assigns(:repository) - assert_not_nil assigns(:changesets) - end - - def test_revisions_for_invalid_repository - get :revisions, :id => 1, :repository_id => 'foo' - assert_response 404 - end - - def test_revision - get :revision, :id => 1, :rev => 1 - assert_response :success - assert_not_nil assigns(:changeset) - assert_equal "1", assigns(:changeset).revision - end - - def test_revision_should_not_change_the_project_menu_link - get :revision, :id => 1, :rev => 1 - assert_response :success - - assert_tag 'a', :attributes => {:href => '/projects/ecookbook/repository', :class => /repository/}, - :ancestor => {:attributes => {:id => 'main-menu'}} - end - - def test_revision_with_before_nil_and_afer_normal - get :revision, {:id => 1, :rev => 1} - assert_response :success - assert_template 'revision' - assert_no_tag :tag => "div", :attributes => { :class => "contextual" }, - :child => { :tag => "a", :attributes => { :href => '/projects/ecookbook/repository/revisions/0'} - } - assert_tag :tag => "div", :attributes => { :class => "contextual" }, - :child => { :tag => "a", :attributes => { :href => '/projects/ecookbook/repository/revisions/2'} - } - end - - def test_add_related_issue - @request.session[:user_id] = 2 - assert_difference 'Changeset.find(103).issues.size' do - xhr :post, :add_related_issue, :id => 1, :rev => 4, :issue_id => 2, :format => 'js' - assert_response :success - assert_template 'add_related_issue' - assert_equal 'text/javascript', response.content_type - end - assert_equal [2], Changeset.find(103).issue_ids - assert_include 'related-issues', response.body - assert_include 'Feature request #2', response.body - end - - def test_add_related_issue_with_invalid_issue_id - @request.session[:user_id] = 2 - assert_no_difference 'Changeset.find(103).issues.size' do - xhr :post, :add_related_issue, :id => 1, :rev => 4, :issue_id => 9999, :format => 'js' - assert_response :success - assert_template 'add_related_issue' - assert_equal 'text/javascript', response.content_type - end - assert_include 'alert("Issue is invalid")', response.body - end - - def test_remove_related_issue - Changeset.find(103).issues << Issue.find(1) - Changeset.find(103).issues << Issue.find(2) - - @request.session[:user_id] = 2 - assert_difference 'Changeset.find(103).issues.size', -1 do - xhr :delete, :remove_related_issue, :id => 1, :rev => 4, :issue_id => 2, :format => 'js' - assert_response :success - assert_template 'remove_related_issue' - assert_equal 'text/javascript', response.content_type - end - assert_equal [1], Changeset.find(103).issue_ids - assert_include 'related-issue-2', response.body - end - - def test_graph_commits_per_month - # Make sure there's some data to display - latest = Project.find(1).repository.changesets.maximum(:commit_date) - assert_not_nil latest - Date.stubs(:today).returns(latest.to_date + 10) - - get :graph, :id => 1, :graph => 'commits_per_month' - assert_response :success - assert_equal 'image/svg+xml', @response.content_type - end - - def test_graph_commits_per_author - get :graph, :id => 1, :graph => 'commits_per_author' - assert_response :success - assert_equal 'image/svg+xml', @response.content_type - end - - def test_get_committers - @request.session[:user_id] = 2 - # add a commit with an unknown user - Changeset.create!( - :repository => Project.find(1).repository, - :committer => 'foo', - :committed_on => Time.now, - :revision => 100, - :comments => 'Committed by foo.' - ) - - get :committers, :id => 10 - assert_response :success - assert_template 'committers' - - assert_tag :td, :content => 'dlopper', - :sibling => { :tag => 'td', - :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }, - :child => { :tag => 'option', :content => 'Dave Lopper', - :attributes => { :value => '3', :selected => 'selected' }}}} - assert_tag :td, :content => 'foo', - :sibling => { :tag => 'td', - :child => { :tag => 'select', :attributes => { :name => %r{^committers\[\d+\]\[\]$} }}} - assert_no_tag :td, :content => 'foo', - :sibling => { :tag => 'td', - :descendant => { :tag => 'option', :attributes => { :selected => 'selected' }}} - end - - def test_post_committers - @request.session[:user_id] = 2 - # add a commit with an unknown user - c = Changeset.create!( - :repository => Project.find(1).repository, - :committer => 'foo', - :committed_on => Time.now, - :revision => 100, - :comments => 'Committed by foo.' - ) - assert_no_difference "Changeset.count(:conditions => 'user_id = 3')" do - post :committers, :id => 10, :committers => { '0' => ['foo', '2'], '1' => ['dlopper', '3']} - assert_response 302 - assert_equal User.find(2), c.reload.user - end - end -end diff --git a/test/functional/repositories_cvs_controller_test.rb b/test/functional/repositories_cvs_controller_test.rb deleted file mode 100644 index 4a443c5a7..000000000 --- a/test/functional/repositories_cvs_controller_test.rb +++ /dev/null @@ -1,274 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesCvsControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/cvs_repository').to_s - REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? - # CVS module - MODULE_NAME = 'test' - PRJ_ID = 3 - NUM_REV = 7 - - def setup - Setting.default_language = 'en' - User.current = nil - - @project = Project.find(PRJ_ID) - @repository = Repository::Cvs.create(:project => Project.find(PRJ_ID), - :root_url => REPOSITORY_PATH, - :url => MODULE_NAME, - :log_encoding => 'UTF-8') - assert @repository - end - - if File.directory?(REPOSITORY_PATH) - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Cvs' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Cvs, assigns(:repository) - assert assigns(:repository).new_record? - 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 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 3, assigns(:entries).size - - entry = assigns(:entries).detect {|e| e.name == 'images'} - assert_equal 'dir', entry.kind - - entry = assigns(:entries).detect {|e| e.name == 'README'} - assert_equal 'file', entry.kind - - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_browse_directory - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['add.png', 'delete.png', 'edit.png'], assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'edit.png'} - assert_not_nil entry - assert_equal 'file', entry.kind - assert_equal 'images/edit.png', entry.path - end - - def test_browse_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param], - :rev => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name) - end - - def test_entry - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'entry' - assert_no_tag :tag => 'td', - :attributes => { :class => /line-code/}, - :content => /before_filter/ - end - - def test_entry_at_given_revision - # changesets must be loaded - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :rev => 2 - assert_response :success - assert_template 'entry' - # this line was removed in r3 - assert_tag :tag => 'td', - :attributes => { :class => /line-code/}, - :content => /before_filter/ - end - - def test_entry_not_found - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'zzz.c'])[:param] - assert_tag :tag => 'p', - :attributes => { :id => /errorExplanation/ }, - :content => /The entry or revision was not found in the repository/ - end - - def test_entry_download - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :format => 'raw' - assert_response :success - end - - def test_directory_entry - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entry) - assert_equal 'sources', assigns(:entry).name - end - - def test_diff - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 3, :type => dt - assert_response :success - assert_template 'diff' - assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_out' }, - :content => /before_filter :require_login/ - assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' }, - :content => /with one change/ - end - end - - def test_diff_new_files - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 1, :type => dt - assert_response :success - assert_template 'diff' - assert_tag :tag => 'td', :attributes => { :class => 'line-code diff_in' }, - :content => /watched.remove_watcher/ - assert_tag :tag => 'th', :attributes => { :class => 'filename' }, - :content => /test\/README/ - assert_tag :tag => 'th', :attributes => { :class => 'filename' }, - :content => /test\/images\/delete.png / - assert_tag :tag => 'th', :attributes => { :class => 'filename' }, - :content => /test\/images\/edit.png/ - assert_tag :tag => 'th', :attributes => { :class => 'filename' }, - :content => /test\/sources\/watchers_controller.rb/ - end - end - - def test_annotate - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'annotate' - - # 1.1 line - assert_select 'tr' do - assert_select 'th.line-num', :text => '21' - assert_select 'td.revision', :text => /1.1/ - assert_select 'td.author', :text => /LANG/ - end - # 1.2 line - assert_select 'tr' do - assert_select 'th.line-num', :text => '32' - assert_select 'td.revision', :text => /1.2/ - assert_select 'td.author', :text => /LANG/ - end - end - - def test_destroy_valid_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 - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Cvs.create!( - :project => Project.find(PRJ_ID), - :root_url => "/invalid", - :url => MODULE_NAME, - :log_encoding => 'UTF-8' - ) - @repository.fetch_changesets - @project.reload - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "CVS test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/repositories_darcs_controller_test.rb b/test/functional/repositories_darcs_controller_test.rb deleted file mode 100644 index 28265d48d..000000000 --- a/test/functional/repositories_darcs_controller_test.rb +++ /dev/null @@ -1,165 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesDarcsControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/darcs_repository').to_s - PRJ_ID = 3 - NUM_REV = 6 - - def setup - User.current = nil - @project = Project.find(PRJ_ID) - @repository = Repository::Darcs.create( - :project => @project, - :url => REPOSITORY_PATH, - :log_encoding => 'UTF-8' - ) - assert @repository - end - - if File.directory?(REPOSITORY_PATH) - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Darcs' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Darcs, assigns(:repository) - assert assigns(:repository).new_record? - 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 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 3, assigns(:entries).size - assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} - end - - def test_browse_directory - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'edit.png'} - assert_not_nil entry - assert_equal 'file', entry.kind - assert_equal 'images/edit.png', entry.path - end - - def test_browse_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param], - :rev => 1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png'], assigns(:entries).collect(&:name) - end - - def test_changes - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['images', 'edit.png'])[:param] - assert_response :success - assert_template 'changes' - assert_tag :tag => 'h2', :content => 'edit.png' - end - - def test_diff - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - # Full diff of changeset 5 - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 5, :type => dt - assert_response :success - assert_template 'diff' - # Line 22 removed - assert_tag :tag => 'th', - :content => '22', - :sibling => { :tag => 'td', - :attributes => { :class => /diff_out/ }, - :content => /def remove/ } - end - end - - def test_destroy_valid_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 - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Darcs.create!( - :project => @project, - :url => "/invalid", - :log_encoding => 'UTF-8' - ) - @repository.fetch_changesets - @project.reload - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "Darcs test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/repositories_filesystem_controller_test.rb b/test/functional/repositories_filesystem_controller_test.rb deleted file mode 100644 index ebed7c69b..000000000 --- a/test/functional/repositories_filesystem_controller_test.rb +++ /dev/null @@ -1,164 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesFilesystemControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/filesystem_repository').to_s - PRJ_ID = 3 - - def setup - @ruby19_non_utf8_pass = - (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8') - User.current = nil - Setting.enabled_scm << 'Filesystem' unless Setting.enabled_scm.include?('Filesystem') - @project = Project.find(PRJ_ID) - @repository = Repository::Filesystem.create( - :project => @project, - :url => REPOSITORY_PATH, - :path_encoding => '' - ) - assert @repository - end - - if File.directory?(REPOSITORY_PATH) - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Filesystem' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Filesystem, assigns(:repository) - assert assigns(:repository).new_record? - end - - def test_browse_root - @repository.fetch_changesets - @repository.reload - get :show, :id => PRJ_ID - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert assigns(:entries).size > 0 - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size == 0 - - assert_no_tag 'input', :attributes => {:name => 'rev'} - assert_no_tag 'a', :content => 'Statistics' - assert_no_tag 'a', :content => 'Atom' - end - - def test_show_no_extension - get :entry, :id => PRJ_ID, :path => repository_path_hash(['test'])[:param] - assert_response :success - assert_template 'entry' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /TEST CAT/ } - end - - def test_entry_download_no_extension - get :raw, :id => PRJ_ID, :path => repository_path_hash(['test'])[:param] - assert_response :success - assert_equal 'application/octet-stream', @response.content_type - end - - def test_show_non_ascii_contents - with_settings :repositories_encodings => 'UTF-8,EUC-JP' do - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['japanese', 'euc-jp.txt'])[:param] - assert_response :success - assert_template 'entry' - assert_tag :tag => 'th', - :content => '2', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /japanese/ } - if @ruby19_non_utf8_pass - puts "TODO: show repository file contents test fails in Ruby 1.9 " + - "and Encoding.default_external is not UTF-8. " + - "Current value is '#{Encoding.default_external.to_s}'" - else - str_japanese = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" - str_japanese.force_encoding('UTF-8') if str_japanese.respond_to?(:force_encoding) - assert_tag :tag => 'th', - :content => '3', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /#{str_japanese}/ } - end - end - end - - def test_show_utf16 - enc = (RUBY_VERSION == "1.9.2" ? 'UTF-16LE' : 'UTF-16') - with_settings :repositories_encodings => enc do - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['japanese', 'utf-16.txt'])[:param] - assert_response :success - assert_tag :tag => 'th', - :content => '2', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /japanese/ } - end - end - - def test_show_text_file_should_send_if_too_big - with_settings :file_max_size_displayed => 1 do - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['japanese', 'big-file.txt'])[:param] - assert_response :success - assert_equal 'text/plain', @response.content_type - end - end - - def test_destroy_valid_repository - @request.session[:user_id] = 1 # admin - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Filesystem.create!( - :project => @project, - :url => "/invalid", - :path_encoding => '' - ) - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "Filesystem test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/repositories_git_controller_test.rb b/test/functional/repositories_git_controller_test.rb deleted file mode 100644 index fcdf70132..000000000 --- a/test/functional/repositories_git_controller_test.rb +++ /dev/null @@ -1,638 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesGitControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s - REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? - PRJ_ID = 3 - CHAR_1_HEX = "\xc3\x9c" - NUM_REV = 28 - - ## Git, Mercurial and CVS path encodings are binary. - ## Subversion supports URL encoding for path. - ## Redmine Mercurial adapter and extension use URL encoding. - ## Git accepts only binary path in command line parameter. - ## So, there is no way to use binary command line parameter in JRuby. - JRUBY_SKIP = (RUBY_PLATFORM == 'java') - JRUBY_SKIP_STR = "TODO: This test fails in JRuby" - - def setup - @ruby19_non_utf8_pass = - (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8') - - User.current = nil - @project = Project.find(PRJ_ID) - @repository = Repository::Git.create( - :project => @project, - :url => REPOSITORY_PATH, - :path_encoding => 'ISO-8859-1' - ) - assert @repository - @char_1 = CHAR_1_HEX.dup - if @char_1.respond_to?(:force_encoding) - @char_1.force_encoding('UTF-8') - end - end - - def test_create_and_update - @request.session[:user_id] = 1 - assert_difference 'Repository.count' do - post :create, :project_id => 'subproject1', - :repository_scm => 'Git', - :repository => { - :url => '/test', - :is_default => '0', - :identifier => 'test-create', - :extra_report_last_commit => '1', - } - end - assert_response 302 - repository = Repository.first(:order => 'id DESC') - assert_kind_of Repository::Git, repository - assert_equal '/test', repository.url - assert_equal true, repository.extra_report_last_commit - - put :update, :id => repository.id, - :repository => { - :extra_report_last_commit => '0' - } - assert_response 302 - repo2 = Repository.find(repository.id) - assert_equal false, repo2.extra_report_last_commit - end - - if File.directory?(REPOSITORY_PATH) - ## Ruby uses ANSI api to fork a process on Windows. - ## Japanese Shift_JIS and Traditional Chinese Big5 have 0x5c(backslash) problem - ## and these are incompatible with ASCII. - ## Git for Windows (msysGit) changed internal API from ANSI to Unicode in 1.7.10 - ## http://code.google.com/p/msysgit/issues/detail?id=80 - ## So, Latin-1 path tests fail on Japanese Windows - WINDOWS_PASS = (Redmine::Platform.mswin? && - Redmine::Scm::Adapters::GitAdapter.client_version_above?([1, 7, 10])) - WINDOWS_SKIP_STR = "TODO: This test fails in Git for Windows above 1.7.10" - - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Git' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Git, assigns(:repository) - assert assigns(:repository).new_record? - 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 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 9, assigns(:entries).size - assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'this_is_a_really_long_and_verbose_directory_name' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == 'copied_README' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == 'new_file.txt' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == 'renamed_test.txt' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == 'filemane with spaces.txt' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == ' filename with a leading space.txt ' && e.kind == 'file'} - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_browse_branch - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :rev => 'test_branch' - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 4, assigns(:entries).size - assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} - assert assigns(:entries).detect {|e| e.name == 'test.txt' && e.kind == 'file'} - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_browse_tag - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [ - "tag00.lightweight", - "tag01.annotated", - ].each do |t1| - get :show, :id => PRJ_ID, :rev => t1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert assigns(:entries).size > 0 - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - end - - def test_browse_directory - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['edit.png'], assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'edit.png'} - assert_not_nil entry - assert_equal 'file', entry.kind - assert_equal 'images/edit.png', entry.path - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_browse_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param], - :rev => '7234cb2750b63f47bff735edc50a1c0a433c2518' - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png'], assigns(:entries).collect(&:name) - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_changes - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['images', 'edit.png'])[:param] - assert_response :success - assert_template 'changes' - assert_tag :tag => 'h2', :content => 'edit.png' - end - - def test_entry_show - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'entry' - # Line 19 - assert_tag :tag => 'th', - :content => '11', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ } - end - - def test_entry_show_latin_1 - if @ruby19_non_utf8_pass - puts_ruby19_non_utf8_pass() - elsif WINDOWS_PASS - puts WINDOWS_SKIP_STR - elsif JRUBY_SKIP - puts JRUBY_SKIP_STR - else - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1| - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param], - :rev => r1 - assert_response :success - assert_template 'entry' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /test-#{@char_1}.txt/ } - end - end - end - end - - def test_entry_download - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :format => 'raw' - assert_response :success - # File content - assert @response.body.include?('WITHOUT ANY WARRANTY') - end - - def test_directory_entry - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entry) - assert_equal 'sources', assigns(:entry).name - end - - def test_diff - assert_equal true, @repository.is_default - assert_nil @repository.identifier - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - # Full diff of changeset 2f9c0091 - ['inline', 'sbs'].each do |dt| - get :diff, - :id => PRJ_ID, - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7', - :type => dt - assert_response :success - assert_template 'diff' - # Line 22 removed - assert_tag :tag => 'th', - :content => /22/, - :sibling => { :tag => 'td', - :attributes => { :class => /diff_out/ }, - :content => /def remove/ } - assert_tag :tag => 'h2', :content => /2f9c0091/ - end - end - - def test_diff_with_rev_and_path - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - with_settings :diff_max_lines_displayed => 1000 do - # Full diff of changeset 2f9c0091 - ['inline', 'sbs'].each do |dt| - get :diff, - :id => PRJ_ID, - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7', - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :type => dt - assert_response :success - assert_template 'diff' - # Line 22 removed - assert_tag :tag => 'th', - :content => '22', - :sibling => { :tag => 'td', - :attributes => { :class => /diff_out/ }, - :content => /def remove/ } - assert_tag :tag => 'h2', :content => /2f9c0091/ - end - end - end - - def test_diff_truncated - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - - with_settings :diff_max_lines_displayed => 5 do - # Truncated diff of changeset 2f9c0091 - with_cache do - with_settings :default_language => 'en' do - get :diff, :id => PRJ_ID, :type => 'inline', - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' - assert_response :success - assert @response.body.include?("... This diff was truncated") - end - with_settings :default_language => 'fr' do - get :diff, :id => PRJ_ID, :type => 'inline', - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' - assert_response :success - assert ! @response.body.include?("... This diff was truncated") - assert @response.body.include?("... Ce diff") - end - end - end - end - - def test_diff_two_revs - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['inline', 'sbs'].each do |dt| - get :diff, - :id => PRJ_ID, - :rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1', - :rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7', - :type => dt - assert_response :success - assert_template 'diff' - diff = assigns(:diff) - assert_not_nil diff - assert_tag :tag => 'h2', :content => /2f9c0091:61b685fb/ - assert_tag :tag => "form", - :attributes => { - :action => "/projects/subproject1/repository/revisions/" + - "61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff" - } - assert_tag :tag => 'input', - :attributes => { - :id => "rev_to", - :name => "rev_to", - :type => "hidden", - :value => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' - } - end - end - - def test_diff_path_in_subrepo - repo = Repository::Git.create( - :project => @project, - :url => REPOSITORY_PATH, - :identifier => 'test-diff-path', - :path_encoding => 'ISO-8859-1' - ); - assert repo - assert_equal false, repo.is_default - assert_equal 'test-diff-path', repo.identifier - get :diff, - :id => PRJ_ID, - :repository_id => 'test-diff-path', - :rev => '61b685fbe55ab05b', - :rev_to => '2f9c0091c754a91a', - :type => 'inline' - assert_response :success - assert_template 'diff' - diff = assigns(:diff) - assert_not_nil diff - assert_tag :tag => "form", - :attributes => { - :action => "/projects/subproject1/repository/test-diff-path/" + - "revisions/61b685fbe55ab05b/diff" - } - assert_tag :tag => 'input', - :attributes => { - :id => "rev_to", - :name => "rev_to", - :type => "hidden", - :value => '2f9c0091c754a91a' - } - end - - def test_diff_latin_1 - if @ruby19_non_utf8_pass - puts_ruby19_non_utf8_pass() - else - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1| - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => r1, :type => dt - assert_response :success - assert_template 'diff' - assert_tag :tag => 'thead', - :descendant => { - :tag => 'th', - :attributes => { :class => 'filename' } , - :content => /latin-1-dir\/test-#{@char_1}.txt/ , - }, - :sibling => { - :tag => 'tbody', - :descendant => { - :tag => 'td', - :attributes => { :class => /diff_in/ }, - :content => /test-#{@char_1}.txt/ - } - } - end - end - end - end - end - - def test_diff_should_show_filenames - get :diff, :id => PRJ_ID, :rev => 'deff712f05a90d96edbd70facc47d944be5897e3', :type => 'inline' - assert_response :success - assert_template 'diff' - # modified file - assert_select 'th.filename', :text => 'sources/watchers_controller.rb' - # deleted file - assert_select 'th.filename', :text => 'test.txt' - end - - def test_save_diff_type - user1 = User.find(1) - user1.pref[:diff_type] = nil - user1.preference.save - user = User.find(1) - assert_nil user.pref[:diff_type] - - @request.session[:user_id] = 1 # admin - get :diff, - :id => PRJ_ID, - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7' - assert_response :success - assert_template 'diff' - user.reload - assert_equal "inline", user.pref[:diff_type] - get :diff, - :id => PRJ_ID, - :rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7', - :type => 'sbs' - assert_response :success - assert_template 'diff' - user.reload - assert_equal "sbs", user.pref[:diff_type] - end - - def test_annotate - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'annotate' - - # Line 23, changeset 2f9c0091 - assert_select 'tr' do - assert_select 'th.line-num', :text => '23' - assert_select 'td.revision', :text => /2f9c0091/ - assert_select 'td.author', :text => 'jsmith' - assert_select 'td', :text => /remove_watcher/ - end - end - - def test_annotate_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :annotate, :id => PRJ_ID, :rev => 'deff7', - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'annotate' - assert_tag :tag => 'h2', :content => /@ deff712f/ - end - - def test_annotate_binary_file - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['images', 'edit.png'])[:param] - assert_response 500 - assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ }, - :content => /cannot be annotated/ - end - - def test_annotate_error_when_too_big - with_settings :file_max_size_displayed => 1 do - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :rev => 'deff712f' - assert_response 500 - assert_tag :tag => 'p', :attributes => { :id => /errorExplanation/ }, - :content => /exceeds the maximum text file size/ - - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['README'])[:param], - :rev => '7234cb2' - assert_response :success - assert_template 'annotate' - end - end - - def test_annotate_latin_1 - if @ruby19_non_utf8_pass - puts_ruby19_non_utf8_pass() - elsif WINDOWS_PASS - puts WINDOWS_SKIP_STR - elsif JRUBY_SKIP - puts JRUBY_SKIP_STR - else - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - ['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1| - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param], - :rev => r1 - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /test-#{@char_1}.txt/ } - end - end - end - end - - def test_revisions - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :revisions, :id => PRJ_ID - assert_response :success - assert_template 'revisions' - assert_tag :tag => 'form', - :attributes => { - :method => 'get', - :action => '/projects/subproject1/repository/revision' - } - end - - def test_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r| - get :revision, :id => PRJ_ID, :rev => r - assert_response :success - assert_template 'revision' - end - end - - def test_empty_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['', ' ', nil].each do |r| - get :revision, :id => PRJ_ID, :rev => r - assert_response 404 - assert_error_tag :content => /was not found/ - end - end - - def test_destroy_valid_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 - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Git.create!( - :project => @project, - :url => "/invalid", - :path_encoding => 'ISO-8859-1' - ) - @repository.fetch_changesets - @repository.reload - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - private - - def puts_ruby19_non_utf8_pass - puts "TODO: This test fails in Ruby 1.9 " + - "and Encoding.default_external is not UTF-8. " + - "Current value is '#{Encoding.default_external.to_s}'" - end - else - puts "Git test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end - - private - def with_cache(&block) - before = ActionController::Base.perform_caching - ActionController::Base.perform_caching = true - block.call - ActionController::Base.perform_caching = before - end -end diff --git a/test/functional/repositories_mercurial_controller_test.rb b/test/functional/repositories_mercurial_controller_test.rb deleted file mode 100644 index a4dffd967..000000000 --- a/test/functional/repositories_mercurial_controller_test.rb +++ /dev/null @@ -1,525 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesMercurialControllerTest < ActionController::TestCase - tests RepositoriesController - - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/mercurial_repository').to_s - CHAR_1_HEX = "\xc3\x9c" - PRJ_ID = 3 - NUM_REV = 32 - - ruby19_non_utf8_pass = - (RUBY_VERSION >= '1.9' && Encoding.default_external.to_s != 'UTF-8') - - def setup - User.current = nil - @project = Project.find(PRJ_ID) - @repository = Repository::Mercurial.create( - :project => @project, - :url => REPOSITORY_PATH, - :path_encoding => 'ISO-8859-1' - ) - assert @repository - @diff_c_support = true - @char_1 = CHAR_1_HEX.dup - @tag_char_1 = "tag-#{CHAR_1_HEX}-00" - @branch_char_0 = "branch-#{CHAR_1_HEX}-00" - @branch_char_1 = "branch-#{CHAR_1_HEX}-01" - if @char_1.respond_to?(:force_encoding) - @char_1.force_encoding('UTF-8') - @tag_char_1.force_encoding('UTF-8') - @branch_char_0.force_encoding('UTF-8') - @branch_char_1.force_encoding('UTF-8') - end - end - - if ruby19_non_utf8_pass - puts "TODO: Mercurial functional test fails in Ruby 1.9 " + - "and Encoding.default_external is not UTF-8. " + - "Current value is '#{Encoding.default_external.to_s}'" - def test_fake; assert true end - elsif File.directory?(REPOSITORY_PATH) - - def test_get_new - @request.session[:user_id] = 1 - @project.repository.destroy - get :new, :project_id => 'subproject1', :repository_scm => 'Mercurial' - assert_response :success - assert_template 'new' - assert_kind_of Repository::Mercurial, assigns(:repository) - assert assigns(:repository).new_record? - end - - def test_show_root - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal 4, assigns(:entries).size - assert assigns(:entries).detect {|e| e.name == 'images' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'sources' && e.kind == 'dir'} - assert assigns(:entries).detect {|e| e.name == 'README' && e.kind == 'file'} - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_show_directory - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png', 'edit.png'], assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'edit.png'} - assert_not_nil entry - assert_equal 'file', entry.kind - assert_equal 'images/edit.png', entry.path - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - - def test_show_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [0, '0', '0885933ad4f6'].each do |r1| - get :show, :id => PRJ_ID, :path => repository_path_hash(['images'])[:param], - :rev => r1 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal ['delete.png'], assigns(:entries).collect(&:name) - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - end - - def test_show_directory_sql_escape_percent - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [13, '13', '3a330eb32958'].each do |r1| - get :show, :id => PRJ_ID, - :path => repository_path_hash(['sql_escape', 'percent%dir'])[:param], - :rev => r1 - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:entries) - assert_equal ['percent%file1.txt', 'percentfile1.txt'], - assigns(:entries).collect(&:name) - changesets = assigns(:changesets) - assert_not_nil changesets - assert assigns(:changesets).size > 0 - assert_equal %w(13 11 10 9), changesets.collect(&:revision) - end - end - - def test_show_directory_latin_1_path - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [21, '21', 'adf805632193'].each do |r1| - get :show, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir'])[:param], - :rev => r1 - assert_response :success - assert_template 'show' - - assert_not_nil assigns(:entries) - assert_equal ["make-latin-1-file.rb", - "test-#{@char_1}-1.txt", - "test-#{@char_1}-2.txt", - "test-#{@char_1}.txt"], assigns(:entries).collect(&:name) - changesets = assigns(:changesets) - assert_not_nil changesets - assert_equal %w(21 20 19 18 17), changesets.collect(&:revision) - end - end - - def show_should_show_branch_selection_form - @repository.fetch_changesets - @project.reload - get :show, :id => PRJ_ID - assert_tag 'form', :attributes => {:id => 'revision_selector', :action => '/projects/subproject1/repository/show'} - assert_tag 'select', :attributes => {:name => 'branch'}, - :child => {:tag => 'option', :attributes => {:value => 'test-branch-01'}}, - :parent => {:tag => 'form', :attributes => {:id => 'revision_selector'}} - end - - def test_show_branch - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [ - 'default', - @branch_char_1, - 'branch (1)[2]&,%.-3_4', - @branch_char_0, - 'test_branch.latin-1', - 'test-branch-00', - ].each do |bra| - get :show, :id => PRJ_ID, :rev => bra - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert assigns(:entries).size > 0 - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - end - - def test_show_tag - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [ - @tag_char_1, - 'tag_test.00', - 'tag-init-revision' - ].each do |tag| - get :show, :id => PRJ_ID, :rev => tag - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert assigns(:entries).size > 0 - assert_not_nil assigns(:changesets) - assert assigns(:changesets).size > 0 - end - end - - def test_changes - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['images', 'edit.png'])[:param] - assert_response :success - assert_template 'changes' - assert_tag :tag => 'h2', :content => 'edit.png' - end - - def test_entry_show - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'entry' - # Line 10 - assert_tag :tag => 'th', - :content => '10', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', :content => /WITHOUT ANY WARRANTY/ } - end - - def test_entry_show_latin_1_path - [21, '21', 'adf805632193'].each do |r1| - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param], - :rev => r1 - assert_response :success - assert_template 'entry' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /Mercurial is a distributed version control system/ } - end - end - - def test_entry_show_latin_1_contents - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - [27, '27', '7bbf4c738e71'].each do |r1| - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param], - :rev => r1 - assert_response :success - assert_template 'entry' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /test-#{@char_1}.txt/ } - end - end - end - - def test_entry_download - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param], - :format => 'raw' - assert_response :success - # File content - assert @response.body.include?('WITHOUT ANY WARRANTY') - end - - def test_entry_binary_force_download - get :entry, :id => PRJ_ID, :rev => 1, - :path => repository_path_hash(['images', 'edit.png'])[:param] - assert_response :success - assert_equal 'image/png', @response.content_type - end - - def test_directory_entry - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['sources'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entry) - assert_equal 'sources', assigns(:entry).name - end - - def test_diff - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [4, '4', 'def6d2f1254a'].each do |r1| - # Full diff of changeset 4 - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => r1, :type => dt - assert_response :success - assert_template 'diff' - if @diff_c_support - # Line 22 removed - assert_tag :tag => 'th', - :content => '22', - :sibling => { :tag => 'td', - :attributes => { :class => /diff_out/ }, - :content => /def remove/ } - assert_tag :tag => 'h2', :content => /4:def6d2f1254a/ - end - end - end - end - - def test_diff_two_revs - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [2, '400bb8672109', '400', 400].each do |r1| - [4, 'def6d2f1254a'].each do |r2| - ['inline', 'sbs'].each do |dt| - get :diff, - :id => PRJ_ID, - :rev => r1, - :rev_to => r2, - :type => dt - assert_response :success - assert_template 'diff' - diff = assigns(:diff) - assert_not_nil diff - assert_tag :tag => 'h2', - :content => /4:def6d2f1254a 2:400bb8672109/ - end - end - end - end - - def test_diff_latin_1_path - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - [21, 'adf805632193'].each do |r1| - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => r1, :type => dt - assert_response :success - assert_template 'diff' - assert_tag :tag => 'thead', - :descendant => { - :tag => 'th', - :attributes => { :class => 'filename' } , - :content => /latin-1-dir\/test-#{@char_1}-2.txt/ , - }, - :sibling => { - :tag => 'tbody', - :descendant => { - :tag => 'td', - :attributes => { :class => /diff_in/ }, - :content => /It is written in Python/ - } - } - end - end - end - end - - def test_diff_should_show_modified_filenames - get :diff, :id => PRJ_ID, :rev => '400bb8672109', :type => 'inline' - assert_response :success - assert_template 'diff' - assert_select 'th.filename', :text => 'sources/watchers_controller.rb' - end - - def test_diff_should_show_deleted_filenames - get :diff, :id => PRJ_ID, :rev => 'b3a615152df8', :type => 'inline' - assert_response :success - assert_template 'diff' - assert_select 'th.filename', :text => 'sources/welcome_controller.rb' - end - - def test_annotate - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'annotate' - - # Line 22, revision 4:def6d2f1254a - assert_select 'tr' do - assert_select 'th.line-num', :text => '22' - assert_select 'td.revision', :text => '4:def6d2f1254a' - assert_select 'td.author', :text => 'jsmith' - assert_select 'td', :text => /remove_watcher/ - end - end - - def test_annotate_not_in_tip - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['sources', 'welcome_controller.rb'])[:param] - assert_response 404 - assert_error_tag :content => /was not found/ - end - - def test_annotate_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - [2, '400bb8672109', '400', 400].each do |r1| - get :annotate, :id => PRJ_ID, :rev => r1, - :path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param] - assert_response :success - assert_template 'annotate' - assert_tag :tag => 'h2', :content => /@ 2:400bb8672109/ - end - end - - def test_annotate_latin_1_path - [21, '21', 'adf805632193'].each do |r1| - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param], - :rev => r1 - assert_response :success - assert_template 'annotate' - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => - { - :tag => 'td', - :attributes => { :class => 'revision' }, - :child => { :tag => 'a', :content => '20:709858aafd1b' } - } - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => - { - :tag => 'td' , - :content => 'jsmith' , - :attributes => { :class => 'author' }, - } - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /Mercurial is a distributed version control system/ } - - end - end - - def test_annotate_latin_1_contents - with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do - [27, '7bbf4c738e71'].each do |r1| - get :annotate, :id => PRJ_ID, - :path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param], - :rev => r1 - assert_tag :tag => 'th', - :content => '1', - :attributes => { :class => 'line-num' }, - :sibling => { :tag => 'td', - :content => /test-#{@char_1}.txt/ } - end - end - end - - def test_empty_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['', ' ', nil].each do |r| - get :revision, :id => PRJ_ID, :rev => r - assert_response 404 - assert_error_tag :content => /was not found/ - end - end - - def test_destroy_valid_repository - @request.session[:user_id] = 1 # admin - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - assert_equal NUM_REV, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Mercurial.create!( - :project => Project.find(PRJ_ID), - :url => "/invalid", - :path_encoding => 'ISO-8859-1' - ) - @repository.fetch_changesets - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "Mercurial test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/repositories_subversion_controller_test.rb b/test/functional/repositories_subversion_controller_test.rb deleted file mode 100644 index 07d4686dc..000000000 --- a/test/functional/repositories_subversion_controller_test.rb +++ /dev/null @@ -1,425 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -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 - - PRJ_ID = 3 - NUM_REV = 11 - - def setup - Setting.default_language = 'en' - User.current = nil - - @project = Project.find(PRJ_ID) - @repository = Repository::Subversion.create(:project => @project, - :url => self.class.subversion_repository_url) - assert @repository - 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 - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID - assert_response :success - 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_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 - - def test_browse_directory - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :show, :id => PRJ_ID, :path => repository_path_hash(['subversion_test'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entries) - assert_equal [ - '[folder_with_brackets]', 'folder', '.project', - 'helloworld.c', 'textfile.txt' - ], - assigns(:entries).collect(&:name) - entry = assigns(:entries).detect {|e| e.name == 'helloworld.c'} - assert_equal 'file', entry.kind - assert_equal 'subversion_test/helloworld.c', entry.path - assert_tag :a, :content => 'helloworld.c', :attributes => { :class => /text\-x\-c/ } - end - - def test_browse_at_given_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - 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) - assert_equal ['folder', '.project', 'helloworld.c', 'helloworld.rb', 'textfile.txt'], - assigns(:entries).collect(&:name) - end - - def test_file_changes - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['subversion_test', 'folder', 'helloworld.rb'])[:param] - assert_response :success - assert_template 'changes' - - changesets = assigns(:changesets) - assert_not_nil changesets - assert_equal %w(6 3 2), changesets.collect(&:revision) - - # 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 - end - - def test_directory_changes - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :changes, :id => PRJ_ID, - :path => repository_path_hash(['subversion_test', 'folder'])[:param] - assert_response :success - assert_template 'changes' - - changesets = assigns(:changesets) - assert_not_nil changesets - assert_equal %w(10 9 7 6 5 2), changesets.collect(&:revision) - end - - def test_entry - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] - assert_response :success - assert_template 'entry' - end - - def test_entry_should_send_if_too_big - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - 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 => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] - assert_response :success - 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 => 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 - assert_tag :tag => 'td', :attributes => { :class => /line-code/}, - :content => /Here's the code/ - end - - def test_entry_not_found - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - 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/ - end - - def test_entry_download - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :raw, :id => PRJ_ID, - :path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param] - assert_response :success - assert_equal 'attachment; filename="helloworld.c"', @response.headers['Content-Disposition'] - end - - def test_directory_entry - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :entry, :id => PRJ_ID, - :path => repository_path_hash(['subversion_test', 'folder'])[:param] - assert_response :success - assert_template 'show' - assert_not_nil assigns(:entry) - assert_equal 'folder', assigns(:entry).name - end - - # TODO: this test needs fixtures. - def test_revision - get :revision, :id => 1, :rev => 2 - assert_response :success - assert_template 'revision' - - 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 - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - get :revision, :id => PRJ_ID, :rev => 'something_weird' - assert_response 404 - assert_error_tag :content => /was not found/ - end - - def test_invalid_revision_diff - get :diff, :id => PRJ_ID, :rev => '1', :rev_to => 'something_weird' - assert_response 404 - assert_error_tag :content => /was not found/ - end - - def test_empty_revision - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['', ' ', nil].each do |r| - get :revision, :id => PRJ_ID, :rev => r - assert_response 404 - assert_error_tag :content => /was not found/ - end - end - - # TODO: this test needs fixtures. - 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') - - get :revision, :id => 1, :rev => 2 - assert_response :success - assert_template 'revision' - - 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 - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 3, :type => dt - assert_response :success - assert_template 'diff' - 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 - @project.reload - assert_equal NUM_REV, @repository.changesets.count - ['inline', 'sbs'].each do |dt| - get :diff, :id => PRJ_ID, :rev => 6, :rev_to => 2, - :path => repository_path_hash(['subversion_test', 'folder'])[:param], - :type => dt - assert_response :success - assert_template 'diff' - - 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 - end - - def test_annotate - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - 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 - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - @project.reload - assert_equal NUM_REV, @repository.changesets.count - 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/ - end - - def test_destroy_valid_repository - @request.session[:user_id] = 1 # admin - assert_equal 0, @repository.changesets.count - @repository.fetch_changesets - assert_equal NUM_REV, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - - def test_destroy_invalid_repository - @request.session[:user_id] = 1 # admin - @project.repository.destroy - @repository = Repository::Subversion.create!( - :project => @project, - :url => "file:///invalid") - @repository.fetch_changesets - assert_equal 0, @repository.changesets.count - - assert_difference 'Repository.count', -1 do - delete :destroy, :id => @repository.id - end - assert_response 302 - @project.reload - assert_nil @project.repository - end - else - puts "Subversion test repository NOT FOUND. Skipping functional tests !!!" - def test_fake; assert true end - end -end diff --git a/test/functional/roles_controller_test.rb b/test/functional/roles_controller_test.rb deleted file mode 100644 index 8bcbb2ea0..000000000 --- a/test/functional/roles_controller_test.rb +++ /dev/null @@ -1,216 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RolesControllerTest < ActionController::TestCase - fixtures :roles, :users, :members, :member_roles, :workflows, :trackers - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - - assert_not_nil assigns(:roles) - assert_equal Role.order('builtin, position').all, assigns(:roles) - - assert_tag :tag => 'a', :attributes => { :href => '/roles/1/edit' }, - :content => 'Manager' - end - - def test_new - get :new - assert_response :success - assert_template 'new' - end - - def test_new_with_copy - copy_from = Role.find(2) - - get :new, :copy => copy_from.id.to_s - assert_response :success - assert_template 'new' - - role = assigns(:role) - assert_equal copy_from.permissions, role.permissions - - assert_select 'form' do - # blank name - assert_select 'input[name=?][value=]', 'role[name]' - # edit_project permission checked - assert_select 'input[type=checkbox][name=?][value=edit_project][checked=checked]', 'role[permissions][]' - # add_project permission not checked - assert_select 'input[type=checkbox][name=?][value=add_project]', 'role[permissions][]' - assert_select 'input[type=checkbox][name=?][value=add_project][checked=checked]', 'role[permissions][]', 0 - # workflow copy selected - assert_select 'select[name=?]', 'copy_workflow_from' do - assert_select 'option[value=2][selected=selected]' - end - end - end - - def test_create_with_validaton_failure - post :create, :role => {:name => '', - :permissions => ['add_issues', 'edit_issues', 'log_time', ''], - :assignable => '0'} - - assert_response :success - assert_template 'new' - assert_tag :tag => 'div', :attributes => { :id => 'errorExplanation' } - end - - def test_create_without_workflow_copy - post :create, :role => {:name => 'RoleWithoutWorkflowCopy', - :permissions => ['add_issues', 'edit_issues', 'log_time', ''], - :assignable => '0'} - - assert_redirected_to '/roles' - role = Role.find_by_name('RoleWithoutWorkflowCopy') - assert_not_nil role - assert_equal [:add_issues, :edit_issues, :log_time], role.permissions - assert !role.assignable? - end - - def test_create_with_workflow_copy - post :create, :role => {:name => 'RoleWithWorkflowCopy', - :permissions => ['add_issues', 'edit_issues', 'log_time', ''], - :assignable => '0'}, - :copy_workflow_from => '1' - - assert_redirected_to '/roles' - role = Role.find_by_name('RoleWithWorkflowCopy') - assert_not_nil role - assert_equal Role.find(1).workflow_rules.size, role.workflow_rules.size - end - - def test_edit - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - assert_equal Role.find(1), assigns(:role) - assert_select 'select[name=?]', 'role[issues_visibility]' - end - - def test_edit_anonymous - get :edit, :id => Role.anonymous.id - assert_response :success - assert_template 'edit' - assert_select 'select[name=?]', 'role[issues_visibility]', 0 - end - - def test_edit_invalid_should_respond_with_404 - get :edit, :id => 999 - assert_response 404 - end - - def test_update - put :update, :id => 1, - :role => {:name => 'Manager', - :permissions => ['edit_project', ''], - :assignable => '0'} - - assert_redirected_to '/roles' - role = Role.find(1) - assert_equal [:edit_project], role.permissions - end - - def test_update_with_failure - put :update, :id => 1, :role => {:name => ''} - assert_response :success - assert_template 'edit' - end - - def test_destroy - r = Role.create!(:name => 'ToBeDestroyed', :permissions => [:view_wiki_pages]) - - delete :destroy, :id => r - assert_redirected_to '/roles' - assert_nil Role.find_by_id(r.id) - end - - def test_destroy_role_in_use - delete :destroy, :id => 1 - assert_redirected_to '/roles' - assert_equal 'This role is in use and cannot be deleted.', flash[:error] - assert_not_nil Role.find_by_id(1) - end - - def test_get_permissions - get :permissions - assert_response :success - assert_template 'permissions' - - assert_not_nil assigns(:roles) - assert_equal Role.order('builtin, position').all, assigns(:roles) - - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'permissions[3][]', - :value => 'add_issues', - :checked => 'checked' } - - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'permissions[3][]', - :value => 'delete_issues', - :checked => nil } - end - - def test_post_permissions - post :permissions, :permissions => { '0' => '', '1' => ['edit_issues'], '3' => ['add_issues', 'delete_issues']} - assert_redirected_to '/roles' - - assert_equal [:edit_issues], Role.find(1).permissions - assert_equal [:add_issues, :delete_issues], Role.find(3).permissions - assert Role.find(2).permissions.empty? - end - - def test_clear_all_permissions - post :permissions, :permissions => { '0' => '' } - assert_redirected_to '/roles' - assert Role.find(1).permissions.empty? - end - - def test_move_highest - put :update, :id => 3, :role => {:move_to => 'highest'} - assert_redirected_to '/roles' - assert_equal 1, Role.find(3).position - end - - def test_move_higher - position = Role.find(3).position - put :update, :id => 3, :role => {:move_to => 'higher'} - assert_redirected_to '/roles' - assert_equal position - 1, Role.find(3).position - end - - def test_move_lower - position = Role.find(2).position - put :update, :id => 2, :role => {:move_to => 'lower'} - assert_redirected_to '/roles' - assert_equal position + 1, Role.find(2).position - end - - def test_move_lowest - put :update, :id => 2, :role => {:move_to => 'lowest'} - assert_redirected_to '/roles' - assert_equal Role.count, Role.find(2).position - end -end diff --git a/test/functional/school_controller_test.rb b/test/functional/school_controller_test.rb deleted file mode 100644 index 43e69fe92..000000000 --- a/test/functional/school_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class SchoolControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/search_controller_test.rb b/test/functional/search_controller_test.rb deleted file mode 100644 index d292bbe75..000000000 --- a/test/functional/search_controller_test.rb +++ /dev/null @@ -1,265 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class SearchControllerTest < ActionController::TestCase - fixtures :projects, :enabled_modules, :roles, :users, :members, :member_roles, - :issues, :trackers, :issue_statuses, :enumerations, - :custom_fields, :custom_values, - :repositories, :changesets - - def setup - User.current = nil - end - - def test_search_for_projects - get :index - assert_response :success - assert_template 'index' - - get :index, :q => "cook" - assert_response :success - assert_template 'index' - assert assigns(:results).include?(Project.find(1)) - end - - def test_search_all_projects - get :index, :q => 'recipe subproject commit', :all_words => '' - assert_response :success - assert_template 'index' - - assert assigns(:results).include?(Issue.find(2)) - assert assigns(:results).include?(Issue.find(5)) - assert assigns(:results).include?(Changeset.find(101)) - assert_tag :dt, :attributes => { :class => /issue/ }, - :child => { :tag => 'a', :content => /Add ingredients categories/ }, - :sibling => { :tag => 'dd', :content => /should be classified by categories/ } - - assert assigns(:results_by_type).is_a?(Hash) - assert_equal 5, assigns(:results_by_type)['changesets'] - assert_tag :a, :content => 'Changesets (5)' - end - - def test_search_issues - get :index, :q => 'issue', :issues => 1 - assert_response :success - assert_template 'index' - - assert_equal true, assigns(:all_words) - assert_equal false, assigns(:titles_only) - assert assigns(:results).include?(Issue.find(8)) - assert assigns(:results).include?(Issue.find(5)) - assert_tag :dt, :attributes => { :class => /issue closed/ }, - :child => { :tag => 'a', :content => /Closed/ } - end - - def test_search_issues_should_search_notes - Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword') - - get :index, :q => 'searchkeyword', :issues => 1 - assert_response :success - assert_include Issue.find(2), assigns(:results) - end - - def test_search_issues_with_multiple_matches_in_journals_should_return_issue_once - Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword') - Journal.create!(:journalized => Issue.find(2), :notes => 'Issue notes with searchkeyword') - - get :index, :q => 'searchkeyword', :issues => 1 - assert_response :success - assert_include Issue.find(2), assigns(:results) - assert_equal 1, assigns(:results).size - end - - def test_search_issues_should_search_private_notes_with_permission_only - Journal.create!(:journalized => Issue.find(2), :notes => 'Private notes with searchkeyword', :private_notes => true) - @request.session[:user_id] = 2 - - Role.find(1).add_permission! :view_private_notes - get :index, :q => 'searchkeyword', :issues => 1 - assert_response :success - assert_include Issue.find(2), assigns(:results) - - Role.find(1).remove_permission! :view_private_notes - get :index, :q => 'searchkeyword', :issues => 1 - assert_response :success - assert_not_include Issue.find(2), assigns(:results) - end - - def test_search_all_projects_with_scope_param - get :index, :q => 'issue', :scope => 'all' - assert_response :success - assert_template 'index' - assert assigns(:results).present? - end - - def test_search_my_projects - @request.session[:user_id] = 2 - get :index, :id => 1, :q => 'recipe subproject', :scope => 'my_projects', :all_words => '' - assert_response :success - assert_template 'index' - assert assigns(:results).include?(Issue.find(1)) - assert !assigns(:results).include?(Issue.find(5)) - end - - def test_search_my_projects_without_memberships - # anonymous user has no memberships - get :index, :id => 1, :q => 'recipe subproject', :scope => 'my_projects', :all_words => '' - assert_response :success - assert_template 'index' - assert assigns(:results).empty? - end - - def test_search_project_and_subprojects - get :index, :id => 1, :q => 'recipe subproject', :scope => 'subprojects', :all_words => '' - assert_response :success - assert_template 'index' - assert assigns(:results).include?(Issue.find(1)) - assert assigns(:results).include?(Issue.find(5)) - end - - def test_search_without_searchable_custom_fields - CustomField.update_all "searchable = #{ActiveRecord::Base.connection.quoted_false}" - - get :index, :id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:project) - - get :index, :id => 1, :q => "can" - assert_response :success - assert_template 'index' - end - - def test_search_with_searchable_custom_fields - get :index, :id => 1, :q => "stringforcustomfield" - assert_response :success - results = assigns(:results) - assert_not_nil results - assert_equal 1, results.size - assert results.include?(Issue.find(7)) - end - - def test_search_all_words - # 'all words' is on by default - get :index, :id => 1, :q => 'recipe updating saving', :all_words => '1' - assert_equal true, assigns(:all_words) - results = assigns(:results) - assert_not_nil results - assert_equal 1, results.size - assert results.include?(Issue.find(3)) - end - - def test_search_one_of_the_words - get :index, :id => 1, :q => 'recipe updating saving', :all_words => '' - assert_equal false, assigns(:all_words) - results = assigns(:results) - assert_not_nil results - assert_equal 3, results.size - assert results.include?(Issue.find(3)) - end - - def test_search_titles_only_without_result - get :index, :id => 1, :q => 'recipe updating saving', :titles_only => '1' - results = assigns(:results) - assert_not_nil results - assert_equal 0, results.size - end - - def test_search_titles_only - get :index, :id => 1, :q => 'recipe', :titles_only => '1' - assert_equal true, assigns(:titles_only) - results = assigns(:results) - assert_not_nil results - assert_equal 2, results.size - end - - def test_search_content - Issue.update_all("description = 'This is a searchkeywordinthecontent'", "id=1") - - get :index, :id => 1, :q => 'searchkeywordinthecontent', :titles_only => '' - assert_equal false, assigns(:titles_only) - results = assigns(:results) - assert_not_nil results - assert_equal 1, results.size - end - - def test_search_with_offset - get :index, :q => 'coo', :offset => '20080806073000' - assert_response :success - results = assigns(:results) - assert results.any? - assert results.map(&:event_datetime).max < '20080806T073000'.to_time - end - - def test_search_previous_with_offset - get :index, :q => 'coo', :offset => '20080806073000', :previous => '1' - assert_response :success - results = assigns(:results) - assert results.any? - assert results.map(&:event_datetime).min >= '20080806T073000'.to_time - end - - def test_search_with_invalid_project_id - get :index, :id => 195, :q => 'recipe' - assert_response 404 - assert_nil assigns(:results) - end - - def test_quick_jump_to_issue - # issue of a public project - get :index, :q => "3" - assert_redirected_to '/issues/3' - - # issue of a private project - get :index, :q => "4" - assert_response :success - assert_template 'index' - end - - def test_large_integer - get :index, :q => '4615713488' - assert_response :success - assert_template 'index' - end - - def test_tokens_with_quotes - get :index, :id => 1, :q => '"good bye" hello "bye bye"' - assert_equal ["good bye", "hello", "bye bye"], assigns(:tokens) - end - - def test_results_should_be_escaped_once - assert Issue.find(1).update_attributes(:subject => ' escaped_once', :description => ' escaped_once') - get :index, :q => 'escaped_once' - assert_response :success - assert_select '#search-results' do - assert_select 'dt.issue a', :text => /<subject>/ - assert_select 'dd', :text => /<description>/ - end - end - - def test_keywords_should_be_highlighted - assert Issue.find(1).update_attributes(:subject => 'subject highlighted', :description => 'description highlighted') - get :index, :q => 'highlighted' - assert_response :success - assert_select '#search-results' do - assert_select 'dt.issue a span.highlight', :text => 'highlighted' - assert_select 'dd span.highlight', :text => 'highlighted' - end - end -end diff --git a/test/functional/sessions_test.rb b/test/functional/sessions_test.rb deleted file mode 100644 index 90aa24a17..000000000 --- a/test/functional/sessions_test.rb +++ /dev/null @@ -1,117 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class SessionStartTest < ActionController::TestCase - tests AccountController - - fixtures :users - - def test_login_should_set_session_timestamps - post :login, :username => 'jsmith', :password => 'jsmith' - assert_response 302 - assert_equal 2, session[:user_id] - assert_not_nil session[:ctime] - assert_not_nil session[:atime] - end -end - -class SessionsTest < ActionController::TestCase - tests WelcomeController - - fixtures :users - - def test_atime_from_user_session_should_be_updated - created = 2.hours.ago.utc.to_i - get :index, {}, {:user_id => 2, :ctime => created, :atime => created} - assert_response :success - assert_equal created, session[:ctime] - assert_not_equal created, session[:atime] - assert session[:atime] > created - end - - def test_user_session_should_not_be_reset_if_lifetime_and_timeout_disabled - with_settings :session_lifetime => '0', :session_timeout => '0' do - get :index, {}, {:user_id => 2} - assert_response :success - end - end - - def test_user_session_without_ctime_should_be_reset_if_lifetime_enabled - with_settings :session_lifetime => '720' do - get :index, {}, {:user_id => 2} - assert_redirected_to '/login' - end - end - - def test_user_session_with_expired_ctime_should_be_reset_if_lifetime_enabled - with_settings :session_timeout => '720' do - get :index, {}, {:user_id => 2, :atime => 2.days.ago.utc.to_i} - assert_redirected_to '/login' - end - end - - def test_user_session_with_valid_ctime_should_not_be_reset_if_lifetime_enabled - with_settings :session_timeout => '720' do - get :index, {}, {:user_id => 2, :atime => 3.hours.ago.utc.to_i} - assert_response :success - end - end - - def test_user_session_without_atime_should_be_reset_if_timeout_enabled - with_settings :session_timeout => '60' do - get :index, {}, {:user_id => 2} - assert_redirected_to '/login' - end - end - - def test_user_session_with_expired_atime_should_be_reset_if_timeout_enabled - with_settings :session_timeout => '60' do - get :index, {}, {:user_id => 2, :atime => 4.hours.ago.utc.to_i} - assert_redirected_to '/login' - end - end - - def test_user_session_with_valid_atime_should_not_be_reset_if_timeout_enabled - with_settings :session_timeout => '60' do - get :index, {}, {:user_id => 2, :atime => 10.minutes.ago.utc.to_i} - assert_response :success - end - end - - def test_expired_user_session_should_be_restarted_if_autologin - with_settings :session_lifetime => '720', :session_timeout => '60', :autologin => 7 do - token = Token.create!(:user_id => 2, :action => 'autologin', :created_on => 1.day.ago) - @request.cookies['autologin'] = token.value - created = 2.hours.ago.utc.to_i - - get :index, {}, {:user_id => 2, :ctime => created, :atime => created} - assert_equal 2, session[:user_id] - assert_response :success - assert_not_equal created, session[:ctime] - assert session[:ctime] >= created - end - end - - def test_anonymous_session_should_not_be_reset - with_settings :session_lifetime => '720', :session_timeout => '60' do - get :index - assert_response :success - end - end -end diff --git a/test/functional/settings_controller_test.rb b/test/functional/settings_controller_test.rb deleted file mode 100644 index 4c49a3275..000000000 --- a/test/functional/settings_controller_test.rb +++ /dev/null @@ -1,131 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class SettingsControllerTest < ActionController::TestCase - fixtures :users - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'edit' - end - - def test_get_edit - get :edit - assert_response :success - assert_template 'edit' - - assert_tag 'input', :attributes => {:name => 'settings[enabled_scm][]', :value => ''} - end - - def test_get_edit_should_preselect_default_issue_list_columns - with_settings :issue_list_default_columns => %w(tracker subject status updated_on) do - get :edit - assert_response :success - end - - assert_select 'select[id=selected_columns][name=?]', 'settings[issue_list_default_columns][]' do - assert_select 'option', 4 - assert_select 'option[value=tracker]', :text => 'Tracker' - assert_select 'option[value=subject]', :text => 'Subject' - assert_select 'option[value=status]', :text => 'Status' - assert_select 'option[value=updated_on]', :text => 'Updated' - end - - assert_select 'select[id=available_columns]' do - assert_select 'option[value=tracker]', 0 - assert_select 'option[value=priority]', :text => 'Priority' - end - end - - def test_get_edit_without_trackers_should_succeed - Tracker.delete_all - - get :edit - assert_response :success - end - - def test_post_edit_notifications - post :edit, :settings => {:mail_from => 'functional@test.foo', - :bcc_recipients => '0', - :notified_events => %w(issue_added issue_updated news_added), - :emails_footer => 'Test footer' - } - assert_redirected_to '/settings' - assert_equal 'functional@test.foo', Setting.mail_from - assert !Setting.bcc_recipients? - assert_equal %w(issue_added issue_updated news_added), Setting.notified_events - assert_equal 'Test footer', Setting.emails_footer - Setting.clear_cache - end - - def test_get_plugin_settings - Setting.stubs(:plugin_foo).returns({'sample_setting' => 'Plugin setting value'}) - ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins")) - Redmine::Plugin.register :foo do - settings :partial => "foo_plugin/foo_plugin_settings" - end - - get :plugin, :id => 'foo' - assert_response :success - assert_template 'plugin' - assert_tag 'form', :attributes => {:action => '/settings/plugin/foo'}, - :descendant => {:tag => 'input', :attributes => {:name => 'settings[sample_setting]', :value => 'Plugin setting value'}} - - Redmine::Plugin.clear - end - - def test_get_invalid_plugin_settings - get :plugin, :id => 'none' - assert_response 404 - end - - def test_get_non_configurable_plugin_settings - Redmine::Plugin.register(:foo) {} - - get :plugin, :id => 'foo' - assert_response 404 - - Redmine::Plugin.clear - end - - def test_post_plugin_settings - Setting.expects(:plugin_foo=).with({'sample_setting' => 'Value'}).returns(true) - Redmine::Plugin.register(:foo) do - settings :partial => 'not blank' # so that configurable? is true - end - - post :plugin, :id => 'foo', :settings => {'sample_setting' => 'Value'} - assert_redirected_to '/settings/plugin/foo' - end - - def test_post_non_configurable_plugin_settings - Redmine::Plugin.register(:foo) {} - - post :plugin, :id => 'foo', :settings => {'sample_setting' => 'Value'} - assert_response 404 - - Redmine::Plugin.clear - end -end diff --git a/test/functional/softapplications_controller_test.rb b/test/functional/softapplications_controller_test.rb deleted file mode 100644 index 8c5611cb9..000000000 --- a/test/functional/softapplications_controller_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -require 'test_helper' - -class SoftapplicationsControllerTest < ActionController::TestCase - setup do - @softapplication = softapplications(:one) - end - - test "should get index" do - get :index - assert_response :success - assert_not_nil assigns(:softapplications) - end - - test "should get new" do - get :new - assert_response :success - end - - test "should create softapplication" do - assert_difference('Softapplication.count') do - post :create, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id } - end - - assert_redirected_to softapplication_path(assigns(:softapplication)) - end - - test "should show softapplication" do - get :show, id: @softapplication - assert_response :success - end - - test "should get edit" do - get :edit, id: @softapplication - assert_response :success - end - - test "should update softapplication" do - put :update, id: @softapplication, softapplication: { android_min_version_available: @softapplication.android_min_version_available, app_type_id: @softapplication.app_type_id, app_type_name: @softapplication.app_type_name, description: @softapplication.description, name: @softapplication.name, user_id: @softapplication.user_id } - assert_redirected_to softapplication_path(assigns(:softapplication)) - end - - test "should destroy softapplication" do - assert_difference('Softapplication.count', -1) do - delete :destroy, id: @softapplication - end - - assert_redirected_to softapplications_path - end -end diff --git a/test/functional/sys_controller_test.rb b/test/functional/sys_controller_test.rb deleted file mode 100644 index 7a113ae0e..000000000 --- a/test/functional/sys_controller_test.rb +++ /dev/null @@ -1,125 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class SysControllerTest < ActionController::TestCase - fixtures :projects, :repositories, :enabled_modules - - def setup - Setting.sys_api_enabled = '1' - Setting.enabled_scm = %w(Subversion Git) - end - - def teardown - Setting.clear_cache - end - - def test_projects_with_repository_enabled - get :projects - assert_response :success - assert_equal 'application/xml', @response.content_type - with_options :tag => 'projects' do |test| - test.assert_tag :children => { :count => Project.active.has_module(:repository).count } - test.assert_tag 'project', :child => {:tag => 'identifier', :sibling => {:tag => 'is-public'}} - end - assert_no_tag 'extra-info' - assert_no_tag 'extra_info' - end - - def test_create_project_repository - assert_nil Project.find(4).repository - - post :create_project_repository, :id => 4, - :vendor => 'Subversion', - :repository => { :url => 'file:///create/project/repository/subproject2'} - assert_response :created - assert_equal 'application/xml', @response.content_type - - r = Project.find(4).repository - assert r.is_a?(Repository::Subversion) - assert_equal 'file:///create/project/repository/subproject2', r.url - - assert_tag 'repository-subversion', - :child => { - :tag => 'id', :content => r.id.to_s, - :sibling => {:tag => 'url', :content => r.url} - } - assert_no_tag 'extra-info' - assert_no_tag 'extra_info' - end - - def test_create_already_existing - post :create_project_repository, :id => 1, - :vendor => 'Subversion', - :repository => { :url => 'file:///create/project/repository/subproject2'} - - assert_response :conflict - end - - def test_create_with_failure - post :create_project_repository, :id => 4, - :vendor => 'Subversion', - :repository => { :url => 'invalid url'} - - assert_response :unprocessable_entity - end - - def test_fetch_changesets - Repository::Subversion.any_instance.expects(:fetch_changesets).twice.returns(true) - get :fetch_changesets - assert_response :success - end - - def test_fetch_changesets_one_project_by_identifier - Repository::Subversion.any_instance.expects(:fetch_changesets).once.returns(true) - get :fetch_changesets, :id => 'ecookbook' - assert_response :success - end - - def test_fetch_changesets_one_project_by_id - Repository::Subversion.any_instance.expects(:fetch_changesets).once.returns(true) - get :fetch_changesets, :id => '1' - assert_response :success - end - - def test_fetch_changesets_unknown_project - get :fetch_changesets, :id => 'unknown' - assert_response 404 - end - - def test_disabled_ws_should_respond_with_403_error - with_settings :sys_api_enabled => '0' do - get :projects - assert_response 403 - end - end - - def test_api_key - with_settings :sys_api_key => 'my_secret_key' do - get :projects, :key => 'my_secret_key' - assert_response :success - end - end - - def test_wrong_key_should_respond_with_403_error - with_settings :sys_api_enabled => 'my_secret_key' do - get :projects, :key => 'wrong_key' - assert_response 403 - end - end -end diff --git a/test/functional/test_controller_test.rb b/test/functional/test_controller_test.rb deleted file mode 100644 index c262ffe53..000000000 --- a/test/functional/test_controller_test.rb +++ /dev/null @@ -1,13 +0,0 @@ -require 'test_helper' - -class TestControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end - test "get test index error" do - @request.env["REQUEST_URI"] = "" - get :index - assert_template :index - # assert_template layout: "layouts/base", partial: ["layouts/base_header","_base_header", 'layouts/base_footer', "_base_footer",] - end -end diff --git a/test/functional/time_entry_reports_controller_test.rb b/test/functional/time_entry_reports_controller_test.rb deleted file mode 100644 index 751e84592..000000000 --- a/test/functional/time_entry_reports_controller_test.rb +++ /dev/null @@ -1,372 +0,0 @@ -# -*- coding: utf-8 -*- -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class TimeEntryReportsControllerTest < ActionController::TestCase - tests TimelogController - - fixtures :projects, :enabled_modules, :roles, :members, :member_roles, - :issues, :time_entries, :users, :trackers, :enumerations, - :issue_statuses, :custom_fields, :custom_values - - include Redmine::I18n - - def setup - Setting.default_language = "en" - end - - def test_report_at_project_level - get :report, :project_id => 'ecookbook' - assert_response :success - assert_template 'report' - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/time_entries/report", :id => 'query_form'} - end - - def test_report_all_projects - get :report - assert_response :success - assert_template 'report' - assert_tag :form, - :attributes => {:action => "/time_entries/report", :id => 'query_form'} - end - - def test_report_all_projects_denied - r = Role.anonymous - r.permissions.delete(:view_time_entries) - r.permissions_will_change! - r.save - get :report - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftime_entries%2Freport' - end - - def test_report_all_projects_one_criteria - get :report, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criteria => ['project'] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "8.65", "%.2f" % assigns(:report).total_hours - end - - def test_report_all_time - get :report, :project_id => 1, :criteria => ['project', 'issue'] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "162.90", "%.2f" % assigns(:report).total_hours - end - - def test_report_all_time_by_day - get :report, :project_id => 1, :criteria => ['project', 'issue'], :columns => 'day' - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "162.90", "%.2f" % assigns(:report).total_hours - assert_tag :tag => 'th', :content => '2007-03-12' - end - - def test_report_one_criteria - get :report, :project_id => 1, :columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criteria => ['project'] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "8.65", "%.2f" % assigns(:report).total_hours - end - - def test_report_two_criteria - get :report, :project_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criteria => ["user", "activity"] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "162.90", "%.2f" % assigns(:report).total_hours - end - - def test_report_custom_field_criteria_with_multiple_values - field = TimeEntryCustomField.create!(:name => 'multi', :field_format => 'list', :possible_values => ['value1', 'value2']) - entry = TimeEntry.create!(:project => Project.find(1), :hours => 1, :activity_id => 10, :user => User.find(2), :spent_on => Date.today) - CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value1') - CustomValue.create!(:customized => entry, :custom_field => field, :value => 'value2') - - get :report, :project_id => 1, :columns => 'day', :criteria => ["cf_#{field.id}"] - assert_response :success - end - - def test_report_one_day - get :report, :project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["user", "activity"] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "4.25", "%.2f" % assigns(:report).total_hours - end - - def test_report_at_issue_level - get :report, :project_id => 1, :issue_id => 1, :columns => 'month', :from => "2007-01-01", :to => "2007-12-31", :criteria => ["user", "activity"] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "154.25", "%.2f" % assigns(:report).total_hours - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/issues/1/time_entries/report", :id => 'query_form'} - end - - def test_report_by_week_should_use_commercial_year - TimeEntry.delete_all - TimeEntry.generate!(:hours => '2', :spent_on => '2009-12-25') # 2009-52 - TimeEntry.generate!(:hours => '4', :spent_on => '2009-12-31') # 2009-53 - TimeEntry.generate!(:hours => '8', :spent_on => '2010-01-01') # 2009-53 - TimeEntry.generate!(:hours => '16', :spent_on => '2010-01-05') # 2010-1 - - get :report, :columns => 'week', :from => "2009-12-25", :to => "2010-01-05", :criteria => ["project"] - assert_response :success - - assert_select '#time-report thead tr' do - assert_select 'th:nth-child(1)', :text => 'Project' - assert_select 'th:nth-child(2)', :text => '2009-52' - assert_select 'th:nth-child(3)', :text => '2009-53' - assert_select 'th:nth-child(4)', :text => '2010-1' - assert_select 'th:nth-child(5)', :text => 'Total time' - end - assert_select '#time-report tbody tr' do - assert_select 'td:nth-child(1)', :text => 'eCookbook' - assert_select 'td:nth-child(2)', :text => '2.00' - assert_select 'td:nth-child(3)', :text => '12.00' - assert_select 'td:nth-child(4)', :text => '16.00' - assert_select 'td:nth-child(5)', :text => '30.00' # Total - end - end - - def test_report_should_propose_association_custom_fields - get :report - assert_response :success - assert_template 'report' - - assert_select 'select[name=?]', 'criteria[]' do - assert_select 'option[value=cf_1]', {:text => 'Database'}, 'Issue custom field not found' - assert_select 'option[value=cf_3]', {:text => 'Development status'}, 'Project custom field not found' - assert_select 'option[value=cf_7]', {:text => 'Billable'}, 'TimeEntryActivity custom field not found' - end - end - - def test_report_with_association_custom_fields - get :report, :criteria => ['cf_1', 'cf_3', 'cf_7'] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal 3, assigns(:report).criteria.size - assert_equal "162.90", "%.2f" % assigns(:report).total_hours - - # Custom fields columns - assert_select 'th', :text => 'Database' - assert_select 'th', :text => 'Development status' - assert_select 'th', :text => 'Billable' - - # Custom field row - assert_select 'tr' do - assert_select 'td', :text => 'MySQL' - assert_select 'td.hours', :text => '1.00' - end - end - - def test_report_one_criteria_no_result - get :report, :project_id => 1, :columns => 'week', :from => "1998-04-01", :to => "1998-04-30", :criteria => ['project'] - assert_response :success - assert_template 'report' - assert_not_nil assigns(:report) - assert_equal "0.00", "%.2f" % assigns(:report).total_hours - end - - def test_report_status_criterion - get :report, :project_id => 1, :criteria => ['status'] - assert_response :success - assert_template 'report' - assert_tag :tag => 'th', :content => 'Status' - assert_tag :tag => 'td', :content => 'New' - end - - def test_report_all_projects_csv_export - get :report, :columns => 'month', :from => "2007-01-01", :to => "2007-06-30", - :criteria => ["project", "user", "activity"], :format => "csv" - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - # Headers - assert_equal 'Project,User,Activity,2007-3,2007-4,Total time', lines.first - # Total row - assert_equal 'Total time,"","",154.25,8.65,162.90', lines.last - end - - def test_report_csv_export - get :report, :project_id => 1, :columns => 'month', - :from => "2007-01-01", :to => "2007-06-30", - :criteria => ["project", "user", "activity"], :format => "csv" - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - # Headers - assert_equal 'Project,User,Activity,2007-3,2007-4,Total time', lines.first - # Total row - assert_equal 'Total time,"","",154.25,8.65,162.90', lines.last - end - - def test_csv_big_5 - Setting.default_language = "zh-TW" - str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88" - str_big5 = "\xa4@\xa4\xeb" - if str_utf8.respond_to?(:force_encoding) - str_utf8.force_encoding('UTF-8') - str_big5.force_encoding('Big5') - end - user = User.find_by_id(3) - user.firstname = str_utf8 - user.lastname = "test-lastname" - assert user.save - comments = "test_csv_big_5" - te1 = TimeEntry.create(:spent_on => '2011-11-11', - :hours => 7.3, - :project => Project.find(1), - :user => user, - :activity => TimeEntryActivity.find_by_name('Design'), - :comments => comments) - - te2 = TimeEntry.find_by_comments(comments) - assert_not_nil te2 - assert_equal 7.3, te2.hours - assert_equal 3, te2.user_id - - get :report, :project_id => 1, :columns => 'day', - :from => "2011-11-11", :to => "2011-11-11", - :criteria => ["user"], :format => "csv" - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - # Headers - s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xc1`\xadp" - s2 = "\xc1`\xadp" - if s1.respond_to?(:force_encoding) - s1.force_encoding('Big5') - s2.force_encoding('Big5') - end - assert_equal s1, lines.first - # Total row - assert_equal "#{str_big5} #{user.lastname},7.30,7.30", lines[1] - assert_equal "#{s2},7.30,7.30", lines[2] - - str_tw = "Traditional Chinese (\xe7\xb9\x81\xe9\xab\x94\xe4\xb8\xad\xe6\x96\x87)" - if str_tw.respond_to?(:force_encoding) - str_tw.force_encoding('UTF-8') - end - assert_equal str_tw, l(:general_lang_name) - assert_equal 'Big5', l(:general_csv_encoding) - assert_equal ',', l(:general_csv_separator) - assert_equal '.', l(:general_csv_decimal_separator) - end - - def test_csv_cannot_convert_should_be_replaced_big_5 - Setting.default_language = "zh-TW" - str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85" - if str_utf8.respond_to?(:force_encoding) - str_utf8.force_encoding('UTF-8') - end - user = User.find_by_id(3) - user.firstname = str_utf8 - user.lastname = "test-lastname" - assert user.save - comments = "test_replaced" - te1 = TimeEntry.create(:spent_on => '2011-11-11', - :hours => 7.3, - :project => Project.find(1), - :user => user, - :activity => TimeEntryActivity.find_by_name('Design'), - :comments => comments) - - te2 = TimeEntry.find_by_comments(comments) - assert_not_nil te2 - assert_equal 7.3, te2.hours - assert_equal 3, te2.user_id - - get :report, :project_id => 1, :columns => 'day', - :from => "2011-11-11", :to => "2011-11-11", - :criteria => ["user"], :format => "csv" - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - # Headers - s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xc1`\xadp" - if s1.respond_to?(:force_encoding) - s1.force_encoding('Big5') - end - assert_equal s1, lines.first - # Total row - s2 = "" - if s2.respond_to?(:force_encoding) - s2 = "\xa5H?" - s2.force_encoding('Big5') - elsif RUBY_PLATFORM == 'java' - s2 = "??" - else - s2 = "\xa5H???" - end - assert_equal "#{s2} #{user.lastname},7.30,7.30", lines[1] - end - - def test_csv_fr - with_settings :default_language => "fr" do - str1 = "test_csv_fr" - user = User.find_by_id(3) - te1 = TimeEntry.create(:spent_on => '2011-11-11', - :hours => 7.3, - :project => Project.find(1), - :user => user, - :activity => TimeEntryActivity.find_by_name('Design'), - :comments => str1) - - te2 = TimeEntry.find_by_comments(str1) - assert_not_nil te2 - assert_equal 7.3, te2.hours - assert_equal 3, te2.user_id - - get :report, :project_id => 1, :columns => 'day', - :from => "2011-11-11", :to => "2011-11-11", - :criteria => ["user"], :format => "csv" - assert_response :success - assert_equal 'text/csv; header=present', @response.content_type - lines = @response.body.chomp.split("\n") - # Headers - s1 = "Utilisateur;2011-11-11;Temps total" - s2 = "Temps total" - if s1.respond_to?(:force_encoding) - s1.force_encoding('ISO-8859-1') - s2.force_encoding('ISO-8859-1') - end - assert_equal s1, lines.first - # Total row - assert_equal "#{user.firstname} #{user.lastname};7,30;7,30", lines[1] - assert_equal "#{s2};7,30;7,30", lines[2] - - str_fr = "Fran\xc3\xa7ais" - if str_fr.respond_to?(:force_encoding) - str_fr.force_encoding('UTF-8') - end - assert_equal str_fr, l(:general_lang_name) - assert_equal 'ISO-8859-1', l(:general_csv_encoding) - assert_equal ';', l(:general_csv_separator) - assert_equal ',', l(:general_csv_decimal_separator) - end - end -end diff --git a/test/functional/timelog_controller_test.rb b/test/functional/timelog_controller_test.rb deleted file mode 100644 index a5bd2046a..000000000 --- a/test/functional/timelog_controller_test.rb +++ /dev/null @@ -1,604 +0,0 @@ -# -*- coding: utf-8 -*- -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class TimelogControllerTest < ActionController::TestCase - fixtures :projects, :enabled_modules, :roles, :members, - :member_roles, :issues, :time_entries, :users, - :trackers, :enumerations, :issue_statuses, - :custom_fields, :custom_values, - :projects_trackers, :custom_fields_trackers, - :custom_fields_projects - - include Redmine::I18n - - def test_new_with_project_id - @request.session[:user_id] = 3 - get :new, :project_id => 1 - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'time_entry[project_id]', 0 - assert_select 'input[name=?][value=1][type=hidden]', 'time_entry[project_id]' - end - - def test_new_with_issue_id - @request.session[:user_id] = 3 - get :new, :issue_id => 2 - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'time_entry[project_id]', 0 - assert_select 'input[name=?][value=1][type=hidden]', 'time_entry[project_id]' - end - - def test_new_without_project - @request.session[:user_id] = 3 - get :new - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'time_entry[project_id]' - assert_select 'input[name=?]', 'time_entry[project_id]', 0 - end - - def test_new_without_project_should_prefill_the_form - @request.session[:user_id] = 3 - get :new, :time_entry => {:project_id => '1'} - assert_response :success - assert_template 'new' - assert_select 'select[name=?]', 'time_entry[project_id]' do - assert_select 'option[value=1][selected=selected]' - end - assert_select 'input[name=?]', 'time_entry[project_id]', 0 - end - - def test_new_without_project_should_deny_without_permission - Role.all.each {|role| role.remove_permission! :log_time} - @request.session[:user_id] = 3 - - get :new - assert_response 403 - end - - def test_new_should_select_default_activity - @request.session[:user_id] = 3 - get :new, :project_id => 1 - assert_response :success - assert_select 'select[name=?]', 'time_entry[activity_id]' do - assert_select 'option[selected=selected]', :text => 'Development' - end - end - - def test_new_should_only_show_active_time_entry_activities - @request.session[:user_id] = 3 - get :new, :project_id => 1 - assert_response :success - assert_no_tag 'option', :content => 'Inactive Activity' - end - - def test_get_edit_existing_time - @request.session[:user_id] = 2 - get :edit, :id => 2, :project_id => nil - assert_response :success - assert_template 'edit' - # Default activity selected - assert_tag :tag => 'form', :attributes => { :action => '/projects/ecookbook/time_entries/2' } - end - - def test_get_edit_with_an_existing_time_entry_with_inactive_activity - te = TimeEntry.find(1) - te.activity = TimeEntryActivity.find_by_name("Inactive Activity") - te.save! - - @request.session[:user_id] = 1 - get :edit, :project_id => 1, :id => 1 - assert_response :success - assert_template 'edit' - # Blank option since nothing is pre-selected - assert_tag :tag => 'option', :content => '--- Please select ---' - end - - def test_post_create - # TODO: should POST to issues’ time log instead of project. change form - # and routing - @request.session[:user_id] = 3 - post :create, :project_id => 1, - :time_entry => {:comments => 'Some work on TimelogControllerTest', - # Not the default activity - :activity_id => '11', - :spent_on => '2008-03-14', - :issue_id => '1', - :hours => '7.3'} - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - - i = Issue.find(1) - t = TimeEntry.find_by_comments('Some work on TimelogControllerTest') - assert_not_nil t - assert_equal 11, t.activity_id - assert_equal 7.3, t.hours - assert_equal 3, t.user_id - assert_equal i, t.issue - assert_equal i.project, t.project - end - - def test_post_create_with_blank_issue - # TODO: should POST to issues’ time log instead of project. change form - # and routing - @request.session[:user_id] = 3 - post :create, :project_id => 1, - :time_entry => {:comments => 'Some work on TimelogControllerTest', - # Not the default activity - :activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'} - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - - t = TimeEntry.find_by_comments('Some work on TimelogControllerTest') - assert_not_nil t - assert_equal 11, t.activity_id - assert_equal 7.3, t.hours - assert_equal 3, t.user_id - end - - def test_create_and_continue - @request.session[:user_id] = 2 - post :create, :project_id => 1, - :time_entry => {:activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'}, - :continue => '1' - assert_redirected_to '/projects/ecookbook/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=' - end - - def test_create_and_continue_with_issue_id - @request.session[:user_id] = 2 - post :create, :project_id => 1, - :time_entry => {:activity_id => '11', - :issue_id => '1', - :spent_on => '2008-03-14', - :hours => '7.3'}, - :continue => '1' - assert_redirected_to '/projects/ecookbook/issues/1/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=1' - end - - def test_create_and_continue_without_project - @request.session[:user_id] = 2 - post :create, :time_entry => {:project_id => '1', - :activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'}, - :continue => '1' - - assert_redirected_to '/time_entries/new?time_entry%5Bactivity_id%5D=11&time_entry%5Bissue_id%5D=&time_entry%5Bproject_id%5D=1' - end - - def test_create_without_log_time_permission_should_be_denied - @request.session[:user_id] = 2 - Role.find_by_name('Manager').remove_permission! :log_time - post :create, :project_id => 1, - :time_entry => {:activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'} - - assert_response 403 - end - - def test_create_with_failure - @request.session[:user_id] = 2 - post :create, :project_id => 1, - :time_entry => {:activity_id => '', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'} - - assert_response :success - assert_template 'new' - end - - def test_create_without_project - @request.session[:user_id] = 2 - assert_difference 'TimeEntry.count' do - post :create, :time_entry => {:project_id => '1', - :activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'} - end - - assert_redirected_to '/projects/ecookbook/time_entries' - time_entry = TimeEntry.first(:order => 'id DESC') - assert_equal 1, time_entry.project_id - end - - def test_create_without_project_should_fail_with_issue_not_inside_project - @request.session[:user_id] = 2 - assert_no_difference 'TimeEntry.count' do - post :create, :time_entry => {:project_id => '1', - :activity_id => '11', - :issue_id => '5', - :spent_on => '2008-03-14', - :hours => '7.3'} - end - - assert_response :success - assert assigns(:time_entry).errors[:issue_id].present? - end - - def test_create_without_project_should_deny_without_permission - @request.session[:user_id] = 2 - Project.find(3).disable_module!(:time_tracking) - - assert_no_difference 'TimeEntry.count' do - post :create, :time_entry => {:project_id => '3', - :activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => '7.3'} - end - - assert_response 403 - end - - def test_create_without_project_with_failure - @request.session[:user_id] = 2 - assert_no_difference 'TimeEntry.count' do - post :create, :time_entry => {:project_id => '1', - :activity_id => '11', - :issue_id => '', - :spent_on => '2008-03-14', - :hours => ''} - end - - assert_response :success - assert_tag 'select', :attributes => {:name => 'time_entry[project_id]'}, - :child => {:tag => 'option', :attributes => {:value => '1', :selected => 'selected'}} - end - - def test_update - entry = TimeEntry.find(1) - assert_equal 1, entry.issue_id - assert_equal 2, entry.user_id - - @request.session[:user_id] = 1 - put :update, :id => 1, - :time_entry => {:issue_id => '2', - :hours => '8'} - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - entry.reload - - assert_equal 8, entry.hours - assert_equal 2, entry.issue_id - assert_equal 2, entry.user_id - end - - def test_get_bulk_edit - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2] - assert_response :success - assert_template 'bulk_edit' - - assert_select 'ul#bulk-selection' do - assert_select 'li', 2 - assert_select 'li a', :text => '03/23/2007 - eCookbook: 4.25 hours' - end - - assert_select 'form#bulk_edit_form[action=?]', '/time_entries/bulk_update' do - # System wide custom field - assert_select 'select[name=?]', 'time_entry[custom_field_values][10]' - - # Activities - assert_select 'select[name=?]', 'time_entry[activity_id]' do - assert_select 'option[value=]', :text => '(No change)' - assert_select 'option[value=9]', :text => 'Design' - end - end - end - - def test_get_bulk_edit_on_different_projects - @request.session[:user_id] = 2 - get :bulk_edit, :ids => [1, 2, 6] - assert_response :success - assert_template 'bulk_edit' - end - - def test_bulk_update - @request.session[:user_id] = 2 - # update time entry activity - post :bulk_update, :ids => [1, 2], :time_entry => { :activity_id => 9} - - assert_response 302 - # check that the issues were updated - assert_equal [9, 9], TimeEntry.find_all_by_id([1, 2]).collect {|i| i.activity_id} - end - - def test_bulk_update_with_failure - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :time_entry => { :hours => 'A'} - - assert_response 302 - assert_match /Failed to save 2 time entrie/, flash[:error] - end - - def test_bulk_update_on_different_projects - @request.session[:user_id] = 2 - # makes user a manager on the other project - Member.create!(:user_id => 2, :project_id => 3, :role_ids => [1]) - - # update time entry activity - post :bulk_update, :ids => [1, 2, 4], :time_entry => { :activity_id => 9 } - - assert_response 302 - # check that the issues were updated - assert_equal [9, 9, 9], TimeEntry.find_all_by_id([1, 2, 4]).collect {|i| i.activity_id} - end - - def test_bulk_update_on_different_projects_without_rights - @request.session[:user_id] = 3 - user = User.find(3) - action = { :controller => "timelog", :action => "bulk_update" } - assert user.allowed_to?(action, TimeEntry.find(1).project) - assert ! user.allowed_to?(action, TimeEntry.find(5).project) - post :bulk_update, :ids => [1, 5], :time_entry => { :activity_id => 9 } - assert_response 403 - end - - def test_bulk_update_custom_field - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1, 2], :time_entry => { :custom_field_values => {'10' => '0'} } - - assert_response 302 - assert_equal ["0", "0"], TimeEntry.find_all_by_id([1, 2]).collect {|i| i.custom_value_for(10).value} - end - - def test_post_bulk_update_should_redirect_back_using_the_back_url_parameter - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1,2], :back_url => '/time_entries' - - assert_response :redirect - assert_redirected_to '/time_entries' - end - - def test_post_bulk_update_should_not_redirect_back_using_the_back_url_parameter_off_the_host - @request.session[:user_id] = 2 - post :bulk_update, :ids => [1,2], :back_url => 'http://google.com' - - assert_response :redirect - assert_redirected_to :controller => 'timelog', :action => 'index', :project_id => Project.find(1).identifier - end - - def test_post_bulk_update_without_edit_permission_should_be_denied - @request.session[:user_id] = 2 - Role.find_by_name('Manager').remove_permission! :edit_time_entries - post :bulk_update, :ids => [1,2] - - assert_response 403 - end - - def test_destroy - @request.session[:user_id] = 2 - delete :destroy, :id => 1 - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_equal I18n.t(:notice_successful_delete), flash[:notice] - assert_nil TimeEntry.find_by_id(1) - end - - def test_destroy_should_fail - # simulate that this fails (e.g. due to a plugin), see #5700 - TimeEntry.any_instance.expects(:destroy).returns(false) - - @request.session[:user_id] = 2 - delete :destroy, :id => 1 - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_equal I18n.t(:notice_unable_delete_time_entry), flash[:error] - assert_not_nil TimeEntry.find_by_id(1) - end - - def test_index_all_projects - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:total_hours) - assert_equal "162.90", "%.2f" % assigns(:total_hours) - assert_tag :form, - :attributes => {:action => "/time_entries", :id => 'query_form'} - end - - def test_index_all_projects_should_show_log_time_link - @request.session[:user_id] = 2 - get :index - assert_response :success - assert_template 'index' - assert_tag 'a', :attributes => {:href => '/time_entries/new'}, :content => /Log time/ - end - - def test_index_at_project_level - get :index, :project_id => 'ecookbook' - assert_response :success - assert_template 'index' - assert_not_nil assigns(:entries) - assert_equal 4, assigns(:entries).size - # project and subproject - assert_equal [1, 3], assigns(:entries).collect(&:project_id).uniq.sort - assert_not_nil assigns(:total_hours) - assert_equal "162.90", "%.2f" % assigns(:total_hours) - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'} - end - - def test_index_at_project_level_with_date_range - get :index, :project_id => 'ecookbook', - :f => ['spent_on'], - :op => {'spent_on' => '><'}, - :v => {'spent_on' => ['2007-03-20', '2007-04-30']} - assert_response :success - assert_template 'index' - assert_not_nil assigns(:entries) - assert_equal 3, assigns(:entries).size - assert_not_nil assigns(:total_hours) - assert_equal "12.90", "%.2f" % assigns(:total_hours) - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'} - end - - def test_index_at_project_level_with_date_range_using_from_and_to_params - get :index, :project_id => 'ecookbook', :from => '2007-03-20', :to => '2007-04-30' - assert_response :success - assert_template 'index' - assert_not_nil assigns(:entries) - assert_equal 3, assigns(:entries).size - assert_not_nil assigns(:total_hours) - assert_equal "12.90", "%.2f" % assigns(:total_hours) - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'} - end - - def test_index_at_project_level_with_period - get :index, :project_id => 'ecookbook', - :f => ['spent_on'], - :op => {'spent_on' => '>t-'}, - :v => {'spent_on' => ['7']} - assert_response :success - assert_template 'index' - assert_not_nil assigns(:entries) - assert_not_nil assigns(:total_hours) - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/time_entries", :id => 'query_form'} - end - - def test_index_at_issue_level - get :index, :issue_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:entries) - assert_equal 2, assigns(:entries).size - assert_not_nil assigns(:total_hours) - assert_equal 154.25, assigns(:total_hours) - # display all time - assert_nil assigns(:from) - assert_nil assigns(:to) - # TODO: remove /projects/:project_id/issues/:issue_id/time_entries routes - # to use /issues/:issue_id/time_entries - assert_tag :form, - :attributes => {:action => "/projects/ecookbook/issues/1/time_entries", :id => 'query_form'} - end - - def test_index_should_sort_by_spent_on_and_created_on - t1 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:00:00', :activity_id => 10) - t2 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-16', :created_on => '2012-06-16 20:05:00', :activity_id => 10) - t3 = TimeEntry.create!(:user => User.find(1), :project => Project.find(1), :hours => 1, :spent_on => '2012-06-15', :created_on => '2012-06-16 20:10:00', :activity_id => 10) - - get :index, :project_id => 1, - :f => ['spent_on'], - :op => {'spent_on' => '><'}, - :v => {'spent_on' => ['2012-06-15', '2012-06-16']} - assert_response :success - assert_equal [t2, t1, t3], assigns(:entries) - - get :index, :project_id => 1, - :f => ['spent_on'], - :op => {'spent_on' => '><'}, - :v => {'spent_on' => ['2012-06-15', '2012-06-16']}, - :sort => 'spent_on' - assert_response :success - assert_equal [t3, t1, t2], assigns(:entries) - end - - def test_index_with_filter_on_issue_custom_field - issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {2 => 'filter_on_issue_custom_field'}) - entry = TimeEntry.generate!(:issue => issue, :hours => 2.5) - - get :index, :f => ['issue.cf_2'], :op => {'issue.cf_2' => '='}, :v => {'issue.cf_2' => ['filter_on_issue_custom_field']} - assert_response :success - assert_equal [entry], assigns(:entries) - end - - def test_index_with_issue_custom_field_column - issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :custom_field_values => {2 => 'filter_on_issue_custom_field'}) - entry = TimeEntry.generate!(:issue => issue, :hours => 2.5) - - get :index, :c => %w(project spent_on issue comments hours issue.cf_2) - assert_response :success - assert_include :'issue.cf_2', assigns(:query).column_names - assert_select 'td.issue_cf_2', :text => 'filter_on_issue_custom_field' - end - - def test_index_atom_feed - get :index, :project_id => 1, :format => 'atom' - assert_response :success - assert_equal 'application/atom+xml', @response.content_type - assert_not_nil assigns(:items) - assert assigns(:items).first.is_a?(TimeEntry) - end - - def test_index_at_project_level_should_include_csv_export_dialog - get :index, :project_id => 'ecookbook', - :f => ['spent_on'], - :op => {'spent_on' => '>='}, - :v => {'spent_on' => ['2007-04-01']}, - :c => ['spent_on', 'user'] - assert_response :success - - assert_select '#csv-export-options' do - assert_select 'form[action=?][method=get]', '/projects/ecookbook/time_entries.csv' do - # filter - assert_select 'input[name=?][value=?]', 'f[]', 'spent_on' - assert_select 'input[name=?][value=?]', 'op[spent_on]', '>=' - assert_select 'input[name=?][value=?]', 'v[spent_on][]', '2007-04-01' - # columns - assert_select 'input[name=?][value=?]', 'c[]', 'spent_on' - assert_select 'input[name=?][value=?]', 'c[]', 'user' - assert_select 'input[name=?]', 'c[]', 2 - end - end - end - - def test_index_cross_project_should_include_csv_export_dialog - get :index - assert_response :success - - assert_select '#csv-export-options' do - assert_select 'form[action=?][method=get]', '/time_entries.csv' - end - end - - def test_index_at_issue_level_should_include_csv_export_dialog - get :index, :project_id => 'ecookbook', :issue_id => 3 - assert_response :success - - assert_select '#csv-export-options' do - assert_select 'form[action=?][method=get]', '/projects/ecookbook/issues/3/time_entries.csv' - end - end - - def test_index_csv_all_projects - Setting.date_format = '%m/%d/%Y' - get :index, :format => 'csv' - assert_response :success - assert_equal 'text/csv; header=present', response.content_type - end - - def test_index_csv - Setting.date_format = '%m/%d/%Y' - get :index, :project_id => 1, :format => 'csv' - assert_response :success - assert_equal 'text/csv; header=present', response.content_type - end -end diff --git a/test/functional/trackers_controller_test.rb b/test/functional/trackers_controller_test.rb deleted file mode 100644 index 8038d6814..000000000 --- a/test/functional/trackers_controller_test.rb +++ /dev/null @@ -1,211 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class TrackersControllerTest < ActionController::TestCase - fixtures :trackers, :projects, :projects_trackers, :users, :issues, :custom_fields - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_index_by_anonymous_should_redirect_to_login_form - @request.session[:user_id] = nil - get :index - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Ftrackers' - end - - def test_index_by_user_should_respond_with_406 - @request.session[:user_id] = 2 - get :index - assert_response 406 - end - - def test_new - get :new - assert_response :success - assert_template 'new' - end - - def test_create - assert_difference 'Tracker.count' do - post :create, :tracker => { :name => 'New tracker', :project_ids => ['1', '', ''], :custom_field_ids => ['1', '6', ''] } - end - assert_redirected_to :action => 'index' - tracker = Tracker.first(:order => 'id DESC') - assert_equal 'New tracker', tracker.name - assert_equal [1], tracker.project_ids.sort - assert_equal Tracker::CORE_FIELDS, tracker.core_fields - assert_equal [1, 6], tracker.custom_field_ids.sort - assert_equal 0, tracker.workflow_rules.count - end - - def create_with_disabled_core_fields - assert_difference 'Tracker.count' do - post :create, :tracker => { :name => 'New tracker', :core_fields => ['assigned_to_id', 'fixed_version_id', ''] } - end - assert_redirected_to :action => 'index' - tracker = Tracker.first(:order => 'id DESC') - assert_equal 'New tracker', tracker.name - assert_equal %w(assigned_to_id fixed_version_id), tracker.core_fields - end - - def test_create_new_with_workflow_copy - assert_difference 'Tracker.count' do - post :create, :tracker => { :name => 'New tracker' }, :copy_workflow_from => 1 - end - assert_redirected_to :action => 'index' - tracker = Tracker.find_by_name('New tracker') - assert_equal 0, tracker.projects.count - assert_equal Tracker.find(1).workflow_rules.count, tracker.workflow_rules.count - end - - def test_create_with_failure - assert_no_difference 'Tracker.count' do - post :create, :tracker => { :name => '', :project_ids => ['1', '', ''], :custom_field_ids => ['1', '6', ''] } - end - assert_response :success - assert_template 'new' - assert_error_tag :content => /name can't be blank/i - end - - def test_edit - Tracker.find(1).project_ids = [1, 3] - - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - - assert_tag :input, :attributes => { :name => 'tracker[project_ids][]', - :value => '1', - :checked => 'checked' } - - assert_tag :input, :attributes => { :name => 'tracker[project_ids][]', - :value => '2', - :checked => nil } - - assert_tag :input, :attributes => { :name => 'tracker[project_ids][]', - :value => '', - :type => 'hidden'} - end - - def test_edit_should_check_core_fields - tracker = Tracker.find(1) - tracker.core_fields = %w(assigned_to_id fixed_version_id) - tracker.save! - - get :edit, :id => 1 - assert_response :success - assert_template 'edit' - - assert_select 'input[name=?][value=assigned_to_id][checked=checked]', 'tracker[core_fields][]' - assert_select 'input[name=?][value=fixed_version_id][checked=checked]', 'tracker[core_fields][]' - - assert_select 'input[name=?][value=category_id]', 'tracker[core_fields][]' - assert_select 'input[name=?][value=category_id][checked=checked]', 'tracker[core_fields][]', 0 - - assert_select 'input[name=?][value=][type=hidden]', 'tracker[core_fields][]' - end - - def test_update - put :update, :id => 1, :tracker => { :name => 'Renamed', - :project_ids => ['1', '2', ''] } - assert_redirected_to :action => 'index' - assert_equal [1, 2], Tracker.find(1).project_ids.sort - end - - def test_update_without_projects - put :update, :id => 1, :tracker => { :name => 'Renamed', - :project_ids => [''] } - assert_redirected_to :action => 'index' - assert Tracker.find(1).project_ids.empty? - end - - def test_update_without_core_fields - put :update, :id => 1, :tracker => { :name => 'Renamed', :core_fields => [''] } - assert_redirected_to :action => 'index' - assert Tracker.find(1).core_fields.empty? - end - - def test_update_with_failure - put :update, :id => 1, :tracker => { :name => '' } - assert_response :success - assert_template 'edit' - assert_error_tag :content => /name can't be blank/i - end - - def test_move_lower - tracker = Tracker.find_by_position(1) - put :update, :id => 1, :tracker => { :move_to => 'lower' } - assert_equal 2, tracker.reload.position - end - - def test_destroy - tracker = Tracker.create!(:name => 'Destroyable') - assert_difference 'Tracker.count', -1 do - delete :destroy, :id => tracker.id - end - assert_redirected_to :action => 'index' - assert_nil flash[:error] - end - - def test_destroy_tracker_in_use - assert_no_difference 'Tracker.count' do - delete :destroy, :id => 1 - end - assert_redirected_to :action => 'index' - assert_not_nil flash[:error] - end - - def test_get_fields - get :fields - assert_response :success - assert_template 'fields' - - assert_select 'form' do - assert_select 'input[type=checkbox][name=?][value=assigned_to_id]', 'trackers[1][core_fields][]' - assert_select 'input[type=checkbox][name=?][value=2]', 'trackers[1][custom_field_ids][]' - - assert_select 'input[type=hidden][name=?][value=]', 'trackers[1][core_fields][]' - assert_select 'input[type=hidden][name=?][value=]', 'trackers[1][custom_field_ids][]' - end - end - - def test_post_fields - post :fields, :trackers => { - '1' => {'core_fields' => ['assigned_to_id', 'due_date', ''], 'custom_field_ids' => ['1', '2']}, - '2' => {'core_fields' => [''], 'custom_field_ids' => ['']} - } - assert_redirected_to '/trackers/fields' - - tracker = Tracker.find(1) - assert_equal %w(assigned_to_id due_date), tracker.core_fields - assert_equal [1, 2], tracker.custom_field_ids.sort - - tracker = Tracker.find(2) - assert_equal [], tracker.core_fields - assert_equal [], tracker.custom_field_ids.sort - end -end diff --git a/test/functional/user_score_controller_test.rb b/test/functional/user_score_controller_test.rb deleted file mode 100644 index bf56a2076..000000000 --- a/test/functional/user_score_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class UserScoreControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/functional/users_controller_test.rb b/test/functional/users_controller_test.rb deleted file mode 100644 index 33f9e5292..000000000 --- a/test/functional/users_controller_test.rb +++ /dev/null @@ -1,437 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class UsersControllerTest < ActionController::TestCase - include Redmine::I18n - - fixtures :users, :projects, :members, :member_roles, :roles, - :custom_fields, :custom_values, :groups_users, - :auth_sources - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - end - - def test_index - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:users) - # active users only - assert_nil assigns(:users).detect {|u| !u.active?} - end - - def test_index_with_status_filter - get :index, :status => 3 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:users) - assert_equal [3], assigns(:users).map(&:status).uniq - end - - def test_index_with_name_filter - get :index, :name => 'john' - assert_response :success - assert_template 'index' - users = assigns(:users) - assert_not_nil users - assert_equal 1, users.size - assert_equal 'John', users.first.firstname - end - - def test_index_with_group_filter - get :index, :group_id => '10' - assert_response :success - assert_template 'index' - users = assigns(:users) - assert users.any? - assert_equal([], (users - Group.find(10).users)) - assert_select 'select[name=group_id]' do - assert_select 'option[value=10][selected=selected]' - end - end - - def test_show - @request.session[:user_id] = nil - get :show, :id => 2 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:user) - - assert_tag 'li', :content => /Phone number/ - end - - def test_show_should_not_display_hidden_custom_fields - @request.session[:user_id] = nil - UserCustomField.find_by_name('Phone number').update_attribute :visible, false - get :show, :id => 2 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:user) - - assert_no_tag 'li', :content => /Phone number/ - end - - def test_show_should_not_fail_when_custom_values_are_nil - user = User.find(2) - - # Create a custom field to illustrate the issue - custom_field = CustomField.create!(:name => 'Testing', :field_format => 'text') - custom_value = user.custom_values.build(:custom_field => custom_field).save! - - get :show, :id => 2 - assert_response :success - end - - def test_show_inactive - @request.session[:user_id] = nil - get :show, :id => 5 - assert_response 404 - end - - def test_show_should_not_reveal_users_with_no_visible_activity_or_project - @request.session[:user_id] = nil - get :show, :id => 9 - assert_response 404 - end - - def test_show_inactive_by_admin - @request.session[:user_id] = 1 - get :show, :id => 5 - assert_response 200 - assert_not_nil assigns(:user) - end - - def test_show_displays_memberships_based_on_project_visibility - @request.session[:user_id] = 1 - get :show, :id => 2 - assert_response :success - memberships = assigns(:memberships) - assert_not_nil memberships - project_ids = memberships.map(&:project_id) - assert project_ids.include?(2) #private project admin can see - end - - def test_show_current_should_require_authentication - @request.session[:user_id] = nil - get :show, :id => 'current' - assert_response 302 - end - - def test_show_current - @request.session[:user_id] = 2 - get :show, :id => 'current' - assert_response :success - assert_template 'show' - assert_equal User.find(2), assigns(:user) - end - - def test_new - get :new - assert_response :success - assert_template :new - assert assigns(:user) - end - - def test_create - Setting.bcc_recipients = '1' - - assert_difference 'User.count' do - assert_difference 'ActionMailer::Base.deliveries.size' do - post :create, - :user => { - :firstname => 'John', - :lastname => 'Doe', - :login => 'jdoe', - :password => 'secret123', - :password_confirmation => 'secret123', - :mail => 'jdoe@gmail.com', - :mail_notification => 'none' - }, - :send_information => '1' - end - end - - user = User.first(:order => 'id DESC') - assert_redirected_to :controller => 'users', :action => 'edit', :id => user.id - - assert_equal 'John', user.firstname - assert_equal 'Doe', user.lastname - assert_equal 'jdoe', user.login - assert_equal 'jdoe@gmail.com', user.mail - assert_equal 'none', user.mail_notification - assert user.check_password?('secret123') - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_equal [user.mail], mail.bcc - assert_mail_body_match 'secret', mail - end - - def test_create_with_preferences - assert_difference 'User.count' do - post :create, - :user => { - :firstname => 'John', - :lastname => 'Doe', - :login => 'jdoe', - :password => 'secret123', - :password_confirmation => 'secret123', - :mail => 'jdoe@gmail.com', - :mail_notification => 'none' - }, - :pref => { - 'hide_mail' => '1', - 'time_zone' => 'Paris', - 'comments_sorting' => 'desc', - 'warn_on_leaving_unsaved' => '0' - } - end - user = User.first(:order => 'id DESC') - assert_equal 'jdoe', user.login - assert_equal true, user.pref.hide_mail - assert_equal 'Paris', user.pref.time_zone - assert_equal 'desc', user.pref[:comments_sorting] - assert_equal '0', user.pref[:warn_on_leaving_unsaved] - end - - def test_create_with_failure - assert_no_difference 'User.count' do - post :create, :user => {} - end - assert_response :success - assert_template 'new' - end - - def test_edit - get :edit, :id => 2 - assert_response :success - assert_template 'edit' - assert_equal User.find(2), assigns(:user) - end - - def test_update - ActionMailer::Base.deliveries.clear - put :update, :id => 2, - :user => {:firstname => 'Changed', :mail_notification => 'only_assigned'}, - :pref => {:hide_mail => '1', :comments_sorting => 'desc'} - user = User.find(2) - assert_equal 'Changed', user.firstname - assert_equal 'only_assigned', user.mail_notification - assert_equal true, user.pref[:hide_mail] - assert_equal 'desc', user.pref[:comments_sorting] - assert ActionMailer::Base.deliveries.empty? - end - - def test_update_with_failure - assert_no_difference 'User.count' do - put :update, :id => 2, :user => {:firstname => ''} - end - assert_response :success - assert_template 'edit' - end - - def test_update_with_group_ids_should_assign_groups - put :update, :id => 2, :user => {:group_ids => ['10']} - user = User.find(2) - assert_equal [10], user.group_ids - end - - def test_update_with_activation_should_send_a_notification - u = User.new(:firstname => 'Foo', :lastname => 'Bar', :mail => 'foo.bar@somenet.foo', :language => 'fr') - u.login = 'foo' - u.status = User::STATUS_REGISTERED - u.save! - ActionMailer::Base.deliveries.clear - Setting.bcc_recipients = '1' - - put :update, :id => u.id, :user => {:status => User::STATUS_ACTIVE} - assert u.reload.active? - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_equal ['foo.bar@somenet.foo'], mail.bcc - assert_mail_body_match ll('fr', :notice_account_activated), mail - end - - def test_update_with_password_change_should_send_a_notification - ActionMailer::Base.deliveries.clear - Setting.bcc_recipients = '1' - - put :update, :id => 2, :user => {:password => 'newpass123', :password_confirmation => 'newpass123'}, :send_information => '1' - u = User.find(2) - assert u.check_password?('newpass123') - - mail = ActionMailer::Base.deliveries.last - assert_not_nil mail - assert_equal [u.mail], mail.bcc - assert_mail_body_match 'newpass123', mail - end - - def test_update_user_switchin_from_auth_source_to_password_authentication - # Configure as auth source - u = User.find(2) - u.auth_source = AuthSource.find(1) - u.save! - - put :update, :id => u.id, :user => {:auth_source_id => '', :password => 'newpass123', :password_confirmation => 'newpass123'} - - assert_equal nil, u.reload.auth_source - assert u.check_password?('newpass123') - end - - def test_update_notified_project - get :edit, :id => 2 - assert_response :success - assert_template 'edit' - u = User.find(2) - assert_equal [1, 2, 5], u.projects.collect{|p| p.id}.sort - assert_equal [1, 2, 5], u.notified_projects_ids.sort - assert_tag :tag => 'input', - :attributes => { - :id => 'notified_project_ids_', - :value => 1, - } - assert_equal 'all', u.mail_notification - put :update, :id => 2, - :user => { - :mail_notification => 'selected', - }, - :notified_project_ids => [1, 2] - u = User.find(2) - assert_equal 'selected', u.mail_notification - assert_equal [1, 2], u.notified_projects_ids.sort - end - - def test_update_status_should_not_update_attributes - user = User.find(2) - user.pref[:no_self_notified] = '1' - user.pref.save - - put :update, :id => 2, :user => {:status => 3} - assert_response 302 - user = User.find(2) - assert_equal 3, user.status - assert_equal '1', user.pref[:no_self_notified] - end - - def test_destroy - assert_difference 'User.count', -1 do - delete :destroy, :id => 2 - end - assert_redirected_to '/users' - assert_nil User.find_by_id(2) - end - - def test_destroy_should_be_denied_for_non_admin_users - @request.session[:user_id] = 3 - - assert_no_difference 'User.count' do - get :destroy, :id => 2 - end - assert_response 403 - end - - def test_destroy_should_redirect_to_back_url_param - assert_difference 'User.count', -1 do - delete :destroy, :id => 2, :back_url => '/users?name=foo' - end - assert_redirected_to '/users?name=foo' - end - - def test_create_membership - assert_difference 'Member.count' do - post :edit_membership, :id => 7, :membership => { :project_id => 3, :role_ids => [2]} - end - assert_redirected_to :action => 'edit', :id => '7', :tab => 'memberships' - member = Member.first(:order => 'id DESC') - assert_equal User.find(7), member.principal - assert_equal [2], member.role_ids - assert_equal 3, member.project_id - end - - def test_create_membership_js_format - assert_difference 'Member.count' do - post :edit_membership, :id => 7, :membership => {:project_id => 3, :role_ids => [2]}, :format => 'js' - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - member = Member.first(:order => 'id DESC') - assert_equal User.find(7), member.principal - assert_equal [2], member.role_ids - assert_equal 3, member.project_id - assert_include 'tab-content-memberships', response.body - end - - def test_create_membership_js_format_with_failure - assert_no_difference 'Member.count' do - post :edit_membership, :id => 7, :membership => {:project_id => 3}, :format => 'js' - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - assert_include 'alert', response.body, "Alert message not sent" - assert_include 'Role can\\\'t be empty', response.body, "Error message not sent" - end - - def test_update_membership - assert_no_difference 'Member.count' do - put :edit_membership, :id => 2, :membership_id => 1, :membership => { :role_ids => [2]} - assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships' - end - assert_equal [2], Member.find(1).role_ids - end - - def test_update_membership_js_format - assert_no_difference 'Member.count' do - put :edit_membership, :id => 2, :membership_id => 1, :membership => {:role_ids => [2]}, :format => 'js' - assert_response :success - assert_template 'edit_membership' - assert_equal 'text/javascript', response.content_type - end - assert_equal [2], Member.find(1).role_ids - assert_include 'tab-content-memberships', response.body - end - - def test_destroy_membership - assert_difference 'Member.count', -1 do - delete :destroy_membership, :id => 2, :membership_id => 1 - end - assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships' - assert_nil Member.find_by_id(1) - end - - def test_destroy_membership_js_format - assert_difference 'Member.count', -1 do - delete :destroy_membership, :id => 2, :membership_id => 1, :format => 'js' - assert_response :success - assert_template 'destroy_membership' - assert_equal 'text/javascript', response.content_type - end - assert_nil Member.find_by_id(1) - assert_include 'tab-content-memberships', response.body - end -end diff --git a/test/functional/versions_controller_test.rb b/test/functional/versions_controller_test.rb deleted file mode 100644 index a8a3f5b89..000000000 --- a/test/functional/versions_controller_test.rb +++ /dev/null @@ -1,232 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class VersionsControllerTest < ActionController::TestCase - fixtures :projects, :versions, :issues, :users, :roles, :members, :member_roles, :enabled_modules, :issue_statuses, :issue_categories - - def setup - User.current = nil - end - - def test_index - get :index, :project_id => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:versions) - # Version with no date set appears - assert assigns(:versions).include?(Version.find(3)) - # Completed version doesn't appear - assert !assigns(:versions).include?(Version.find(1)) - # Context menu on issues - assert_select "script", :text => Regexp.new(Regexp.escape("contextMenuInit('/issues/context_menu')")) - # Links to versions anchors - assert_tag 'a', :attributes => {:href => '#2.0'}, - :ancestor => {:tag => 'div', :attributes => {:id => 'sidebar'}} - # Links to completed versions in the sidebar - assert_tag 'a', :attributes => {:href => '/versions/1'}, - :ancestor => {:tag => 'div', :attributes => {:id => 'sidebar'}} - end - - def test_index_with_completed_versions - get :index, :project_id => 1, :completed => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:versions) - # Version with no date set appears - assert assigns(:versions).include?(Version.find(3)) - # Completed version appears - assert assigns(:versions).include?(Version.find(1)) - end - - def test_index_with_tracker_ids - get :index, :project_id => 1, :tracker_ids => [1, 3] - assert_response :success - assert_template 'index' - assert_not_nil assigns(:issues_by_version) - assert_nil assigns(:issues_by_version).values.flatten.detect {|issue| issue.tracker_id == 2} - end - - def test_index_showing_subprojects_versions - @subproject_version = Version.create!(:project => Project.find(3), :name => "Subproject version") - get :index, :project_id => 1, :with_subprojects => 1 - assert_response :success - assert_template 'index' - assert_not_nil assigns(:versions) - - assert assigns(:versions).include?(Version.find(4)), "Shared version not found" - assert assigns(:versions).include?(@subproject_version), "Subproject version not found" - end - - def test_index_should_prepend_shared_versions - get :index, :project_id => 1 - assert_response :success - - assert_select '#sidebar' do - assert_select 'a[href=?]', '#2.0', :text => '2.0' - assert_select 'a[href=?]', '#subproject1-2.0', :text => 'eCookbook Subproject 1 - 2.0' - end - assert_select '#content' do - assert_select 'a[name=?]', '2.0', :text => '2.0' - assert_select 'a[name=?]', 'subproject1-2.0', :text => 'eCookbook Subproject 1 - 2.0' - end - end - - def test_show - get :show, :id => 2 - assert_response :success - assert_template 'show' - assert_not_nil assigns(:version) - - assert_tag :tag => 'h2', :content => /1.0/ - end - - def test_show_should_display_nil_counts - with_settings :default_language => 'en' do - get :show, :id => 2, :status_by => 'category' - assert_response :success - assert_select 'div#status_by' do - assert_select 'select[name=status_by]' do - assert_select 'option[value=category][selected=selected]' - end - assert_select 'a', :text => 'none' - end - end - end - - def test_new - @request.session[:user_id] = 2 - get :new, :project_id => '1' - assert_response :success - assert_template 'new' - end - - def test_new_from_issue_form - @request.session[:user_id] = 2 - xhr :get, :new, :project_id => '1' - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - end - - def test_create - @request.session[:user_id] = 2 # manager - assert_difference 'Version.count' do - post :create, :project_id => '1', :version => {:name => 'test_add_version'} - end - assert_redirected_to '/projects/ecookbook/settings/versions' - version = Version.find_by_name('test_add_version') - assert_not_nil version - assert_equal 1, version.project_id - end - - def test_create_from_issue_form - @request.session[:user_id] = 2 - assert_difference 'Version.count' do - xhr :post, :create, :project_id => '1', :version => {:name => 'test_add_version_from_issue_form'} - end - version = Version.find_by_name('test_add_version_from_issue_form') - assert_not_nil version - assert_equal 1, version.project_id - - assert_response :success - assert_template 'create' - assert_equal 'text/javascript', response.content_type - assert_include 'test_add_version_from_issue_form', response.body - end - - def test_create_from_issue_form_with_failure - @request.session[:user_id] = 2 - assert_no_difference 'Version.count' do - xhr :post, :create, :project_id => '1', :version => {:name => ''} - end - assert_response :success - assert_template 'new' - assert_equal 'text/javascript', response.content_type - end - - def test_get_edit - @request.session[:user_id] = 2 - get :edit, :id => 2 - assert_response :success - assert_template 'edit' - end - - def test_close_completed - Version.update_all("status = 'open'") - @request.session[:user_id] = 2 - put :close_completed, :project_id => 'ecookbook' - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' - assert_not_nil Version.find_by_status('closed') - end - - def test_post_update - @request.session[:user_id] = 2 - put :update, :id => 2, - :version => { :name => 'New version name', - :effective_date => Date.today.strftime("%Y-%m-%d")} - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' - version = Version.find(2) - assert_equal 'New version name', version.name - assert_equal Date.today, version.effective_date - end - - def test_post_update_with_validation_failure - @request.session[:user_id] = 2 - put :update, :id => 2, - :version => { :name => '', - :effective_date => Date.today.strftime("%Y-%m-%d")} - assert_response :success - assert_template 'edit' - end - - def test_destroy - @request.session[:user_id] = 2 - assert_difference 'Version.count', -1 do - delete :destroy, :id => 3 - end - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' - assert_nil Version.find_by_id(3) - end - - def test_destroy_version_in_use_should_fail - @request.session[:user_id] = 2 - assert_no_difference 'Version.count' do - delete :destroy, :id => 2 - end - assert_redirected_to :controller => 'projects', :action => 'settings', :tab => 'versions', :id => 'ecookbook' - assert flash[:error].match(/Unable to delete version/) - assert Version.find_by_id(2) - end - - def test_issue_status_by - xhr :get, :status_by, :id => 2 - assert_response :success - assert_template 'status_by' - assert_template '_issue_counts' - end - - def test_issue_status_by_status - xhr :get, :status_by, :id => 2, :status_by => 'status' - assert_response :success - assert_template 'status_by' - assert_template '_issue_counts' - assert_include 'Assigned', response.body - assert_include 'Closed', response.body - end -end diff --git a/test/functional/watchers_controller_test.rb b/test/functional/watchers_controller_test.rb deleted file mode 100644 index a6aaa27f5..000000000 --- a/test/functional/watchers_controller_test.rb +++ /dev/null @@ -1,195 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class WatchersControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, - :issues, :trackers, :projects_trackers, :issue_statuses, :enumerations, :watchers - - def setup - User.current = nil - end - - def test_watch_a_single_object - @request.session[:user_id] = 3 - assert_difference('Watcher.count') do - xhr :post, :watch, :object_type => 'issue', :object_id => '1' - assert_response :success - assert_include '$(".issue-1-watcher")', response.body - end - assert Issue.find(1).watched_by?(User.find(3)) - end - - def test_watch_a_collection_with_a_single_object - @request.session[:user_id] = 3 - assert_difference('Watcher.count') do - xhr :post, :watch, :object_type => 'issue', :object_id => ['1'] - assert_response :success - assert_include '$(".issue-1-watcher")', response.body - end - assert Issue.find(1).watched_by?(User.find(3)) - end - - def test_watch_a_collection_with_multiple_objects - @request.session[:user_id] = 3 - assert_difference('Watcher.count', 2) do - xhr :post, :watch, :object_type => 'issue', :object_id => ['1', '3'] - assert_response :success - assert_include '$(".issue-bulk-watcher")', response.body - end - assert Issue.find(1).watched_by?(User.find(3)) - assert Issue.find(3).watched_by?(User.find(3)) - end - - def test_watch_should_be_denied_without_permission - Role.find(2).remove_permission! :view_issues - @request.session[:user_id] = 3 - assert_no_difference('Watcher.count') do - xhr :post, :watch, :object_type => 'issue', :object_id => '1' - assert_response 403 - end - end - - def test_watch_invalid_class_should_respond_with_404 - @request.session[:user_id] = 3 - assert_no_difference('Watcher.count') do - xhr :post, :watch, :object_type => 'foo', :object_id => '1' - assert_response 404 - end - end - - def test_watch_invalid_object_should_respond_with_404 - @request.session[:user_id] = 3 - assert_no_difference('Watcher.count') do - xhr :post, :watch, :object_type => 'issue', :object_id => '999' - assert_response 404 - end - end - - def test_unwatch - @request.session[:user_id] = 3 - assert_difference('Watcher.count', -1) do - xhr :delete, :unwatch, :object_type => 'issue', :object_id => '2' - assert_response :success - assert_include '$(".issue-2-watcher")', response.body - end - assert !Issue.find(1).watched_by?(User.find(3)) - end - - def test_unwatch_a_collection_with_multiple_objects - @request.session[:user_id] = 3 - Watcher.create!(:user_id => 3, :watchable => Issue.find(1)) - Watcher.create!(:user_id => 3, :watchable => Issue.find(3)) - - assert_difference('Watcher.count', -2) do - xhr :delete, :unwatch, :object_type => 'issue', :object_id => ['1', '3'] - assert_response :success - assert_include '$(".issue-bulk-watcher")', response.body - end - assert !Issue.find(1).watched_by?(User.find(3)) - assert !Issue.find(3).watched_by?(User.find(3)) - end - - def test_new - @request.session[:user_id] = 2 - xhr :get, :new, :object_type => 'issue', :object_id => '2' - assert_response :success - assert_match /ajax-modal/, response.body - end - - def test_new_for_new_record_with_project_id - @request.session[:user_id] = 2 - xhr :get, :new, :project_id => 1 - assert_response :success - assert_equal Project.find(1), assigns(:project) - assert_match /ajax-modal/, response.body - end - - def test_new_for_new_record_with_project_identifier - @request.session[:user_id] = 2 - xhr :get, :new, :project_id => 'ecookbook' - assert_response :success - assert_equal Project.find(1), assigns(:project) - assert_match /ajax-modal/, response.body - end - - def test_create - @request.session[:user_id] = 2 - assert_difference('Watcher.count') do - xhr :post, :create, :object_type => 'issue', :object_id => '2', :watcher => {:user_id => '4'} - assert_response :success - assert_match /watchers/, response.body - assert_match /ajax-modal/, response.body - end - assert Issue.find(2).watched_by?(User.find(4)) - end - - def test_create_multiple - @request.session[:user_id] = 2 - assert_difference('Watcher.count', 2) do - xhr :post, :create, :object_type => 'issue', :object_id => '2', :watcher => {:user_ids => ['4', '7']} - assert_response :success - assert_match /watchers/, response.body - assert_match /ajax-modal/, response.body - end - assert Issue.find(2).watched_by?(User.find(4)) - assert Issue.find(2).watched_by?(User.find(7)) - end - - def test_autocomplete_on_watchable_creation - @request.session[:user_id] = 2 - xhr :get, :autocomplete_for_user, :q => 'mi', :project_id => 'ecookbook' - assert_response :success - assert_select 'input', :count => 4 - assert_select 'input[name=?][value=1]', 'watcher[user_ids][]' - assert_select 'input[name=?][value=2]', 'watcher[user_ids][]' - assert_select 'input[name=?][value=8]', 'watcher[user_ids][]' - assert_select 'input[name=?][value=9]', 'watcher[user_ids][]' - end - - def test_autocomplete_on_watchable_update - @request.session[:user_id] = 2 - xhr :get, :autocomplete_for_user, :q => 'mi', :object_id => '2' , :object_type => 'issue', :project_id => 'ecookbook' - assert_response :success - assert_select 'input', :count => 3 - assert_select 'input[name=?][value=2]', 'watcher[user_ids][]' - assert_select 'input[name=?][value=8]', 'watcher[user_ids][]' - assert_select 'input[name=?][value=9]', 'watcher[user_ids][]' - - end - - def test_append - @request.session[:user_id] = 2 - assert_no_difference 'Watcher.count' do - xhr :post, :append, :watcher => {:user_ids => ['4', '7']}, :project_id => 'ecookbook' - assert_response :success - assert_include 'watchers_inputs', response.body - assert_include 'issue[watcher_user_ids][]', response.body - end - end - - def test_remove_watcher - @request.session[:user_id] = 2 - assert_difference('Watcher.count', -1) do - xhr :delete, :destroy, :object_type => 'issue', :object_id => '2', :user_id => '3' - assert_response :success - assert_match /watchers/, response.body - end - assert !Issue.find(2).watched_by?(User.find(3)) - end -end diff --git a/test/functional/welcome_controller_test.rb b/test/functional/welcome_controller_test.rb deleted file mode 100644 index 07a69eed1..000000000 --- a/test/functional/welcome_controller_test.rb +++ /dev/null @@ -1,165 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class WelcomeControllerTest < ActionController::TestCase - fixtures :projects, :news, :users, :members - - def setup - User.current = nil - end - - def test_index - get :index - assert_response :success - assert_template 'index' - assert_not_nil assigns(:news) - assert_not_nil assigns(:projects) - assert !assigns(:projects).include?(Project.where(:is_public => false).first) - end - - def test_browser_language - Setting.default_language = 'en' - @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' - get :index - assert_equal :fr, @controller.current_language - end - - def test_browser_language_alternate - Setting.default_language = 'en' - @request.env['HTTP_ACCEPT_LANGUAGE'] = 'zh-TW' - get :index - assert_equal :"zh-TW", @controller.current_language - end - - def test_browser_language_alternate_not_valid - Setting.default_language = 'en' - @request.env['HTTP_ACCEPT_LANGUAGE'] = 'fr-CA' - get :index - assert_equal :fr, @controller.current_language - end - - def test_robots - get :robots - assert_response :success - assert_equal 'text/plain', @response.content_type - assert @response.body.match(%r{^Disallow: /projects/ecookbook/issues\r?$}) - end - - def test_warn_on_leaving_unsaved_turn_on - user = User.find(2) - user.pref.warn_on_leaving_unsaved = '1' - user.pref.save! - @request.session[:user_id] = 2 - - get :index - assert_tag 'script', - :attributes => {:type => "text/javascript"}, - :content => %r{warnLeavingUnsaved} - end - - def test_warn_on_leaving_unsaved_turn_off - user = User.find(2) - user.pref.warn_on_leaving_unsaved = '0' - user.pref.save! - @request.session[:user_id] = 2 - - get :index - assert_no_tag 'script', - :attributes => {:type => "text/javascript"}, - :content => %r{warnLeavingUnsaved} - end - - def test_logout_link_should_post - @request.session[:user_id] = 2 - - get :index - assert_select 'a[href=/logout][data-method=post]', :text => 'Sign out' - end - - def test_call_hook_mixed_in - assert @controller.respond_to?(:call_hook) - end - - def test_project_jump_box_should_escape_names_once - Project.find(1).update_attribute :name, 'Foo & Bar' - @request.session[:user_id] = 2 - - get :index - assert_select "#header select" do - assert_select "option", :text => 'Foo & Bar' - end - end - - context "test_api_offset_and_limit" do - context "without params" do - should "return 0, 25" do - assert_equal [0, 25], @controller.api_offset_and_limit({}) - end - end - - context "with limit" do - should "return 0, limit" do - assert_equal [0, 30], @controller.api_offset_and_limit({:limit => 30}) - end - - should "not exceed 100" do - assert_equal [0, 100], @controller.api_offset_and_limit({:limit => 120}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:limit => -10}) - end - end - - context "with offset" do - should "return offset, 25" do - assert_equal [10, 25], @controller.api_offset_and_limit({:offset => 10}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:offset => -10}) - end - - context "and limit" do - should "return offset, limit" do - assert_equal [10, 50], @controller.api_offset_and_limit({:offset => 10, :limit => 50}) - end - end - end - - context "with page" do - should "return offset, 25" do - assert_equal [0, 25], @controller.api_offset_and_limit({:page => 1}) - assert_equal [50, 25], @controller.api_offset_and_limit({:page => 3}) - end - - should "not be negative" do - assert_equal [0, 25], @controller.api_offset_and_limit({:page => 0}) - assert_equal [0, 25], @controller.api_offset_and_limit({:page => -2}) - end - - context "and limit" do - should "return offset, limit" do - assert_equal [0, 100], @controller.api_offset_and_limit({:page => 1, :limit => 100}) - assert_equal [200, 100], @controller.api_offset_and_limit({:page => 3, :limit => 100}) - end - end - end - end -end diff --git a/test/functional/wiki_controller_test.rb b/test/functional/wiki_controller_test.rb deleted file mode 100644 index df98987cd..000000000 --- a/test/functional/wiki_controller_test.rb +++ /dev/null @@ -1,933 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class WikiControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, - :enabled_modules, :wikis, :wiki_pages, :wiki_contents, - :wiki_content_versions, :attachments - - def setup - User.current = nil - end - - def test_show_start_page - get :show, :project_id => 'ecookbook' - assert_response :success - assert_template 'show' - assert_tag :tag => 'h1', :content => /CookBook documentation/ - - # child_pages macro - assert_tag :ul, :attributes => { :class => 'pages-hierarchy' }, - :child => { :tag => 'li', - :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Page_with_an_inline_image' }, - :content => 'Page with an inline image' } } - end - - def test_export_link - Role.anonymous.add_permission! :export_wiki_pages - get :show, :project_id => 'ecookbook' - assert_response :success - assert_tag 'a', :attributes => {:href => '/projects/ecookbook/wiki/CookBook_documentation.txt'} - end - - def test_show_page_with_name - get :show, :project_id => 1, :id => 'Another_page' - assert_response :success - assert_template 'show' - assert_tag :tag => 'h1', :content => /Another page/ - # Included page with an inline image - assert_tag :tag => 'p', :content => /This is an inline image/ - assert_tag :tag => 'img', :attributes => { :src => '/attachments/download/3/logo.gif', - :alt => 'This is a logo' } - end - - def test_show_old_version - get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '2' - assert_response :success - assert_template 'show' - - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/1', :text => /Previous/ - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/2/diff', :text => /diff/ - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/3', :text => /Next/ - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation', :text => /Current version/ - end - - def test_show_old_version_with_attachments - page = WikiPage.find(4) - assert page.attachments.any? - content = page.content - content.text = "update" - content.save! - - get :show, :project_id => 'ecookbook', :id => page.title, :version => '1' - assert_kind_of WikiContent::Version, assigns(:content) - assert_response :success - assert_template 'show' - end - - def test_show_old_version_without_permission_should_be_denied - Role.anonymous.remove_permission! :view_wiki_edits - - get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '2' - assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fprojects%2Fecookbook%2Fwiki%2FCookBook_documentation%2F2' - end - - def test_show_first_version - get :show, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '1' - assert_response :success - assert_template 'show' - - assert_select 'a', :text => /Previous/, :count => 0 - assert_select 'a', :text => /diff/, :count => 0 - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/2', :text => /Next/ - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation', :text => /Current version/ - end - - def test_show_redirected_page - WikiRedirect.create!(:wiki_id => 1, :title => 'Old_title', :redirects_to => 'Another_page') - - get :show, :project_id => 'ecookbook', :id => 'Old_title' - assert_redirected_to '/projects/ecookbook/wiki/Another_page' - end - - def test_show_with_sidebar - page = Project.find(1).wiki.pages.new(:title => 'Sidebar') - page.content = WikiContent.new(:text => 'Side bar content for test_show_with_sidebar') - page.save! - - get :show, :project_id => 1, :id => 'Another_page' - assert_response :success - assert_tag :tag => 'div', :attributes => {:id => 'sidebar'}, - :content => /Side bar content for test_show_with_sidebar/ - end - - def test_show_should_display_section_edit_links - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 'Page with sections' - assert_no_tag 'a', :attributes => { - :href => '/projects/ecookbook/wiki/Page_with_sections/edit?section=1' - } - assert_tag 'a', :attributes => { - :href => '/projects/ecookbook/wiki/Page_with_sections/edit?section=2' - } - assert_tag 'a', :attributes => { - :href => '/projects/ecookbook/wiki/Page_with_sections/edit?section=3' - } - end - - def test_show_current_version_should_display_section_edit_links - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 'Page with sections', :version => 3 - - assert_tag 'a', :attributes => { - :href => '/projects/ecookbook/wiki/Page_with_sections/edit?section=2' - } - end - - def test_show_old_version_should_not_display_section_edit_links - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 'Page with sections', :version => 2 - - assert_no_tag 'a', :attributes => { - :href => '/projects/ecookbook/wiki/Page_with_sections/edit?section=2' - } - end - - def test_show_unexistent_page_without_edit_right - get :show, :project_id => 1, :id => 'Unexistent page' - assert_response 404 - end - - def test_show_unexistent_page_with_edit_right - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 'Unexistent page' - assert_response :success - assert_template 'edit' - end - - def test_show_unexistent_page_with_parent_should_preselect_parent - @request.session[:user_id] = 2 - get :show, :project_id => 1, :id => 'Unexistent page', :parent => 'Another_page' - assert_response :success - assert_template 'edit' - assert_tag 'select', :attributes => {:name => 'wiki_page[parent_id]'}, - :child => {:tag => 'option', :attributes => {:value => '2', :selected => 'selected'}} - end - - def test_show_should_not_show_history_without_permission - Role.anonymous.remove_permission! :view_wiki_edits - get :show, :project_id => 1, :id => 'Page with sections', :version => 2 - - assert_response 302 - end - - def test_create_page - @request.session[:user_id] = 2 - assert_difference 'WikiPage.count' do - assert_difference 'WikiContent.count' do - put :update, :project_id => 1, - :id => 'New page', - :content => {:comments => 'Created the page', - :text => "h1. New page\n\nThis is a new page", - :version => 0} - end - end - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'New_page' - page = Project.find(1).wiki.find_page('New page') - assert !page.new_record? - assert_not_nil page.content - assert_nil page.parent - assert_equal 'Created the page', page.content.comments - end - - def test_create_page_with_attachments - @request.session[:user_id] = 2 - assert_difference 'WikiPage.count' do - assert_difference 'Attachment.count' do - put :update, :project_id => 1, - :id => 'New page', - :content => {:comments => 'Created the page', - :text => "h1. New page\n\nThis is a new page", - :version => 0}, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain')}} - end - end - page = Project.find(1).wiki.find_page('New page') - assert_equal 1, page.attachments.count - assert_equal 'testfile.txt', page.attachments.first.filename - end - - def test_create_page_with_parent - @request.session[:user_id] = 2 - assert_difference 'WikiPage.count' do - put :update, :project_id => 1, :id => 'New page', - :content => {:text => "h1. New page\n\nThis is a new page", :version => 0}, - :wiki_page => {:parent_id => 2} - end - page = Project.find(1).wiki.find_page('New page') - assert_equal WikiPage.find(2), page.parent - end - - def test_edit_page - @request.session[:user_id] = 2 - get :edit, :project_id => 'ecookbook', :id => 'Another_page' - - assert_response :success - assert_template 'edit' - - assert_tag 'textarea', - :attributes => { :name => 'content[text]' }, - :content => "\n"+WikiPage.find_by_title('Another_page').content.text - end - - def test_edit_section - @request.session[:user_id] = 2 - get :edit, :project_id => 'ecookbook', :id => 'Page_with_sections', :section => 2 - - assert_response :success - assert_template 'edit' - - page = WikiPage.find_by_title('Page_with_sections') - section, hash = Redmine::WikiFormatting::Textile::Formatter.new(page.content.text).get_section(2) - - assert_tag 'textarea', - :attributes => { :name => 'content[text]' }, - :content => "\n"+section - assert_tag 'input', - :attributes => { :name => 'section', :type => 'hidden', :value => '2' } - assert_tag 'input', - :attributes => { :name => 'section_hash', :type => 'hidden', :value => hash } - end - - def test_edit_invalid_section_should_respond_with_404 - @request.session[:user_id] = 2 - get :edit, :project_id => 'ecookbook', :id => 'Page_with_sections', :section => 10 - - assert_response 404 - end - - def test_update_page - @request.session[:user_id] = 2 - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => "my comments", - :text => "edited", - :version => 1 - } - end - end - end - assert_redirected_to '/projects/ecookbook/wiki/Another_page' - - page = Wiki.find(1).pages.find_by_title('Another_page') - assert_equal "edited", page.content.text - assert_equal 2, page.content.version - assert_equal "my comments", page.content.comments - end - - def test_update_page_with_parent - @request.session[:user_id] = 2 - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => "my comments", - :text => "edited", - :version => 1 - }, - :wiki_page => {:parent_id => '1'} - end - end - end - assert_redirected_to '/projects/ecookbook/wiki/Another_page' - - page = Wiki.find(1).pages.find_by_title('Another_page') - assert_equal "edited", page.content.text - assert_equal 2, page.content.version - assert_equal "my comments", page.content.comments - assert_equal WikiPage.find(1), page.parent - end - - def test_update_page_with_failure - @request.session[:user_id] = 2 - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => 'a' * 300, # failure here, comment is too long - :text => 'edited', - :version => 1 - } - end - end - end - assert_response :success - assert_template 'edit' - - assert_error_tag :descendant => {:content => /Comment is too long/} - assert_tag :tag => 'textarea', :attributes => {:id => 'content_text'}, :content => "\nedited" - assert_tag :tag => 'input', :attributes => {:id => 'content_version', :value => '1'} - end - - def test_update_page_with_parent_change_only_should_not_create_content_version - @request.session[:user_id] = 2 - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => '', - :text => Wiki.find(1).find_page('Another_page').content.text, - :version => 1 - }, - :wiki_page => {:parent_id => '1'} - end - end - end - page = Wiki.find(1).pages.find_by_title('Another_page') - assert_equal 1, page.content.version - assert_equal WikiPage.find(1), page.parent - end - - def test_update_page_with_attachments_only_should_not_create_content_version - @request.session[:user_id] = 2 - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiContent::Version.count' do - assert_difference 'Attachment.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => '', - :text => Wiki.find(1).find_page('Another_page').content.text, - :version => 1 - }, - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - end - end - end - end - page = Wiki.find(1).pages.find_by_title('Another_page') - assert_equal 1, page.content.version - end - - def test_update_stale_page_should_not_raise_an_error - @request.session[:user_id] = 2 - c = Wiki.find(1).find_page('Another_page').content - c.text = 'Previous text' - c.save! - assert_equal 2, c.version - - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, - :id => 'Another_page', - :content => { - :comments => 'My comments', - :text => 'Text should not be lost', - :version => 1 - } - end - end - end - assert_response :success - assert_template 'edit' - assert_tag :div, - :attributes => { :class => /error/ }, - :content => /Data has been updated by another user/ - assert_tag 'textarea', - :attributes => { :name => 'content[text]' }, - :content => /Text should not be lost/ - assert_tag 'input', - :attributes => { :name => 'content[comments]', :value => 'My comments' } - - c.reload - assert_equal 'Previous text', c.text - assert_equal 2, c.version - end - - def test_update_section - @request.session[:user_id] = 2 - page = WikiPage.find_by_title('Page_with_sections') - section, hash = Redmine::WikiFormatting::Textile::Formatter.new(page.content.text).get_section(2) - text = page.content.text - - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, :id => 'Page_with_sections', - :content => { - :text => "New section content", - :version => 3 - }, - :section => 2, - :section_hash => hash - end - end - end - assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections' - assert_equal Redmine::WikiFormatting::Textile::Formatter.new(text).update_section(2, "New section content"), page.reload.content.text - end - - def test_update_section_should_allow_stale_page_update - @request.session[:user_id] = 2 - page = WikiPage.find_by_title('Page_with_sections') - section, hash = Redmine::WikiFormatting::Textile::Formatter.new(page.content.text).get_section(2) - text = page.content.text - - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, :id => 'Page_with_sections', - :content => { - :text => "New section content", - :version => 2 # Current version is 3 - }, - :section => 2, - :section_hash => hash - end - end - end - assert_redirected_to '/projects/ecookbook/wiki/Page_with_sections' - page.reload - assert_equal Redmine::WikiFormatting::Textile::Formatter.new(text).update_section(2, "New section content"), page.content.text - assert_equal 4, page.content.version - end - - def test_update_section_should_not_allow_stale_section_update - @request.session[:user_id] = 2 - - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiContent::Version.count' do - put :update, :project_id => 1, :id => 'Page_with_sections', - :content => { - :comments => 'My comments', - :text => "Text should not be lost", - :version => 3 - }, - :section => 2, - :section_hash => Digest::MD5.hexdigest("wrong hash") - end - end - end - assert_response :success - assert_template 'edit' - assert_tag :div, - :attributes => { :class => /error/ }, - :content => /Data has been updated by another user/ - assert_tag 'textarea', - :attributes => { :name => 'content[text]' }, - :content => /Text should not be lost/ - assert_tag 'input', - :attributes => { :name => 'content[comments]', :value => 'My comments' } - end - - def test_preview - @request.session[:user_id] = 2 - xhr :post, :preview, :project_id => 1, :id => 'CookBook_documentation', - :content => { :comments => '', - :text => 'this is a *previewed text*', - :version => 3 } - assert_response :success - assert_template 'common/_preview' - assert_tag :tag => 'strong', :content => /previewed text/ - end - - def test_preview_new_page - @request.session[:user_id] = 2 - xhr :post, :preview, :project_id => 1, :id => 'New page', - :content => { :text => 'h1. New page', - :comments => '', - :version => 0 } - assert_response :success - assert_template 'common/_preview' - assert_tag :tag => 'h1', :content => /New page/ - end - - def test_history - @request.session[:user_id] = 2 - get :history, :project_id => 'ecookbook', :id => 'CookBook_documentation' - assert_response :success - assert_template 'history' - assert_not_nil assigns(:versions) - assert_equal 3, assigns(:versions).size - - assert_select "input[type=submit][name=commit]" - assert_select 'td' do - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/2', :text => '2' - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/2/annotate', :text => 'Annotate' - assert_select 'a[href=?]', '/projects/ecookbook/wiki/CookBook_documentation/2', :text => 'Delete' - end - end - - def test_history_with_one_version - @request.session[:user_id] = 2 - get :history, :project_id => 'ecookbook', :id => 'Another_page' - assert_response :success - assert_template 'history' - assert_not_nil assigns(:versions) - assert_equal 1, assigns(:versions).size - assert_select "input[type=submit][name=commit]", false - assert_select 'td' do - assert_select 'a[href=?]', '/projects/ecookbook/wiki/Another_page/1', :text => '1' - assert_select 'a[href=?]', '/projects/ecookbook/wiki/Another_page/1/annotate', :text => 'Annotate' - assert_select 'a[href=?]', '/projects/ecookbook/wiki/Another_page/1', :text => 'Delete', :count => 0 - end - end - - def test_diff - content = WikiPage.find(1).content - assert_difference 'WikiContent::Version.count', 2 do - content.text = "Line removed\nThis is a sample text for testing diffs" - content.save! - content.text = "This is a sample text for testing diffs\nLine added" - content.save! - end - - get :diff, :project_id => 1, :id => 'CookBook_documentation', :version => content.version, :version_from => (content.version - 1) - assert_response :success - assert_template 'diff' - assert_select 'span.diff_out', :text => 'Line removed' - assert_select 'span.diff_in', :text => 'Line added' - end - - def test_diff_with_invalid_version_should_respond_with_404 - get :diff, :project_id => 1, :id => 'CookBook_documentation', :version => '99' - assert_response 404 - end - - def test_diff_with_invalid_version_from_should_respond_with_404 - get :diff, :project_id => 1, :id => 'CookBook_documentation', :version => '99', :version_from => '98' - assert_response 404 - end - - def test_annotate - get :annotate, :project_id => 1, :id => 'CookBook_documentation', :version => 2 - assert_response :success - assert_template 'annotate' - - # Line 1 - assert_tag :tag => 'tr', :child => { - :tag => 'th', :attributes => {:class => 'line-num'}, :content => '1', :sibling => { - :tag => 'td', :attributes => {:class => 'author'}, :content => /John Smith/, :sibling => { - :tag => 'td', :content => /h1\. CookBook documentation/ - } - } - } - - # Line 5 - assert_tag :tag => 'tr', :child => { - :tag => 'th', :attributes => {:class => 'line-num'}, :content => '5', :sibling => { - :tag => 'td', :attributes => {:class => 'author'}, :content => /Redmine Admin/, :sibling => { - :tag => 'td', :content => /Some updated \[\[documentation\]\] here/ - } - } - } - end - - def test_annotate_with_invalid_version_should_respond_with_404 - get :annotate, :project_id => 1, :id => 'CookBook_documentation', :version => '99' - assert_response 404 - end - - def test_get_rename - @request.session[:user_id] = 2 - get :rename, :project_id => 1, :id => 'Another_page' - assert_response :success - assert_template 'rename' - assert_tag 'option', - :attributes => {:value => ''}, - :content => '', - :parent => {:tag => 'select', :attributes => {:name => 'wiki_page[parent_id]'}} - assert_no_tag 'option', - :attributes => {:selected => 'selected'}, - :parent => {:tag => 'select', :attributes => {:name => 'wiki_page[parent_id]'}} - end - - def test_get_rename_child_page - @request.session[:user_id] = 2 - get :rename, :project_id => 1, :id => 'Child_1' - assert_response :success - assert_template 'rename' - assert_tag 'option', - :attributes => {:value => ''}, - :content => '', - :parent => {:tag => 'select', :attributes => {:name => 'wiki_page[parent_id]'}} - assert_tag 'option', - :attributes => {:value => '2', :selected => 'selected'}, - :content => /Another page/, - :parent => { - :tag => 'select', - :attributes => {:name => 'wiki_page[parent_id]'} - } - end - - def test_rename_with_redirect - @request.session[:user_id] = 2 - post :rename, :project_id => 1, :id => 'Another_page', - :wiki_page => { :title => 'Another renamed page', - :redirect_existing_links => 1 } - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'Another_renamed_page' - wiki = Project.find(1).wiki - # Check redirects - assert_not_nil wiki.find_page('Another page') - assert_nil wiki.find_page('Another page', :with_redirect => false) - end - - def test_rename_without_redirect - @request.session[:user_id] = 2 - post :rename, :project_id => 1, :id => 'Another_page', - :wiki_page => { :title => 'Another renamed page', - :redirect_existing_links => "0" } - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'Another_renamed_page' - wiki = Project.find(1).wiki - # Check that there's no redirects - assert_nil wiki.find_page('Another page') - end - - def test_rename_with_parent_assignment - @request.session[:user_id] = 2 - post :rename, :project_id => 1, :id => 'Another_page', - :wiki_page => { :title => 'Another page', :redirect_existing_links => "0", :parent_id => '4' } - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'Another_page' - assert_equal WikiPage.find(4), WikiPage.find_by_title('Another_page').parent - end - - def test_rename_with_parent_unassignment - @request.session[:user_id] = 2 - post :rename, :project_id => 1, :id => 'Child_1', - :wiki_page => { :title => 'Child 1', :redirect_existing_links => "0", :parent_id => '' } - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'Child_1' - assert_nil WikiPage.find_by_title('Child_1').parent - end - - def test_destroy_a_page_without_children_should_not_ask_confirmation - @request.session[:user_id] = 2 - delete :destroy, :project_id => 1, :id => 'Child_2' - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - end - - def test_destroy_parent_should_ask_confirmation - @request.session[:user_id] = 2 - assert_no_difference('WikiPage.count') do - delete :destroy, :project_id => 1, :id => 'Another_page' - end - assert_response :success - assert_template 'destroy' - assert_select 'form' do - assert_select 'input[name=todo][value=nullify]' - assert_select 'input[name=todo][value=destroy]' - assert_select 'input[name=todo][value=reassign]' - end - end - - def test_destroy_parent_with_nullify_should_delete_parent_only - @request.session[:user_id] = 2 - assert_difference('WikiPage.count', -1) do - delete :destroy, :project_id => 1, :id => 'Another_page', :todo => 'nullify' - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_nil WikiPage.find_by_id(2) - end - - def test_destroy_parent_with_cascade_should_delete_descendants - @request.session[:user_id] = 2 - assert_difference('WikiPage.count', -4) do - delete :destroy, :project_id => 1, :id => 'Another_page', :todo => 'destroy' - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_nil WikiPage.find_by_id(2) - assert_nil WikiPage.find_by_id(5) - end - - def test_destroy_parent_with_reassign - @request.session[:user_id] = 2 - assert_difference('WikiPage.count', -1) do - delete :destroy, :project_id => 1, :id => 'Another_page', :todo => 'reassign', :reassign_to_id => 1 - end - assert_redirected_to :action => 'index', :project_id => 'ecookbook' - assert_nil WikiPage.find_by_id(2) - assert_equal WikiPage.find(1), WikiPage.find_by_id(5).parent - end - - def test_destroy_version - @request.session[:user_id] = 2 - assert_difference 'WikiContent::Version.count', -1 do - assert_no_difference 'WikiContent.count' do - assert_no_difference 'WikiPage.count' do - delete :destroy_version, :project_id => 'ecookbook', :id => 'CookBook_documentation', :version => 2 - assert_redirected_to '/projects/ecookbook/wiki/CookBook_documentation/history' - end - end - end - end - - def test_index - get :index, :project_id => 'ecookbook' - assert_response :success - assert_template 'index' - pages = assigns(:pages) - assert_not_nil pages - assert_equal Project.find(1).wiki.pages.size, pages.size - assert_equal pages.first.content.updated_on, pages.first.updated_on - - assert_tag :ul, :attributes => { :class => 'pages-hierarchy' }, - :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/CookBook_documentation' }, - :content => 'CookBook documentation' }, - :child => { :tag => 'ul', - :child => { :tag => 'li', - :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Page_with_an_inline_image' }, - :content => 'Page with an inline image' } } } }, - :child => { :tag => 'li', :child => { :tag => 'a', :attributes => { :href => '/projects/ecookbook/wiki/Another_page' }, - :content => 'Another page' } } - end - - def test_index_should_include_atom_link - get :index, :project_id => 'ecookbook' - assert_tag 'a', :attributes => { :href => '/projects/ecookbook/activity.atom?show_wiki_edits=1'} - end - - def test_export_to_html - @request.session[:user_id] = 2 - get :export, :project_id => 'ecookbook' - - assert_response :success - assert_not_nil assigns(:pages) - assert assigns(:pages).any? - assert_equal "text/html", @response.content_type - - assert_select "a[name=?]", "CookBook_documentation" - assert_select "a[name=?]", "Another_page" - assert_select "a[name=?]", "Page_with_an_inline_image" - end - - def test_export_to_pdf - @request.session[:user_id] = 2 - get :export, :project_id => 'ecookbook', :format => 'pdf' - - assert_response :success - assert_not_nil assigns(:pages) - assert assigns(:pages).any? - assert_equal 'application/pdf', @response.content_type - assert_equal 'attachment; filename="ecookbook.pdf"', @response.headers['Content-Disposition'] - assert @response.body.starts_with?('%PDF') - end - - def test_export_without_permission_should_be_denied - @request.session[:user_id] = 2 - Role.find_by_name('Manager').remove_permission! :export_wiki_pages - get :export, :project_id => 'ecookbook' - - assert_response 403 - end - - def test_date_index - get :date_index, :project_id => 'ecookbook' - - assert_response :success - assert_template 'date_index' - assert_not_nil assigns(:pages) - assert_not_nil assigns(:pages_by_date) - - assert_tag 'a', :attributes => { :href => '/projects/ecookbook/activity.atom?show_wiki_edits=1'} - end - - def test_not_found - get :show, :project_id => 999 - assert_response 404 - end - - def test_protect_page - page = WikiPage.find_by_wiki_id_and_title(1, 'Another_page') - assert !page.protected? - @request.session[:user_id] = 2 - post :protect, :project_id => 1, :id => page.title, :protected => '1' - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'Another_page' - assert page.reload.protected? - end - - def test_unprotect_page - page = WikiPage.find_by_wiki_id_and_title(1, 'CookBook_documentation') - assert page.protected? - @request.session[:user_id] = 2 - post :protect, :project_id => 1, :id => page.title, :protected => '0' - assert_redirected_to :action => 'show', :project_id => 'ecookbook', :id => 'CookBook_documentation' - assert !page.reload.protected? - end - - def test_show_page_with_edit_link - @request.session[:user_id] = 2 - get :show, :project_id => 1 - assert_response :success - assert_template 'show' - assert_tag :tag => 'a', :attributes => { :href => '/projects/1/wiki/CookBook_documentation/edit' } - end - - def test_show_page_without_edit_link - @request.session[:user_id] = 4 - get :show, :project_id => 1 - assert_response :success - assert_template 'show' - assert_no_tag :tag => 'a', :attributes => { :href => '/projects/1/wiki/CookBook_documentation/edit' } - end - - def test_show_pdf - @request.session[:user_id] = 2 - get :show, :project_id => 1, :format => 'pdf' - assert_response :success - assert_not_nil assigns(:page) - assert_equal 'application/pdf', @response.content_type - assert_equal 'attachment; filename="CookBook_documentation.pdf"', - @response.headers['Content-Disposition'] - end - - def test_show_html - @request.session[:user_id] = 2 - get :show, :project_id => 1, :format => 'html' - assert_response :success - assert_not_nil assigns(:page) - assert_equal 'text/html', @response.content_type - assert_equal 'attachment; filename="CookBook_documentation.html"', - @response.headers['Content-Disposition'] - assert_tag 'h1', :content => 'CookBook documentation' - end - - def test_show_versioned_html - @request.session[:user_id] = 2 - get :show, :project_id => 1, :format => 'html', :version => 2 - assert_response :success - assert_not_nil assigns(:content) - assert_equal 2, assigns(:content).version - assert_equal 'text/html', @response.content_type - assert_equal 'attachment; filename="CookBook_documentation.html"', - @response.headers['Content-Disposition'] - assert_tag 'h1', :content => 'CookBook documentation' - end - - def test_show_txt - @request.session[:user_id] = 2 - get :show, :project_id => 1, :format => 'txt' - assert_response :success - assert_not_nil assigns(:page) - assert_equal 'text/plain', @response.content_type - assert_equal 'attachment; filename="CookBook_documentation.txt"', - @response.headers['Content-Disposition'] - assert_include 'h1. CookBook documentation', @response.body - end - - def test_show_versioned_txt - @request.session[:user_id] = 2 - get :show, :project_id => 1, :format => 'txt', :version => 2 - assert_response :success - assert_not_nil assigns(:content) - assert_equal 2, assigns(:content).version - assert_equal 'text/plain', @response.content_type - assert_equal 'attachment; filename="CookBook_documentation.txt"', - @response.headers['Content-Disposition'] - assert_include 'h1. CookBook documentation', @response.body - end - - def test_edit_unprotected_page - # Non members can edit unprotected wiki pages - @request.session[:user_id] = 4 - get :edit, :project_id => 1, :id => 'Another_page' - assert_response :success - assert_template 'edit' - end - - def test_edit_protected_page_by_nonmember - # Non members can't edit protected wiki pages - @request.session[:user_id] = 4 - get :edit, :project_id => 1, :id => 'CookBook_documentation' - assert_response 403 - end - - def test_edit_protected_page_by_member - @request.session[:user_id] = 2 - get :edit, :project_id => 1, :id => 'CookBook_documentation' - assert_response :success - assert_template 'edit' - end - - def test_history_of_non_existing_page_should_return_404 - get :history, :project_id => 1, :id => 'Unknown_page' - assert_response 404 - end - - def test_add_attachment - @request.session[:user_id] = 2 - assert_difference 'Attachment.count' do - post :add_attachment, :project_id => 1, :id => 'CookBook_documentation', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'test file'}} - end - attachment = Attachment.first(:order => 'id DESC') - assert_equal Wiki.find(1).find_page('CookBook_documentation'), attachment.container - end -end diff --git a/test/functional/wikis_controller_test.rb b/test/functional/wikis_controller_test.rb deleted file mode 100644 index 5ff268733..000000000 --- a/test/functional/wikis_controller_test.rb +++ /dev/null @@ -1,83 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class WikisControllerTest < ActionController::TestCase - fixtures :projects, :users, :roles, :members, :member_roles, :enabled_modules, :wikis - - def setup - User.current = nil - end - - def test_create - @request.session[:user_id] = 1 - assert_nil Project.find(3).wiki - - assert_difference 'Wiki.count' do - xhr :post, :edit, :id => 3, :wiki => { :start_page => 'Start page' } - assert_response :success - assert_template 'edit' - assert_equal 'text/javascript', response.content_type - end - - wiki = Project.find(3).wiki - assert_not_nil wiki - assert_equal 'Start page', wiki.start_page - end - - def test_create_with_failure - @request.session[:user_id] = 1 - - assert_no_difference 'Wiki.count' do - xhr :post, :edit, :id => 3, :wiki => { :start_page => '' } - assert_response :success - assert_template 'edit' - assert_equal 'text/javascript', response.content_type - end - - assert_include 'errorExplanation', response.body - assert_include 'Start page can't be blank', response.body - end - - def test_update - @request.session[:user_id] = 1 - - assert_no_difference 'Wiki.count' do - xhr :post, :edit, :id => 1, :wiki => { :start_page => 'Other start page' } - assert_response :success - assert_template 'edit' - assert_equal 'text/javascript', response.content_type - end - - wiki = Project.find(1).wiki - assert_equal 'Other start page', wiki.start_page - end - - def test_destroy - @request.session[:user_id] = 1 - post :destroy, :id => 1, :confirm => 1 - assert_redirected_to :controller => 'projects', :action => 'settings', :id => 'ecookbook', :tab => 'wiki' - assert_nil Project.find(1).wiki - end - - def test_not_found - @request.session[:user_id] = 1 - post :destroy, :id => 999, :confirm => 1 - assert_response 404 - end -end diff --git a/test/functional/workflows_controller_test.rb b/test/functional/workflows_controller_test.rb deleted file mode 100644 index 747040c15..000000000 --- a/test/functional/workflows_controller_test.rb +++ /dev/null @@ -1,328 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class WorkflowsControllerTest < ActionController::TestCase - fixtures :roles, :trackers, :workflows, :users, :issue_statuses - - def setup - User.current = nil - @request.session[:user_id] = 1 # admin - end - - def test_index - get :index - assert_response :success - assert_template 'index' - - count = WorkflowTransition.count(:all, :conditions => 'role_id = 1 AND tracker_id = 2') - assert_tag :tag => 'a', :content => count.to_s, - :attributes => { :href => '/workflows/edit?role_id=1&tracker_id=2' } - end - - def test_get_edit - get :edit - assert_response :success - assert_template 'edit' - assert_not_nil assigns(:roles) - assert_not_nil assigns(:trackers) - end - - def test_get_edit_with_role_and_tracker - WorkflowTransition.delete_all - WorkflowTransition.create!(:role_id => 1, :tracker_id => 1, :old_status_id => 2, :new_status_id => 3) - WorkflowTransition.create!(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 5) - - get :edit, :role_id => 2, :tracker_id => 1 - assert_response :success - assert_template 'edit' - - # used status only - assert_not_nil assigns(:statuses) - assert_equal [2, 3, 5], assigns(:statuses).collect(&:id) - - # allowed transitions - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'issue_status[3][5][]', - :value => 'always', - :checked => 'checked' } - # not allowed - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'issue_status[3][2][]', - :value => 'always', - :checked => nil } - # unused - assert_no_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'issue_status[1][1][]' } - end - - def test_get_edit_with_role_and_tracker_and_all_statuses - WorkflowTransition.delete_all - - get :edit, :role_id => 2, :tracker_id => 1, :used_statuses_only => '0' - assert_response :success - assert_template 'edit' - - assert_not_nil assigns(:statuses) - assert_equal IssueStatus.count, assigns(:statuses).size - - assert_tag :tag => 'input', :attributes => { :type => 'checkbox', - :name => 'issue_status[1][1][]', - :value => 'always', - :checked => nil } - end - - def test_post_edit - post :edit, :role_id => 2, :tracker_id => 1, - :issue_status => { - '4' => {'5' => ['always']}, - '3' => {'1' => ['always'], '2' => ['always']} - } - assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1' - - assert_equal 3, WorkflowTransition.where(:tracker_id => 1, :role_id => 2).count - assert_not_nil WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2).first - assert_nil WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 5, :new_status_id => 4).first - end - - def test_post_edit_with_additional_transitions - post :edit, :role_id => 2, :tracker_id => 1, - :issue_status => { - '4' => {'5' => ['always']}, - '3' => {'1' => ['author'], '2' => ['assignee'], '4' => ['author', 'assignee']} - } - assert_redirected_to '/workflows/edit?role_id=2&tracker_id=1' - - assert_equal 4, WorkflowTransition.where(:tracker_id => 1, :role_id => 2).count - - w = WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 4, :new_status_id => 5).first - assert ! w.author - assert ! w.assignee - w = WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 1).first - assert w.author - assert ! w.assignee - w = WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 2).first - assert ! w.author - assert w.assignee - w = WorkflowTransition.where(:role_id => 2, :tracker_id => 1, :old_status_id => 3, :new_status_id => 4).first - assert w.author - assert w.assignee - end - - def test_clear_workflow - assert WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2}) > 0 - - post :edit, :role_id => 2, :tracker_id => 1 - assert_equal 0, WorkflowTransition.count(:conditions => {:tracker_id => 1, :role_id => 2}) - end - - def test_get_permissions - get :permissions - - assert_response :success - assert_template 'permissions' - assert_not_nil assigns(:roles) - assert_not_nil assigns(:trackers) - end - - def test_get_permissions_with_role_and_tracker - WorkflowPermission.delete_all - WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'assigned_to_id', :rule => 'required') - WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') - WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 3, :field_name => 'fixed_version_id', :rule => 'readonly') - - get :permissions, :role_id => 1, :tracker_id => 2 - assert_response :success - assert_template 'permissions' - - assert_select 'input[name=role_id][value=1]' - assert_select 'input[name=tracker_id][value=2]' - - # Required field - assert_select 'select[name=?]', 'permissions[assigned_to_id][2]' do - assert_select 'option[value=]' - assert_select 'option[value=][selected=selected]', 0 - assert_select 'option[value=readonly]', :text => 'Read-only' - assert_select 'option[value=readonly][selected=selected]', 0 - assert_select 'option[value=required]', :text => 'Required' - assert_select 'option[value=required][selected=selected]' - end - - # Read-only field - assert_select 'select[name=?]', 'permissions[fixed_version_id][3]' do - assert_select 'option[value=]' - assert_select 'option[value=][selected=selected]', 0 - assert_select 'option[value=readonly]', :text => 'Read-only' - assert_select 'option[value=readonly][selected=selected]' - assert_select 'option[value=required]', :text => 'Required' - assert_select 'option[value=required][selected=selected]', 0 - end - - # Other field - assert_select 'select[name=?]', 'permissions[due_date][3]' do - assert_select 'option[value=]' - assert_select 'option[value=][selected=selected]', 0 - assert_select 'option[value=readonly]', :text => 'Read-only' - assert_select 'option[value=readonly][selected=selected]', 0 - assert_select 'option[value=required]', :text => 'Required' - assert_select 'option[value=required][selected=selected]', 0 - end - end - - def test_get_permissions_with_required_custom_field_should_not_show_required_option - cf = IssueCustomField.create!(:name => 'Foo', :field_format => 'string', :tracker_ids => [1], :is_required => true) - - get :permissions, :role_id => 1, :tracker_id => 1 - assert_response :success - assert_template 'permissions' - - # Custom field that is always required - # The default option is "(Required)" - assert_select 'select[name=?]', "permissions[#{cf.id}][3]" do - assert_select 'option[value=]' - assert_select 'option[value=readonly]', :text => 'Read-only' - assert_select 'option[value=required]', 0 - end - end - - def test_get_permissions_with_role_and_tracker_and_all_statuses - WorkflowTransition.delete_all - - get :permissions, :role_id => 1, :tracker_id => 2, :used_statuses_only => '0' - assert_response :success - assert_equal IssueStatus.sorted.all, assigns(:statuses) - end - - def test_post_permissions - WorkflowPermission.delete_all - - post :permissions, :role_id => 1, :tracker_id => 2, :permissions => { - 'assigned_to_id' => {'1' => '', '2' => 'readonly', '3' => ''}, - 'fixed_version_id' => {'1' => 'required', '2' => 'readonly', '3' => ''}, - 'due_date' => {'1' => '', '2' => '', '3' => ''}, - } - assert_redirected_to '/workflows/permissions?role_id=1&tracker_id=2' - - workflows = WorkflowPermission.all - assert_equal 3, workflows.size - workflows.each do |workflow| - assert_equal 1, workflow.role_id - assert_equal 2, workflow.tracker_id - end - assert workflows.detect {|wf| wf.old_status_id == 2 && wf.field_name == 'assigned_to_id' && wf.rule == 'readonly'} - assert workflows.detect {|wf| wf.old_status_id == 1 && wf.field_name == 'fixed_version_id' && wf.rule == 'required'} - assert workflows.detect {|wf| wf.old_status_id == 2 && wf.field_name == 'fixed_version_id' && wf.rule == 'readonly'} - end - - def test_post_permissions_should_clear_permissions - WorkflowPermission.delete_all - WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'assigned_to_id', :rule => 'required') - WorkflowPermission.create!(:role_id => 1, :tracker_id => 2, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') - wf1 = WorkflowPermission.create!(:role_id => 1, :tracker_id => 3, :old_status_id => 2, :field_name => 'fixed_version_id', :rule => 'required') - wf2 = WorkflowPermission.create!(:role_id => 2, :tracker_id => 2, :old_status_id => 3, :field_name => 'fixed_version_id', :rule => 'readonly') - - post :permissions, :role_id => 1, :tracker_id => 2 - assert_redirected_to '/workflows/permissions?role_id=1&tracker_id=2' - - workflows = WorkflowPermission.all - assert_equal 2, workflows.size - assert wf1.reload - assert wf2.reload - end - - def test_get_copy - get :copy - assert_response :success - assert_template 'copy' - assert_select 'select[name=source_tracker_id]' do - assert_select 'option[value=1]', :text => 'Bug' - end - assert_select 'select[name=source_role_id]' do - assert_select 'option[value=2]', :text => 'Developer' - end - assert_select 'select[name=?]', 'target_tracker_ids[]' do - assert_select 'option[value=3]', :text => 'Support request' - end - assert_select 'select[name=?]', 'target_role_ids[]' do - assert_select 'option[value=1]', :text => 'Manager' - end - end - - def test_post_copy_one_to_one - source_transitions = status_transitions(:tracker_id => 1, :role_id => 2) - - post :copy, :source_tracker_id => '1', :source_role_id => '2', - :target_tracker_ids => ['3'], :target_role_ids => ['1'] - assert_response 302 - assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 1) - end - - def test_post_copy_one_to_many - source_transitions = status_transitions(:tracker_id => 1, :role_id => 2) - - post :copy, :source_tracker_id => '1', :source_role_id => '2', - :target_tracker_ids => ['2', '3'], :target_role_ids => ['1', '3'] - assert_response 302 - assert_equal source_transitions, status_transitions(:tracker_id => 2, :role_id => 1) - assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 1) - assert_equal source_transitions, status_transitions(:tracker_id => 2, :role_id => 3) - assert_equal source_transitions, status_transitions(:tracker_id => 3, :role_id => 3) - end - - def test_post_copy_many_to_many - source_t2 = status_transitions(:tracker_id => 2, :role_id => 2) - source_t3 = status_transitions(:tracker_id => 3, :role_id => 2) - - post :copy, :source_tracker_id => 'any', :source_role_id => '2', - :target_tracker_ids => ['2', '3'], :target_role_ids => ['1', '3'] - assert_response 302 - assert_equal source_t2, status_transitions(:tracker_id => 2, :role_id => 1) - assert_equal source_t3, status_transitions(:tracker_id => 3, :role_id => 1) - assert_equal source_t2, status_transitions(:tracker_id => 2, :role_id => 3) - assert_equal source_t3, status_transitions(:tracker_id => 3, :role_id => 3) - end - - def test_post_copy_with_incomplete_source_specification_should_fail - assert_no_difference 'WorkflowRule.count' do - post :copy, - :source_tracker_id => '', :source_role_id => '2', - :target_tracker_ids => ['2', '3'], :target_role_ids => ['1', '3'] - assert_response 200 - assert_select 'div.flash.error', :text => 'Please select a source tracker or role' - end - end - - def test_post_copy_with_incomplete_target_specification_should_fail - assert_no_difference 'WorkflowRule.count' do - post :copy, - :source_tracker_id => '1', :source_role_id => '2', - :target_tracker_ids => ['2', '3'] - assert_response 200 - assert_select 'div.flash.error', :text => 'Please select target tracker(s) and role(s)' - end - end - - # Returns an array of status transitions that can be compared - def status_transitions(conditions) - WorkflowTransition. - where(conditions). - order('tracker_id, role_id, old_status_id, new_status_id'). - all. - collect {|w| [w.old_status, w.new_status_id]} - end -end diff --git a/test/functional/zipdown_controller_test.rb b/test/functional/zipdown_controller_test.rb deleted file mode 100644 index f74dcc1c0..000000000 --- a/test/functional/zipdown_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ZipdownControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/integration/account_test.rb b/test/integration/account_test.rb deleted file mode 100644 index fcb3ce4f8..000000000 --- a/test/integration/account_test.rb +++ /dev/null @@ -1,212 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -begin - require 'mocha/setup' -rescue - # Won't run some tests -end - -class AccountTest < ActionController::IntegrationTest - fixtures :users, :roles - - # Replace this with your real tests. - def test_login - get "my/page" - assert_redirected_to "/login?back_url=http%3A%2F%2Fwww.example.com%2Fmy%2Fpage" - log_user('jsmith', 'jsmith') - - get "my/account" - assert_response :success - assert_template "my/account" - end - - def test_autologin - user = User.find(1) - Setting.autologin = "7" - Token.delete_all - - # User logs in with 'autologin' checked - post '/login', :username => user.login, :password => 'admin', :autologin => 1 - assert_redirected_to '/my/page' - token = Token.first - assert_not_nil token - assert_equal user, token.user - assert_equal 'autologin', token.action - assert_equal user.id, session[:user_id] - assert_equal token.value, cookies['autologin'] - - # Session is cleared - reset! - User.current = nil - # Clears user's last login timestamp - user.update_attribute :last_login_on, nil - assert_nil user.reload.last_login_on - - # User comes back with his autologin cookie - cookies[:autologin] = token.value - get '/my/page' - assert_response :success - assert_template 'my/page' - assert_equal user.id, session[:user_id] - assert_not_nil user.reload.last_login_on - end - - def test_autologin_should_use_autologin_cookie_name - Token.delete_all - Redmine::Configuration.stubs(:[]).with('autologin_cookie_name').returns('custom_autologin') - Redmine::Configuration.stubs(:[]).with('autologin_cookie_path').returns('/') - Redmine::Configuration.stubs(:[]).with('autologin_cookie_secure').returns(false) - - with_settings :autologin => '7' do - assert_difference 'Token.count' do - post '/login', :username => 'admin', :password => 'admin', :autologin => 1 - end - assert_response 302 - assert cookies['custom_autologin'].present? - token = cookies['custom_autologin'] - - # Session is cleared - reset! - cookies['custom_autologin'] = token - get '/my/page' - assert_response :success - - assert_difference 'Token.count', -1 do - post '/logout' - end - assert cookies['custom_autologin'].blank? - end - end - - def test_lost_password - Token.delete_all - - get "account/lost_password" - assert_response :success - assert_template "account/lost_password" - assert_select 'input[name=mail]' - - post "account/lost_password", :mail => 'jSmith@somenet.foo' - assert_redirected_to "/login" - - token = Token.first - assert_equal 'recovery', token.action - assert_equal 'jsmith@somenet.foo', token.user.mail - assert !token.expired? - - get "account/lost_password", :token => token.value - assert_response :success - assert_template "account/password_recovery" - assert_select 'input[type=hidden][name=token][value=?]', token.value - assert_select 'input[name=new_password]' - assert_select 'input[name=new_password_confirmation]' - - post "account/lost_password", :token => token.value, :new_password => 'newpass123', :new_password_confirmation => 'newpass123' - assert_redirected_to "/login" - assert_equal 'Password was successfully updated.', flash[:notice] - - log_user('jsmith', 'newpass123') - assert_equal 0, Token.count - end - - def test_register_with_automatic_activation - Setting.self_registration = '3' - - get 'account/register' - assert_response :success - assert_template 'account/register' - - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} - assert_redirected_to '/my/account' - follow_redirect! - assert_response :success - assert_template 'my/account' - - user = User.find_by_login('newuser') - assert_not_nil user - assert user.active? - assert_not_nil user.last_login_on - end - - def test_register_with_manual_activation - Setting.self_registration = '2' - - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} - assert_redirected_to '/login' - assert !User.find_by_login('newuser').active? - end - - def test_register_with_email_activation - Setting.self_registration = '1' - Token.delete_all - - post 'account/register', :user => {:login => "newuser", :language => "en", :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar", - :password => "newpass123", :password_confirmation => "newpass123"} - assert_redirected_to '/login' - assert !User.find_by_login('newuser').active? - - token = Token.first - assert_equal 'register', token.action - assert_equal 'newuser@foo.bar', token.user.mail - assert !token.expired? - - get 'account/activate', :token => token.value - assert_redirected_to '/login' - log_user('newuser', 'newpass123') - end - - def test_onthefly_registration - # disable registration - Setting.self_registration = '0' - AuthSource.expects(:authenticate).returns({:login => 'foo', :firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com', :auth_source_id => 66}) - - post '/login', :username => 'foo', :password => 'bar' - assert_redirected_to '/my/page' - - user = User.find_by_login('foo') - assert user.is_a?(User) - assert_equal 66, user.auth_source_id - assert user.hashed_password.blank? - end - - def test_onthefly_registration_with_invalid_attributes - # disable registration - Setting.self_registration = '0' - AuthSource.expects(:authenticate).returns({:login => 'foo', :lastname => 'Smith', :auth_source_id => 66}) - - post '/login', :username => 'foo', :password => 'bar' - assert_response :success - assert_template 'account/register' - assert_tag :input, :attributes => { :name => 'user[firstname]', :value => '' } - assert_tag :input, :attributes => { :name => 'user[lastname]', :value => 'Smith' } - assert_no_tag :input, :attributes => { :name => 'user[login]' } - assert_no_tag :input, :attributes => { :name => 'user[password]' } - - post 'account/register', :user => {:firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com'} - assert_redirected_to '/my/account' - - user = User.find_by_login('foo') - assert user.is_a?(User) - assert_equal 66, user.auth_source_id - assert user.hashed_password.blank? - end -end diff --git a/test/integration/admin_test.rb b/test/integration/admin_test.rb deleted file mode 100644 index 3dfd4a1c3..000000000 --- a/test/integration/admin_test.rb +++ /dev/null @@ -1,61 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AdminTest < ActionController::IntegrationTest - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def test_add_user - log_user("admin", "admin") - get "/users/new" - assert_response :success - assert_template "users/new" - post "/users", - :user => { :login => "psmith", :firstname => "Paul", - :lastname => "Smith", :mail => "psmith@somenet.foo", - :language => "en", :password => "psmith09", - :password_confirmation => "psmith09" } - - user = User.find_by_login("psmith") - assert_kind_of User, user - assert_redirected_to "/users/#{ user.id }/edit" - - logged_user = User.try_to_login("psmith", "psmith09") - assert_kind_of User, logged_user - assert_equal "Paul", logged_user.firstname - - put "users/#{user.id}", :id => user.id, :user => { :status => User::STATUS_LOCKED } - assert_redirected_to "/users/#{ user.id }/edit" - locked_user = User.try_to_login("psmith", "psmith09") - assert_equal nil, locked_user - end - - test "Add a user as an anonymous user should fail" do - post '/users', - :user => { :login => 'psmith', :firstname => 'Paul'}, - :password => "psmith09", :password_confirmation => "psmith09" - assert_response :redirect - assert_redirected_to "/login?back_url=http%3A%2F%2Fwww.example.com%2Fusers" - end -end diff --git a/test/integration/api_test/attachments_test.rb b/test/integration/api_test/attachments_test.rb deleted file mode 100644 index c8a0132a5..000000000 --- a/test/integration/api_test/attachments_test.rb +++ /dev/null @@ -1,149 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::AttachmentsTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :attachments - - def setup - Setting.rest_api_enabled = '1' - set_fixtures_attachments_directory - end - - def teardown - set_tmp_attachments_directory - end - - test "GET /attachments/:id.xml should return the attachment" do - get '/attachments/7.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'attachment', - :child => { - :tag => 'id', - :content => '7', - :sibling => { - :tag => 'filename', - :content => 'archive.zip', - :sibling => { - :tag => 'content_url', - :content => 'http://www.example.com/attachments/download/7/archive.zip' - } - } - } - end - - test "GET /attachments/:id.xml should deny access without credentials" do - get '/attachments/7.xml' - assert_response 401 - set_tmp_attachments_directory - end - - test "GET /attachments/download/:id/:filename should return the attachment content" do - get '/attachments/download/7/archive.zip', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/octet-stream', @response.content_type - set_tmp_attachments_directory - end - - test "GET /attachments/download/:id/:filename should deny access without credentials" do - get '/attachments/download/7/archive.zip' - assert_response 302 - set_tmp_attachments_directory - end - - test "POST /uploads.xml should return the token" do - set_tmp_attachments_directory - assert_difference 'Attachment.count' do - post '/uploads.xml', 'File content', {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response :created - assert_equal 'application/xml', response.content_type - end - - xml = Hash.from_xml(response.body) - assert_kind_of Hash, xml['upload'] - token = xml['upload']['token'] - assert_not_nil token - - attachment = Attachment.first(:order => 'id DESC') - assert_equal token, attachment.token - assert_nil attachment.container - assert_equal 2, attachment.author_id - assert_equal 'File content'.size, attachment.filesize - assert attachment.content_type.blank? - assert attachment.filename.present? - assert_match /\d+_[0-9a-z]+/, attachment.diskfile - assert File.exist?(attachment.diskfile) - assert_equal 'File content', File.read(attachment.diskfile) - end - - test "POST /uploads.json should return the token" do - set_tmp_attachments_directory - assert_difference 'Attachment.count' do - post '/uploads.json', 'File content', {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response :created - assert_equal 'application/json', response.content_type - end - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json['upload'] - token = json['upload']['token'] - assert_not_nil token - - attachment = Attachment.first(:order => 'id DESC') - assert_equal token, attachment.token - end - - test "POST /uploads.xml should accept :filename param as the attachment filename" do - set_tmp_attachments_directory - assert_difference 'Attachment.count' do - post '/uploads.xml?filename=test.txt', 'File content', {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response :created - end - - attachment = Attachment.order('id DESC').first - assert_equal 'test.txt', attachment.filename - assert_match /_test\.txt$/, attachment.diskfile - end - - test "POST /uploads.xml should not accept other content types" do - set_tmp_attachments_directory - assert_no_difference 'Attachment.count' do - post '/uploads.xml', 'PNG DATA', {"CONTENT_TYPE" => 'image/png'}.merge(credentials('jsmith')) - assert_response 406 - end - end - - test "POST /uploads.xml should return errors if file is too big" do - set_tmp_attachments_directory - with_settings :attachment_max_size => 1 do - assert_no_difference 'Attachment.count' do - post '/uploads.xml', ('x' * 2048), {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response 422 - assert_tag 'error', :content => /exceeds the maximum allowed file size/ - end - end - end -end diff --git a/test/integration/api_test/authentication_test.rb b/test/integration/api_test/authentication_test.rb deleted file mode 100644 index 61b44d4d8..000000000 --- a/test/integration/api_test/authentication_test.rb +++ /dev/null @@ -1,73 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::AuthenticationTest < Redmine::ApiTest::Base - fixtures :users - - def setup - Setting.rest_api_enabled = '1' - end - - def teardown - Setting.rest_api_enabled = '0' - end - - def test_api_request_should_not_use_user_session - log_user('jsmith', 'jsmith') - - get '/users/current' - assert_response :success - - get '/users/current.json' - assert_response 401 - end - - def test_api_should_accept_switch_user_header_for_admin_user - user = User.find(1) - su = User.find(4) - - get '/users/current', {}, {'X-Redmine-API-Key' => user.api_key, 'X-Redmine-Switch-User' => su.login} - assert_response :success - assert_equal su, assigns(:user) - assert_equal su, User.current - end - - def test_api_should_respond_with_412_when_trying_to_switch_to_a_invalid_user - get '/users/current', {}, {'X-Redmine-API-Key' => User.find(1).api_key, 'X-Redmine-Switch-User' => 'foobar'} - assert_response 412 - end - - def test_api_should_respond_with_412_when_trying_to_switch_to_a_locked_user - user = User.find(5) - assert user.locked? - - get '/users/current', {}, {'X-Redmine-API-Key' => User.find(1).api_key, 'X-Redmine-Switch-User' => user.login} - assert_response 412 - end - - def test_api_should_not_accept_switch_user_header_for_non_admin_user - user = User.find(2) - su = User.find(4) - - get '/users/current', {}, {'X-Redmine-API-Key' => user.api_key, 'X-Redmine-Switch-User' => su.login} - assert_response :success - assert_equal user, assigns(:user) - assert_equal user, User.current - end -end diff --git a/test/integration/api_test/disabled_rest_api_test.rb b/test/integration/api_test/disabled_rest_api_test.rb deleted file mode 100644 index e40e98824..000000000 --- a/test/integration/api_test/disabled_rest_api_test.rb +++ /dev/null @@ -1,78 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::DisabledRestApiTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def setup - Setting.rest_api_enabled = '0' - Setting.login_required = '1' - end - - def teardown - Setting.rest_api_enabled = '1' - Setting.login_required = '0' - end - - def test_with_a_valid_api_token - @user = User.generate! - @token = Token.create!(:user => @user, :action => 'api') - - get "/news.xml?key=#{@token.value}" - assert_response :unauthorized - assert_equal User.anonymous, User.current - - get "/news.json?key=#{@token.value}" - assert_response :unauthorized - assert_equal User.anonymous, User.current - end - - def test_with_valid_username_password_http_authentication - @user = User.generate! do |user| - user.password = 'my_password' - end - - get "/news.xml", nil, credentials(@user.login, 'my_password') - assert_response :unauthorized - assert_equal User.anonymous, User.current - - get "/news.json", nil, credentials(@user.login, 'my_password') - assert_response :unauthorized - assert_equal User.anonymous, User.current - end - - def test_with_valid_token_http_authentication - @user = User.generate! - @token = Token.create!(:user => @user, :action => 'api') - - get "/news.xml", nil, credentials(@token.value, 'X') - assert_response :unauthorized - assert_equal User.anonymous, User.current - - get "/news.json", nil, credentials(@token.value, 'X') - assert_response :unauthorized - assert_equal User.anonymous, User.current - end -end diff --git a/test/integration/api_test/enumerations_test.rb b/test/integration/api_test/enumerations_test.rb deleted file mode 100644 index cf9b8cbac..000000000 --- a/test/integration/api_test/enumerations_test.rb +++ /dev/null @@ -1,44 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::EnumerationsTest < Redmine::ApiTest::Base - fixtures :enumerations - - def setup - Setting.rest_api_enabled = '1' - end - - context "/enumerations/issue_priorities" do - context "GET" do - - should "return priorities" do - get '/enumerations/issue_priorities.xml' - - assert_response :success - assert_equal 'application/xml', response.content_type - assert_select 'issue_priorities[type=array]' do - assert_select 'issue_priority' do - assert_select 'id', :text => '6' - assert_select 'name', :text => 'High' - end - end - end - end - end -end diff --git a/test/integration/api_test/groups_test.rb b/test/integration/api_test/groups_test.rb deleted file mode 100644 index cedbb07b0..000000000 --- a/test/integration/api_test/groups_test.rb +++ /dev/null @@ -1,212 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::GroupsTest < Redmine::ApiTest::Base - fixtures :users, :groups_users - - def setup - Setting.rest_api_enabled = '1' - end - - context "GET /groups" do - context ".xml" do - should "require authentication" do - get '/groups.xml' - assert_response 401 - end - - should "return groups" do - get '/groups.xml', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'groups' do - assert_select 'group' do - assert_select 'name', :text => 'A Team' - assert_select 'id', :text => '10' - end - end - end - end - - context ".json" do - should "require authentication" do - get '/groups.json' - assert_response 401 - end - - should "return groups" do - get '/groups.json', {}, credentials('admin') - assert_response :success - assert_equal 'application/json', response.content_type - - json = MultiJson.load(response.body) - groups = json['groups'] - assert_kind_of Array, groups - group = groups.detect {|g| g['name'] == 'A Team'} - assert_not_nil group - assert_equal({'id' => 10, 'name' => 'A Team'}, group) - end - end - end - - context "GET /groups/:id" do - context ".xml" do - should "return the group with its users" do - get '/groups/10.xml', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'name', :text => 'A Team' - assert_select 'id', :text => '10' - end - end - - should "include users if requested" do - get '/groups/10.xml?include=users', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'users' do - assert_select 'user', Group.find(10).users.count - assert_select 'user[id=8]' - end - end - end - - should "include memberships if requested" do - get '/groups/10.xml?include=memberships', {}, credentials('admin') - assert_response :success - assert_equal 'application/xml', response.content_type - - assert_select 'group' do - assert_select 'memberships' - end - end - end - end - - context "POST /groups" do - context "with valid parameters" do - context ".xml" do - should "create groups" do - assert_difference('Group.count') do - post '/groups.xml', {:group => {:name => 'Test', :user_ids => [2, 3]}}, credentials('admin') - assert_response :created - assert_equal 'application/xml', response.content_type - end - - group = Group.order('id DESC').first - assert_equal 'Test', group.name - assert_equal [2, 3], group.users.map(&:id).sort - - assert_select 'group' do - assert_select 'name', :text => 'Test' - end - end - end - end - - context "with invalid parameters" do - context ".xml" do - should "return errors" do - assert_no_difference('Group.count') do - post '/groups.xml', {:group => {:name => ''}}, credentials('admin') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', response.content_type - - assert_select 'errors' do - assert_select 'error', :text => /Name can't be blank/ - end - end - end - end - end - - context "PUT /groups/:id" do - context "with valid parameters" do - context ".xml" do - should "update the group" do - put '/groups/10.xml', {:group => {:name => 'New name', :user_ids => [2, 3]}}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - - group = Group.find(10) - assert_equal 'New name', group.name - assert_equal [2, 3], group.users.map(&:id).sort - end - end - end - - context "with invalid parameters" do - context ".xml" do - should "return errors" do - put '/groups/10.xml', {:group => {:name => ''}}, credentials('admin') - assert_response :unprocessable_entity - assert_equal 'application/xml', response.content_type - - assert_select 'errors' do - assert_select 'error', :text => /Name can't be blank/ - end - end - end - end - end - - context "DELETE /groups/:id" do - context ".xml" do - should "delete the group" do - assert_difference 'Group.count', -1 do - delete '/groups/10.xml', {}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - end - end - end - - context "POST /groups/:id/users" do - context ".xml" do - should "add user to the group" do - assert_difference 'Group.find(10).users.count' do - post '/groups/10/users.xml', {:user_id => 5}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - assert_include User.find(5), Group.find(10).users - end - end - end - - context "DELETE /groups/:id/users/:user_id" do - context ".xml" do - should "remove user from the group" do - assert_difference 'Group.find(10).users.count', -1 do - delete '/groups/10/users/8.xml', {}, credentials('admin') - assert_response :ok - assert_equal '', @response.body - end - assert_not_include User.find(8), Group.find(10).users - end - end - end -end diff --git a/test/integration/api_test/http_basic_login_test.rb b/test/integration/api_test/http_basic_login_test.rb deleted file mode 100644 index 217c3ac6d..000000000 --- a/test/integration/api_test/http_basic_login_test.rb +++ /dev/null @@ -1,54 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::HttpBasicLoginTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def setup - Setting.rest_api_enabled = '1' - Setting.login_required = '1' - end - - def teardown - Setting.rest_api_enabled = '0' - Setting.login_required = '0' - end - - # Using the NewsController because it's a simple API. - context "get /news" do - setup do - project = Project.find('onlinestore') - EnabledModule.create(:project => project, :name => 'news') - end - - context "in :xml format" do - should_allow_http_basic_auth_with_username_and_password(:get, "/projects/onlinestore/news.xml") - end - - context "in :json format" do - should_allow_http_basic_auth_with_username_and_password(:get, "/projects/onlinestore/news.json") - end - end -end diff --git a/test/integration/api_test/http_basic_login_with_api_token_test.rb b/test/integration/api_test/http_basic_login_with_api_token_test.rb deleted file mode 100644 index cda237b72..000000000 --- a/test/integration/api_test/http_basic_login_with_api_token_test.rb +++ /dev/null @@ -1,50 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::HttpBasicLoginWithApiTokenTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def setup - Setting.rest_api_enabled = '1' - Setting.login_required = '1' - end - - def teardown - Setting.rest_api_enabled = '0' - Setting.login_required = '0' - end - - # Using the NewsController because it's a simple API. - context "get /news" do - - context "in :xml format" do - should_allow_http_basic_auth_with_key(:get, "/news.xml") - end - - context "in :json format" do - should_allow_http_basic_auth_with_key(:get, "/news.json") - end - end -end diff --git a/test/integration/api_test/issue_categories_test.rb b/test/integration/api_test/issue_categories_test.rb deleted file mode 100644 index 2644b3911..000000000 --- a/test/integration/api_test/issue_categories_test.rb +++ /dev/null @@ -1,126 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::IssueCategoriesTest < Redmine::ApiTest::Base - fixtures :projects, :users, :issue_categories, :issues, - :roles, - :member_roles, - :members, - :enabled_modules - - def setup - Setting.rest_api_enabled = '1' - end - - context "GET /projects/:project_id/issue_categories.xml" do - should "return issue categories" do - get '/projects/1/issue_categories.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_categories', - :child => {:tag => 'issue_category', :child => {:tag => 'id', :content => '2'}} - end - end - - context "GET /issue_categories/2.xml" do - should "return requested issue category" do - get '/issue_categories/2.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_category', - :child => {:tag => 'id', :content => '2'} - end - end - - context "POST /projects/:project_id/issue_categories.xml" do - should "return create issue category" do - assert_difference 'IssueCategory.count' do - post '/projects/1/issue_categories.xml', {:issue_category => {:name => 'API'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - category = IssueCategory.first(:order => 'id DESC') - assert_equal 'API', category.name - assert_equal 1, category.project_id - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'IssueCategory.count' do - post '/projects/1/issue_categories.xml', {:issue_category => {:name => ''}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end - end - end - - context "PUT /issue_categories/2.xml" do - context "with valid parameters" do - should "update issue category" do - assert_no_difference 'IssueCategory.count' do - put '/issue_categories/2.xml', {:issue_category => {:name => 'API Update'}}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'API Update', IssueCategory.find(2).name - end - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'IssueCategory.count' do - put '/issue_categories/2.xml', {:issue_category => {:name => ''}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end - end - end - - context "DELETE /issue_categories/1.xml" do - should "destroy issue categories" do - assert_difference 'IssueCategory.count', -1 do - delete '/issue_categories/1.xml', {}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_nil IssueCategory.find_by_id(1) - end - - should "reassign issues with :reassign_to_id param" do - issue_count = Issue.count(:conditions => {:category_id => 1}) - assert issue_count > 0 - - assert_difference 'IssueCategory.count', -1 do - assert_difference 'Issue.count(:conditions => {:category_id => 2})', 3 do - delete '/issue_categories/1.xml', {:reassign_to_id => 2}, credentials('jsmith') - end - end - assert_response :ok - assert_equal '', @response.body - assert_nil IssueCategory.find_by_id(1) - end - end -end diff --git a/test/integration/api_test/issue_relations_test.rb b/test/integration/api_test/issue_relations_test.rb deleted file mode 100644 index ceb4713b5..000000000 --- a/test/integration/api_test/issue_relations_test.rb +++ /dev/null @@ -1,106 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::IssueRelationsTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :issue_relations - - def setup - Setting.rest_api_enabled = '1' - end - - context "/issues/:issue_id/relations" do - context "GET" do - should "return issue relations" do - get '/issues/9/relations.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'relations', - :attributes => { :type => 'array' }, - :child => { - :tag => 'relation', - :child => { - :tag => 'id', - :content => '1' - } - } - end - end - - context "POST" do - should "create a relation" do - assert_difference('IssueRelation.count') do - post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'relates'}}, credentials('jsmith') - end - - relation = IssueRelation.first(:order => 'id DESC') - assert_equal 2, relation.issue_from_id - assert_equal 7, relation.issue_to_id - assert_equal 'relates', relation.relation_type - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'relation', :child => {:tag => 'id', :content => relation.id.to_s} - end - - context "with failure" do - should "return the errors" do - assert_no_difference('IssueRelation.count') do - post '/issues/2/relations.xml', {:relation => {:issue_to_id => 7, :relation_type => 'foo'}}, credentials('jsmith') - end - - assert_response :unprocessable_entity - assert_tag :errors, :child => {:tag => 'error', :content => /relation_type is not included in the list/} - end - end - end - end - - context "/relations/:id" do - context "GET" do - should "return the relation" do - get '/relations/2.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag 'relation', :child => {:tag => 'id', :content => '2'} - end - end - - context "DELETE" do - should "delete the relation" do - assert_difference('IssueRelation.count', -1) do - delete '/relations/2.xml', {}, credentials('jsmith') - end - - assert_response :ok - assert_equal '', @response.body - assert_nil IssueRelation.find_by_id(2) - end - end - end -end diff --git a/test/integration/api_test/issue_statuses_test.rb b/test/integration/api_test/issue_statuses_test.rb deleted file mode 100644 index a17a25a54..000000000 --- a/test/integration/api_test/issue_statuses_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::IssueStatusesTest < Redmine::ApiTest::Base - fixtures :issue_statuses - - def setup - Setting.rest_api_enabled = '1' - end - - context "/issue_statuses" do - context "GET" do - - should "return issue statuses" do - get '/issue_statuses.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'issue_statuses', - :attributes => {:type => 'array'}, - :child => { - :tag => 'issue_status', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Assigned' - } - } - } - end - end - end -end diff --git a/test/integration/api_test/issues_test.rb b/test/integration/api_test/issues_test.rb deleted file mode 100644 index 53cc954f1..000000000 --- a/test/integration/api_test/issues_test.rb +++ /dev/null @@ -1,846 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::IssuesTest < Redmine::ApiTest::Base - fixtures :projects, - :users, - :roles, - :members, - :member_roles, - :issues, - :issue_statuses, - :issue_relations, - :versions, - :trackers, - :projects_trackers, - :issue_categories, - :enabled_modules, - :enumerations, - :attachments, - :workflows, - :custom_fields, - :custom_values, - :custom_fields_projects, - :custom_fields_trackers, - :time_entries, - :journals, - :journal_details, - :queries, - :attachments - - def setup - Setting.rest_api_enabled = '1' - end - - context "/issues" do - # Use a private project to make sure auth is really working and not just - # only showing public issues. - should_allow_api_authentication(:get, "/projects/private-child/issues.xml") - - should "contain metadata" do - get '/issues.xml' - - assert_tag :tag => 'issues', - :attributes => { - :type => 'array', - :total_count => assigns(:issue_count), - :limit => 25, - :offset => 0 - } - end - - context "with offset and limit" do - should "use the params" do - get '/issues.xml?offset=2&limit=3' - - assert_equal 3, assigns(:limit) - assert_equal 2, assigns(:offset) - assert_tag :tag => 'issues', :children => {:count => 3, :only => {:tag => 'issue'}} - end - end - - context "with nometa param" do - should "not contain metadata" do - get '/issues.xml?nometa=1' - - assert_tag :tag => 'issues', - :attributes => { - :type => 'array', - :total_count => nil, - :limit => nil, - :offset => nil - } - end - end - - context "with nometa header" do - should "not contain metadata" do - get '/issues.xml', {}, {'X-Redmine-Nometa' => '1'} - - assert_tag :tag => 'issues', - :attributes => { - :type => 'array', - :total_count => nil, - :limit => nil, - :offset => nil - } - end - end - - context "with relations" do - should "display relations" do - get '/issues.xml?include=relations' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag 'relations', - :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '3'}}, - :children => {:count => 1}, - :child => { - :tag => 'relation', - :attributes => {:id => '2', :issue_id => '2', :issue_to_id => '3', - :relation_type => 'relates'} - } - assert_tag 'relations', - :parent => {:tag => 'issue', :child => {:tag => 'id', :content => '1'}}, - :children => {:count => 0} - end - end - - context "with invalid query params" do - should "return errors" do - get '/issues.xml', {:f => ['start_date'], :op => {:start_date => '='}} - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Start date can't be blank"} - end - end - - context "with custom field filter" do - should "show only issues with the custom field value" do - get '/issues.xml', - {:set_filter => 1, :f => ['cf_1'], :op => {:cf_1 => '='}, - :v => {:cf_1 => ['MySQL']}} - expected_ids = Issue.visible.all( - :include => :custom_values, - :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id) - assert_select 'issues > issue > id', :count => expected_ids.count do |ids| - ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } - end - end - end - - context "with custom field filter (shorthand method)" do - should "show only issues with the custom field value" do - get '/issues.xml', { :cf_1 => 'MySQL' } - - expected_ids = Issue.visible.all( - :include => :custom_values, - :conditions => {:custom_values => {:custom_field_id => 1, :value => 'MySQL'}}).map(&:id) - - assert_select 'issues > issue > id', :count => expected_ids.count do |ids| - ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } - end - end - end - end - - context "/index.json" do - should_allow_api_authentication(:get, "/projects/private-child/issues.json") - end - - context "/index.xml with filter" do - should "show only issues with the status_id" do - get '/issues.xml?status_id=5' - - expected_ids = Issue.visible.all(:conditions => {:status_id => 5}).map(&:id) - - assert_select 'issues > issue > id', :count => expected_ids.count do |ids| - ids.each { |id| assert expected_ids.delete(id.children.first.content.to_i) } - end - end - end - - context "/index.json with filter" do - should "show only issues with the status_id" do - get '/issues.json?status_id=5' - - json = ActiveSupport::JSON.decode(response.body) - status_ids_used = json['issues'].collect {|j| j['status']['id'] } - assert_equal 3, status_ids_used.length - assert status_ids_used.all? {|id| id == 5 } - end - - end - - # Issue 6 is on a private project - context "/issues/6.xml" do - should_allow_api_authentication(:get, "/issues/6.xml") - end - - context "/issues/6.json" do - should_allow_api_authentication(:get, "/issues/6.json") - end - - context "GET /issues/:id" do - context "with journals" do - context ".xml" do - should "display journals" do - get '/issues/1.xml?include=journals' - - assert_tag :tag => 'issue', - :child => { - :tag => 'journals', - :attributes => { :type => 'array' }, - :child => { - :tag => 'journal', - :attributes => { :id => '1'}, - :child => { - :tag => 'details', - :attributes => { :type => 'array' }, - :child => { - :tag => 'detail', - :attributes => { :name => 'status_id' }, - :child => { - :tag => 'old_value', - :content => '1', - :sibling => { - :tag => 'new_value', - :content => '2' - } - } - } - } - } - } - end - end - end - - context "with custom fields" do - context ".xml" do - should "display custom fields" do - get '/issues/3.xml' - - assert_tag :tag => 'issue', - :child => { - :tag => 'custom_fields', - :attributes => { :type => 'array' }, - :child => { - :tag => 'custom_field', - :attributes => { :id => '1'}, - :child => { - :tag => 'value', - :content => 'MySQL' - } - } - } - - assert_nothing_raised do - Hash.from_xml(response.body).to_xml - end - end - end - end - - context "with multi custom fields" do - setup do - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(3) - issue.custom_field_values = {1 => ['MySQL', 'Oracle']} - issue.save! - end - - context ".xml" do - should "display custom fields" do - get '/issues/3.xml' - assert_response :success - assert_tag :tag => 'issue', - :child => { - :tag => 'custom_fields', - :attributes => { :type => 'array' }, - :child => { - :tag => 'custom_field', - :attributes => { :id => '1'}, - :child => { - :tag => 'value', - :attributes => { :type => 'array' }, - :children => { :count => 2 } - } - } - } - - xml = Hash.from_xml(response.body) - custom_fields = xml['issue']['custom_fields'] - assert_kind_of Array, custom_fields - field = custom_fields.detect {|f| f['id'] == '1'} - assert_kind_of Hash, field - assert_equal ['MySQL', 'Oracle'], field['value'].sort - end - end - - context ".json" do - should "display custom fields" do - get '/issues/3.json' - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - custom_fields = json['issue']['custom_fields'] - assert_kind_of Array, custom_fields - field = custom_fields.detect {|f| f['id'] == 1} - assert_kind_of Hash, field - assert_equal ['MySQL', 'Oracle'], field['value'].sort - end - end - end - - context "with empty value for multi custom field" do - setup do - field = CustomField.find(1) - field.update_attribute :multiple, true - issue = Issue.find(3) - issue.custom_field_values = {1 => ['']} - issue.save! - end - - context ".xml" do - should "display custom fields" do - get '/issues/3.xml' - assert_response :success - assert_tag :tag => 'issue', - :child => { - :tag => 'custom_fields', - :attributes => { :type => 'array' }, - :child => { - :tag => 'custom_field', - :attributes => { :id => '1'}, - :child => { - :tag => 'value', - :attributes => { :type => 'array' }, - :children => { :count => 0 } - } - } - } - - xml = Hash.from_xml(response.body) - custom_fields = xml['issue']['custom_fields'] - assert_kind_of Array, custom_fields - field = custom_fields.detect {|f| f['id'] == '1'} - assert_kind_of Hash, field - assert_equal [], field['value'] - end - end - - context ".json" do - should "display custom fields" do - get '/issues/3.json' - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - custom_fields = json['issue']['custom_fields'] - assert_kind_of Array, custom_fields - field = custom_fields.detect {|f| f['id'] == 1} - assert_kind_of Hash, field - assert_equal [], field['value'].sort - end - end - end - - context "with attachments" do - context ".xml" do - should "display attachments" do - get '/issues/3.xml?include=attachments' - - assert_tag :tag => 'issue', - :child => { - :tag => 'attachments', - :children => {:count => 5}, - :child => { - :tag => 'attachment', - :child => { - :tag => 'filename', - :content => 'source.rb', - :sibling => { - :tag => 'content_url', - :content => 'http://www.example.com/attachments/download/4/source.rb' - } - } - } - } - end - end - end - - context "with subtasks" do - setup do - @c1 = Issue.create!( - :status_id => 1, :subject => "child c1", - :tracker_id => 1, :project_id => 1, :author_id => 1, - :parent_issue_id => 1 - ) - @c2 = Issue.create!( - :status_id => 1, :subject => "child c2", - :tracker_id => 1, :project_id => 1, :author_id => 1, - :parent_issue_id => 1 - ) - @c3 = Issue.create!( - :status_id => 1, :subject => "child c3", - :tracker_id => 1, :project_id => 1, :author_id => 1, - :parent_issue_id => @c1.id - ) - end - - context ".xml" do - should "display children" do - get '/issues/1.xml?include=children' - - assert_tag :tag => 'issue', - :child => { - :tag => 'children', - :children => {:count => 2}, - :child => { - :tag => 'issue', - :attributes => {:id => @c1.id.to_s}, - :child => { - :tag => 'subject', - :content => 'child c1', - :sibling => { - :tag => 'children', - :children => {:count => 1}, - :child => { - :tag => 'issue', - :attributes => {:id => @c3.id.to_s} - } - } - } - } - } - end - - context ".json" do - should "display children" do - get '/issues/1.json?include=children' - - json = ActiveSupport::JSON.decode(response.body) - assert_equal([ - { - 'id' => @c1.id, 'subject' => 'child c1', 'tracker' => {'id' => 1, 'name' => 'Bug'}, - 'children' => [{'id' => @c3.id, 'subject' => 'child c3', - 'tracker' => {'id' => 1, 'name' => 'Bug'} }] - }, - { 'id' => @c2.id, 'subject' => 'child c2', 'tracker' => {'id' => 1, 'name' => 'Bug'} } - ], - json['issue']['children']) - end - end - end - end - end - - test "GET /issues/:id.xml?include=watchers should include watchers" do - Watcher.create!(:user_id => 3, :watchable => Issue.find(1)) - - get '/issues/1.xml?include=watchers', {}, credentials('jsmith') - - assert_response :ok - assert_equal 'application/xml', response.content_type - assert_select 'issue' do - assert_select 'watchers', Issue.find(1).watchers.count - assert_select 'watchers' do - assert_select 'user[id=3]' - end - end - end - - context "POST /issues.xml" do - should_allow_api_authentication( - :post, - '/issues.xml', - {:issue => {:project_id => 1, :subject => 'API test', :tracker_id => 2, :status_id => 3}}, - {:success_code => :created} - ) - should "create an issue with the attributes" do - assert_difference('Issue.count') do - post '/issues.xml', - {:issue => {:project_id => 1, :subject => 'API test', - :tracker_id => 2, :status_id => 3}}, credentials('jsmith') - end - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 3, issue.status_id - assert_equal 'API test', issue.subject - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'issue', :child => {:tag => 'id', :content => issue.id.to_s} - end - end - - test "POST /issues.xml with watcher_user_ids should create issue with watchers" do - assert_difference('Issue.count') do - post '/issues.xml', - {:issue => {:project_id => 1, :subject => 'Watchers', - :tracker_id => 2, :status_id => 3, :watcher_user_ids => [3, 1]}}, credentials('jsmith') - assert_response :created - end - issue = Issue.order('id desc').first - assert_equal 2, issue.watchers.size - assert_equal [1, 3], issue.watcher_user_ids.sort - end - - context "POST /issues.xml with failure" do - should "have an errors tag" do - assert_no_difference('Issue.count') do - post '/issues.xml', {:issue => {:project_id => 1}}, credentials('jsmith') - end - - assert_tag :errors, :child => {:tag => 'error', :content => "Subject can't be blank"} - end - end - - context "POST /issues.json" do - should_allow_api_authentication(:post, - '/issues.json', - {:issue => {:project_id => 1, :subject => 'API test', - :tracker_id => 2, :status_id => 3}}, - {:success_code => :created}) - - should "create an issue with the attributes" do - assert_difference('Issue.count') do - post '/issues.json', - {:issue => {:project_id => 1, :subject => 'API test', - :tracker_id => 2, :status_id => 3}}, - credentials('jsmith') - end - - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.project_id - assert_equal 2, issue.tracker_id - assert_equal 3, issue.status_id - assert_equal 'API test', issue.subject - end - - end - - context "POST /issues.json with failure" do - should "have an errors element" do - assert_no_difference('Issue.count') do - post '/issues.json', {:issue => {:project_id => 1}}, credentials('jsmith') - end - - json = ActiveSupport::JSON.decode(response.body) - assert json['errors'].include?("Subject can't be blank") - end - end - - # Issue 6 is on a private project - context "PUT /issues/6.xml" do - setup do - @parameters = {:issue => {:subject => 'API update', :notes => 'A new note'}} - end - - should_allow_api_authentication(:put, - '/issues/6.xml', - {:issue => {:subject => 'API update', :notes => 'A new note'}}, - {:success_code => :ok}) - - should "not create a new issue" do - assert_no_difference('Issue.count') do - put '/issues/6.xml', @parameters, credentials('jsmith') - end - end - - should "create a new journal" do - assert_difference('Journal.count') do - put '/issues/6.xml', @parameters, credentials('jsmith') - end - end - - should "add the note to the journal" do - put '/issues/6.xml', @parameters, credentials('jsmith') - - journal = Journal.last - assert_equal "A new note", journal.notes - end - - should "update the issue" do - put '/issues/6.xml', @parameters, credentials('jsmith') - - issue = Issue.find(6) - assert_equal "API update", issue.subject - end - - end - - context "PUT /issues/3.xml with custom fields" do - setup do - @parameters = { - :issue => {:custom_fields => [{'id' => '1', 'value' => 'PostgreSQL' }, - {'id' => '2', 'value' => '150'}]} - } - end - - should "update custom fields" do - assert_no_difference('Issue.count') do - put '/issues/3.xml', @parameters, credentials('jsmith') - end - - issue = Issue.find(3) - assert_equal '150', issue.custom_value_for(2).value - assert_equal 'PostgreSQL', issue.custom_value_for(1).value - end - end - - context "PUT /issues/3.xml with multi custom fields" do - setup do - field = CustomField.find(1) - field.update_attribute :multiple, true - @parameters = { - :issue => {:custom_fields => [{'id' => '1', 'value' => ['MySQL', 'PostgreSQL'] }, - {'id' => '2', 'value' => '150'}]} - } - end - - should "update custom fields" do - assert_no_difference('Issue.count') do - put '/issues/3.xml', @parameters, credentials('jsmith') - end - - issue = Issue.find(3) - assert_equal '150', issue.custom_value_for(2).value - assert_equal ['MySQL', 'PostgreSQL'], issue.custom_field_value(1).sort - end - end - - context "PUT /issues/3.xml with project change" do - setup do - @parameters = {:issue => {:project_id => 2, :subject => 'Project changed'}} - end - - should "update project" do - assert_no_difference('Issue.count') do - put '/issues/3.xml', @parameters, credentials('jsmith') - end - - issue = Issue.find(3) - assert_equal 2, issue.project_id - assert_equal 'Project changed', issue.subject - end - end - - context "PUT /issues/6.xml with failed update" do - setup do - @parameters = {:issue => {:subject => ''}} - end - - should "not create a new issue" do - assert_no_difference('Issue.count') do - put '/issues/6.xml', @parameters, credentials('jsmith') - end - end - - should "not create a new journal" do - assert_no_difference('Journal.count') do - put '/issues/6.xml', @parameters, credentials('jsmith') - end - end - - should "have an errors tag" do - put '/issues/6.xml', @parameters, credentials('jsmith') - - assert_tag :errors, :child => {:tag => 'error', :content => "Subject can't be blank"} - end - end - - context "PUT /issues/6.json" do - setup do - @parameters = {:issue => {:subject => 'API update', :notes => 'A new note'}} - end - - should_allow_api_authentication(:put, - '/issues/6.json', - {:issue => {:subject => 'API update', :notes => 'A new note'}}, - {:success_code => :ok}) - - should "update the issue" do - assert_no_difference('Issue.count') do - assert_difference('Journal.count') do - put '/issues/6.json', @parameters, credentials('jsmith') - - assert_response :ok - assert_equal '', response.body - end - end - - issue = Issue.find(6) - assert_equal "API update", issue.subject - journal = Journal.last - assert_equal "A new note", journal.notes - end - end - - context "PUT /issues/6.json with failed update" do - should "return errors" do - assert_no_difference('Issue.count') do - assert_no_difference('Journal.count') do - put '/issues/6.json', {:issue => {:subject => ''}}, credentials('jsmith') - - assert_response :unprocessable_entity - end - end - - json = ActiveSupport::JSON.decode(response.body) - assert json['errors'].include?("Subject can't be blank") - end - end - - context "DELETE /issues/1.xml" do - should_allow_api_authentication(:delete, - '/issues/6.xml', - {}, - {:success_code => :ok}) - - should "delete the issue" do - assert_difference('Issue.count', -1) do - delete '/issues/6.xml', {}, credentials('jsmith') - - assert_response :ok - assert_equal '', response.body - end - - assert_nil Issue.find_by_id(6) - end - end - - context "DELETE /issues/1.json" do - should_allow_api_authentication(:delete, - '/issues/6.json', - {}, - {:success_code => :ok}) - - should "delete the issue" do - assert_difference('Issue.count', -1) do - delete '/issues/6.json', {}, credentials('jsmith') - - assert_response :ok - assert_equal '', response.body - end - - assert_nil Issue.find_by_id(6) - end - end - - test "POST /issues/:id/watchers.xml should add watcher" do - assert_difference 'Watcher.count' do - post '/issues/1/watchers.xml', {:user_id => 3}, credentials('jsmith') - - assert_response :ok - assert_equal '', response.body - end - watcher = Watcher.order('id desc').first - assert_equal Issue.find(1), watcher.watchable - assert_equal User.find(3), watcher.user - end - - test "DELETE /issues/:id/watchers/:user_id.xml should remove watcher" do - Watcher.create!(:user_id => 3, :watchable => Issue.find(1)) - - assert_difference 'Watcher.count', -1 do - delete '/issues/1/watchers/3.xml', {}, credentials('jsmith') - - assert_response :ok - assert_equal '', response.body - end - assert_equal false, Issue.find(1).watched_by?(User.find(3)) - end - - def test_create_issue_with_uploaded_file - set_tmp_attachments_directory - # upload the file - assert_difference 'Attachment.count' do - post '/uploads.xml', 'test_create_with_upload', - {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response :created - end - xml = Hash.from_xml(response.body) - token = xml['upload']['token'] - attachment = Attachment.first(:order => 'id DESC') - - # create the issue with the upload's token - assert_difference 'Issue.count' do - post '/issues.xml', - {:issue => {:project_id => 1, :subject => 'Uploaded file', - :uploads => [{:token => token, :filename => 'test.txt', - :content_type => 'text/plain'}]}}, - credentials('jsmith') - assert_response :created - end - issue = Issue.first(:order => 'id DESC') - assert_equal 1, issue.attachments.count - assert_equal attachment, issue.attachments.first - - attachment.reload - assert_equal 'test.txt', attachment.filename - assert_equal 'text/plain', attachment.content_type - assert_equal 'test_create_with_upload'.size, attachment.filesize - assert_equal 2, attachment.author_id - - # get the issue with its attachments - get "/issues/#{issue.id}.xml", :include => 'attachments' - assert_response :success - xml = Hash.from_xml(response.body) - attachments = xml['issue']['attachments'] - assert_kind_of Array, attachments - assert_equal 1, attachments.size - url = attachments.first['content_url'] - assert_not_nil url - - # download the attachment - get url - assert_response :success - end - - def test_update_issue_with_uploaded_file - set_tmp_attachments_directory - # upload the file - assert_difference 'Attachment.count' do - post '/uploads.xml', 'test_upload_with_upload', - {"CONTENT_TYPE" => 'application/octet-stream'}.merge(credentials('jsmith')) - assert_response :created - end - xml = Hash.from_xml(response.body) - token = xml['upload']['token'] - attachment = Attachment.first(:order => 'id DESC') - - # update the issue with the upload's token - assert_difference 'Journal.count' do - put '/issues/1.xml', - {:issue => {:notes => 'Attachment added', - :uploads => [{:token => token, :filename => 'test.txt', - :content_type => 'text/plain'}]}}, - credentials('jsmith') - assert_response :ok - assert_equal '', @response.body - end - - issue = Issue.find(1) - assert_include attachment, issue.attachments - end -end diff --git a/test/integration/api_test/jsonp_test.rb b/test/integration/api_test/jsonp_test.rb deleted file mode 100644 index 75ba0432d..000000000 --- a/test/integration/api_test/jsonp_test.rb +++ /dev/null @@ -1,72 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::JsonpTest < Redmine::ApiTest::Base - fixtures :trackers - - def test_should_ignore_jsonp_callback_with_jsonp_disabled - with_settings :jsonp_enabled => '0' do - get '/trackers.json?jsonp=handler' - end - - assert_response :success - assert_match %r{^\{"trackers":.+\}$}, response.body - assert_equal 'application/json; charset=utf-8', response.headers['Content-Type'] - end - - def test_jsonp_should_accept_callback_param - with_settings :jsonp_enabled => '1' do - get '/trackers.json?callback=handler' - end - - assert_response :success - assert_match %r{^handler\(\{"trackers":.+\}\)$}, response.body - assert_equal 'application/javascript; charset=utf-8', response.headers['Content-Type'] - end - - def test_jsonp_should_accept_jsonp_param - with_settings :jsonp_enabled => '1' do - get '/trackers.json?jsonp=handler' - end - - assert_response :success - assert_match %r{^handler\(\{"trackers":.+\}\)$}, response.body - assert_equal 'application/javascript; charset=utf-8', response.headers['Content-Type'] - end - - def test_jsonp_should_strip_invalid_characters_from_callback - with_settings :jsonp_enabled => '1' do - get '/trackers.json?callback=+-aA$1_' - end - - assert_response :success - assert_match %r{^aA1_\(\{"trackers":.+\}\)$}, response.body - assert_equal 'application/javascript; charset=utf-8', response.headers['Content-Type'] - end - - def test_jsonp_without_callback_should_return_json - with_settings :jsonp_enabled => '1' do - get '/trackers.json?callback=' - end - - assert_response :success - assert_match %r{^\{"trackers":.+\}$}, response.body - assert_equal 'application/json; charset=utf-8', response.headers['Content-Type'] - end -end diff --git a/test/integration/api_test/memberships_test.rb b/test/integration/api_test/memberships_test.rb deleted file mode 100644 index ad8aa42ef..000000000 --- a/test/integration/api_test/memberships_test.rb +++ /dev/null @@ -1,200 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::MembershipsTest < Redmine::ApiTest::Base - fixtures :projects, :users, :roles, :members, :member_roles - - def setup - Setting.rest_api_enabled = '1' - end - - context "/projects/:project_id/memberships" do - context "GET" do - context "xml" do - should "return memberships" do - get '/projects/1/memberships.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'memberships', - :attributes => {:type => 'array'}, - :child => { - :tag => 'membership', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'user', - :attributes => {:id => '3', :name => 'Dave Lopper'}, - :sibling => { - :tag => 'roles', - :child => { - :tag => 'role', - :attributes => {:id => '2', :name => 'Developer'} - } - } - } - } - } - end - end - - context "json" do - should "return memberships" do - get '/projects/1/memberships.json', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_equal({ - "memberships" => - [{"id"=>1, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Manager", "id"=>1}], - "user" => {"name"=>"John Smith", "id"=>2}}, - {"id"=>2, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Developer", "id"=>2}], - "user" => {"name"=>"Dave Lopper", "id"=>3}}], - "limit" => 25, - "total_count" => 2, - "offset" => 0}, - json) - end - end - end - - context "POST" do - context "xml" do - should "create membership" do - assert_difference 'Member.count' do - post '/projects/1/memberships.xml', {:membership => {:user_id => 7, :role_ids => [2,3]}}, credentials('jsmith') - - assert_response :created - end - end - - should "return errors on failure" do - assert_no_difference 'Member.count' do - post '/projects/1/memberships.xml', {:membership => {:role_ids => [2,3]}}, credentials('jsmith') - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Principal can't be blank"} - end - end - end - end - end - - context "/memberships/:id" do - context "GET" do - context "xml" do - should "return the membership" do - get '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'membership', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'user', - :attributes => {:id => '3', :name => 'Dave Lopper'}, - :sibling => { - :tag => 'roles', - :child => { - :tag => 'role', - :attributes => {:id => '2', :name => 'Developer'} - } - } - } - } - end - end - - context "json" do - should "return the membership" do - get '/memberships/2.json', {}, credentials('jsmith') - - assert_response :success - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_equal( - {"membership" => { - "id" => 2, - "project" => {"name"=>"eCookbook", "id"=>1}, - "roles" => [{"name"=>"Developer", "id"=>2}], - "user" => {"name"=>"Dave Lopper", "id"=>3}} - }, - json) - end - end - end - - context "PUT" do - context "xml" do - should "update membership" do - assert_not_equal [1,2], Member.find(2).role_ids.sort - assert_no_difference 'Member.count' do - put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [1,2]}}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - end - member = Member.find(2) - assert_equal [1,2], member.role_ids.sort - end - - should "return errors on failure" do - put '/memberships/2.xml', {:membership => {:user_id => 3, :role_ids => [99]}}, credentials('jsmith') - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => /member_roles is invalid/} - end - end - end - - context "DELETE" do - context "xml" do - should "destroy membership" do - assert_difference 'Member.count', -1 do - delete '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - end - assert_nil Member.find_by_id(2) - end - - should "respond with 422 on failure" do - assert_no_difference 'Member.count' do - # A membership with an inherited role can't be deleted - Member.find(2).member_roles.first.update_attribute :inherited_from, 99 - delete '/memberships/2.xml', {}, credentials('jsmith') - - assert_response :unprocessable_entity - end - end - end - end - end -end diff --git a/test/integration/api_test/news_test.rb b/test/integration/api_test/news_test.rb deleted file mode 100644 index 0319b46b3..000000000 --- a/test/integration/api_test/news_test.rb +++ /dev/null @@ -1,97 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::NewsTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :news - - def setup - Setting.rest_api_enabled = '1' - end - - context "GET /news" do - context ".xml" do - should "return news" do - get '/news.xml' - - assert_tag :tag => 'news', - :attributes => {:type => 'array'}, - :child => { - :tag => 'news', - :child => { - :tag => 'id', - :content => '2' - } - } - end - end - - context ".json" do - should "return news" do - get '/news.json' - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['news'] - assert_kind_of Hash, json['news'].first - assert_equal 2, json['news'].first['id'] - end - end - end - - context "GET /projects/:project_id/news" do - context ".xml" do - should_allow_api_authentication(:get, "/projects/onlinestore/news.xml") - - should "return news" do - get '/projects/ecookbook/news.xml' - - assert_tag :tag => 'news', - :attributes => {:type => 'array'}, - :child => { - :tag => 'news', - :child => { - :tag => 'id', - :content => '2' - } - } - end - end - - context ".json" do - should_allow_api_authentication(:get, "/projects/onlinestore/news.json") - - should "return news" do - get '/projects/ecookbook/news.json' - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['news'] - assert_kind_of Hash, json['news'].first - assert_equal 2, json['news'].first['id'] - end - end - end -end diff --git a/test/integration/api_test/projects_test.rb b/test/integration/api_test/projects_test.rb deleted file mode 100644 index 7a7d2c120..000000000 --- a/test/integration/api_test/projects_test.rb +++ /dev/null @@ -1,297 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::ProjectsTest < Redmine::ApiTest::Base - fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details, - :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages, - :attachments, :custom_fields, :custom_values, :time_entries, :issue_categories - - def setup - Setting.rest_api_enabled = '1' - set_tmp_attachments_directory - end - - context "GET /projects" do - context ".xml" do - should "return projects" do - get '/projects.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'projects', - :child => {:tag => 'project', :child => {:tag => 'id', :content => '1'}} - end - end - - context ".json" do - should "return projects" do - get '/projects.json' - assert_response :success - assert_equal 'application/json', @response.content_type - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['projects'] - assert_kind_of Hash, json['projects'].first - assert json['projects'].first.has_key?('id') - end - end - end - - context "GET /projects/:id" do - context ".xml" do - # TODO: A private project is needed because should_allow_api_authentication - # actually tests that authentication is *required*, not just allowed - should_allow_api_authentication(:get, "/projects/2.xml") - - should "return requested project" do - get '/projects/1.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag :tag => 'project', - :child => {:tag => 'id', :content => '1'} - assert_tag :tag => 'custom_field', - :attributes => {:name => 'Development status'}, :content => 'Stable' - - assert_no_tag 'trackers' - assert_no_tag 'issue_categories' - end - - context "with hidden custom fields" do - setup do - ProjectCustomField.find_by_name('Development status').update_attribute :visible, false - end - - should "not display hidden custom fields" do - get '/projects/1.xml' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_no_tag 'custom_field', - :attributes => {:name => 'Development status'} - end - end - - should "return categories with include=issue_categories" do - get '/projects/1.xml?include=issue_categories' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag 'issue_categories', - :attributes => {:type => 'array'}, - :child => { - :tag => 'issue_category', - :attributes => { - :id => '2', - :name => 'Recipes' - } - } - end - - should "return trackers with include=trackers" do - get '/projects/1.xml?include=trackers' - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_tag 'trackers', - :attributes => {:type => 'array'}, - :child => { - :tag => 'tracker', - :attributes => { - :id => '2', - :name => 'Feature request' - } - } - end - end - - context ".json" do - should_allow_api_authentication(:get, "/projects/2.json") - - should "return requested project" do - get '/projects/1.json' - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['project'] - assert_equal 1, json['project']['id'] - end - end - end - - context "POST /projects" do - context "with valid parameters" do - setup do - Setting.default_projects_modules = ['issue_tracking', 'repository'] - @parameters = {:project => {:name => 'API test', :identifier => 'api-test'}} - end - - context ".xml" do - should_allow_api_authentication(:post, - '/projects.xml', - {:project => {:name => 'API test', :identifier => 'api-test'}}, - {:success_code => :created}) - - - should "create a project with the attributes" do - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal 'API test', project.name - assert_equal 'api-test', project.identifier - assert_equal ['issue_tracking', 'repository'], project.enabled_module_names.sort - assert_equal Tracker.all.size, project.trackers.size - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'project', :child => {:tag => 'id', :content => project.id.to_s} - end - - should "accept enabled_module_names attribute" do - @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}) - - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort - end - - should "accept tracker_ids attribute" do - @parameters[:project].merge!({:tracker_ids => [1, 3]}) - - assert_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - project = Project.first(:order => 'id DESC') - assert_equal [1, 3], project.trackers.map(&:id).sort - end - end - end - - context "with invalid parameters" do - setup do - @parameters = {:project => {:name => 'API test'}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('Project.count') do - post '/projects.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Identifier can't be blank"} - end - end - end - end - - context "PUT /projects/:id" do - context "with valid parameters" do - setup do - @parameters = {:project => {:name => 'API update'}} - end - - context ".xml" do - should_allow_api_authentication(:put, - '/projects/2.xml', - {:project => {:name => 'API update'}}, - {:success_code => :ok}) - - should "update the project" do - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'application/xml', @response.content_type - project = Project.find(2) - assert_equal 'API update', project.name - end - - should "accept enabled_module_names attribute" do - @parameters[:project].merge!({:enabled_module_names => ['issue_tracking', 'news', 'time_tracking']}) - - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - project = Project.find(2) - assert_equal ['issue_tracking', 'news', 'time_tracking'], project.enabled_module_names.sort - end - - should "accept tracker_ids attribute" do - @parameters[:project].merge!({:tracker_ids => [1, 3]}) - - assert_no_difference 'Project.count' do - put '/projects/2.xml', @parameters, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - project = Project.find(2) - assert_equal [1, 3], project.trackers.map(&:id).sort - end - end - end - - context "with invalid parameters" do - setup do - @parameters = {:project => {:name => ''}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('Project.count') do - put '/projects/2.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => {:tag => 'error', :content => "Name can't be blank"} - end - end - end - end - - context "DELETE /projects/:id" do - context ".xml" do - should_allow_api_authentication(:delete, - '/projects/2.xml', - {}, - {:success_code => :ok}) - - should "delete the project" do - assert_difference('Project.count',-1) do - delete '/projects/2.xml', {}, credentials('admin') - end - assert_response :ok - assert_equal '', @response.body - assert_nil Project.find_by_id(2) - end - end - end -end diff --git a/test/integration/api_test/queries_test.rb b/test/integration/api_test/queries_test.rb deleted file mode 100644 index e34f04808..000000000 --- a/test/integration/api_test/queries_test.rb +++ /dev/null @@ -1,58 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::QueriesTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :queries - - def setup - Setting.rest_api_enabled = '1' - end - - context "/queries" do - context "GET" do - - should "return queries" do - get '/queries.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'queries', - :attributes => {:type => 'array'}, - :child => { - :tag => 'query', - :child => { - :tag => 'id', - :content => '4', - :sibling => { - :tag => 'name', - :content => 'Public query for all projects' - } - } - } - end - end - end -end diff --git a/test/integration/api_test/roles_test.rb b/test/integration/api_test/roles_test.rb deleted file mode 100644 index 2d88f285e..000000000 --- a/test/integration/api_test/roles_test.rb +++ /dev/null @@ -1,90 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::RolesTest < Redmine::ApiTest::Base - fixtures :roles - - def setup - Setting.rest_api_enabled = '1' - end - - context "/roles" do - context "GET" do - context "xml" do - should "return the roles" do - get '/roles.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_equal 3, assigns(:roles).size - - assert_tag :tag => 'roles', - :attributes => {:type => 'array'}, - :child => { - :tag => 'role', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Developer' - } - } - } - end - end - - context "json" do - should "return the roles" do - get '/roles.json' - - assert_response :success - assert_equal 'application/json', @response.content_type - assert_equal 3, assigns(:roles).size - - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Array, json['roles'] - assert_include({'id' => 2, 'name' => 'Developer'}, json['roles']) - end - end - end - end - - context "/roles/:id" do - context "GET" do - context "xml" do - should "return the role" do - get '/roles/1.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - - assert_select 'role' do - assert_select 'name', :text => 'Manager' - assert_select 'role permissions[type=array]' do - assert_select 'permission', Role.find(1).permissions.size - assert_select 'permission', :text => 'view_issues' - end - end - end - end - end - end -end diff --git a/test/integration/api_test/time_entries_test.rb b/test/integration/api_test/time_entries_test.rb deleted file mode 100644 index f9723e6ea..000000000 --- a/test/integration/api_test/time_entries_test.rb +++ /dev/null @@ -1,164 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::TimeEntriesTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :time_entries - - def setup - Setting.rest_api_enabled = '1' - end - - context "GET /time_entries.xml" do - should "return time entries" do - get '/time_entries.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entries', - :child => {:tag => 'time_entry', :child => {:tag => 'id', :content => '2'}} - end - - context "with limit" do - should "return limited results" do - get '/time_entries.xml?limit=2', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entries', - :children => {:count => 2} - end - end - end - - context "GET /time_entries/2.xml" do - should "return requested time entry" do - get '/time_entries/2.xml', {}, credentials('jsmith') - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'time_entry', - :child => {:tag => 'id', :content => '2'} - end - end - - context "POST /time_entries.xml" do - context "with issue_id" do - should "return create time entry" do - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'jsmith', entry.user.login - assert_equal Issue.find(1), entry.issue - assert_equal Project.find(1), entry.project - assert_equal Date.parse('2010-12-02'), entry.spent_on - assert_equal 3.5, entry.hours - assert_equal TimeEntryActivity.find(11), entry.activity - end - - should "accept custom fields" do - field = TimeEntryCustomField.create!(:name => 'Test', :field_format => 'string') - - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => { - :issue_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11', :custom_fields => [{:id => field.id.to_s, :value => 'accepted'}] - }}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'accepted', entry.custom_field_value(field) - end - end - - context "with project_id" do - should "return create time entry" do - assert_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :hours => '3.5', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :created - assert_equal 'application/xml', @response.content_type - - entry = TimeEntry.first(:order => 'id DESC') - assert_equal 'jsmith', entry.user.login - assert_nil entry.issue - assert_equal Project.find(1), entry.project - assert_equal Date.parse('2010-12-02'), entry.spent_on - assert_equal 3.5, entry.hours - assert_equal TimeEntryActivity.find(11), entry.activity - end - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'TimeEntry.count' do - post '/time_entries.xml', {:time_entry => {:project_id => '1', :spent_on => '2010-12-02', :activity_id => '11'}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} - end - end - end - - context "PUT /time_entries/2.xml" do - context "with valid parameters" do - should "update time entry" do - assert_no_difference 'TimeEntry.count' do - put '/time_entries/2.xml', {:time_entry => {:comments => 'API Update'}}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_equal 'API Update', TimeEntry.find(2).comments - end - end - - context "with invalid parameters" do - should "return errors" do - assert_no_difference 'TimeEntry.count' do - put '/time_entries/2.xml', {:time_entry => {:hours => '', :comments => 'API Update'}}, credentials('jsmith') - end - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - - assert_tag 'errors', :child => {:tag => 'error', :content => "Hours can't be blank"} - end - end - end - - context "DELETE /time_entries/2.xml" do - should "destroy time entry" do - assert_difference 'TimeEntry.count', -1 do - delete '/time_entries/2.xml', {}, credentials('jsmith') - end - assert_response :ok - assert_equal '', @response.body - assert_nil TimeEntry.find_by_id(2) - end - end -end diff --git a/test/integration/api_test/token_authentication_test.rb b/test/integration/api_test/token_authentication_test.rb deleted file mode 100644 index 835adc4b1..000000000 --- a/test/integration/api_test/token_authentication_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::TokenAuthenticationTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def setup - Setting.rest_api_enabled = '1' - Setting.login_required = '1' - end - - def teardown - Setting.rest_api_enabled = '0' - Setting.login_required = '0' - end - - # Using the NewsController because it's a simple API. - context "get /news" do - context "in :xml format" do - should_allow_key_based_auth(:get, "/news.xml") - end - - context "in :json format" do - should_allow_key_based_auth(:get, "/news.json") - end - end -end diff --git a/test/integration/api_test/trackers_test.rb b/test/integration/api_test/trackers_test.rb deleted file mode 100644 index d0dea71ee..000000000 --- a/test/integration/api_test/trackers_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::TrackersTest < Redmine::ApiTest::Base - fixtures :trackers - - def setup - Setting.rest_api_enabled = '1' - end - - context "/trackers" do - context "GET" do - - should "return trackers" do - get '/trackers.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'trackers', - :attributes => {:type => 'array'}, - :child => { - :tag => 'tracker', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => 'Feature request' - } - } - } - end - end - end -end diff --git a/test/integration/api_test/users_test.rb b/test/integration/api_test/users_test.rb deleted file mode 100644 index 3b12fed47..000000000 --- a/test/integration/api_test/users_test.rb +++ /dev/null @@ -1,371 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::UsersTest < Redmine::ApiTest::Base - fixtures :users, :members, :member_roles, :roles, :projects - - def setup - Setting.rest_api_enabled = '1' - end - - context "GET /users" do - should_allow_api_authentication(:get, "/users.xml") - should_allow_api_authentication(:get, "/users.json") - end - - context "GET /users/2" do - context ".xml" do - should "return requested user" do - get '/users/2.xml' - - assert_response :success - assert_tag :tag => 'user', - :child => {:tag => 'id', :content => '2'} - end - - context "with include=memberships" do - should "include memberships" do - get '/users/2.xml?include=memberships' - - assert_response :success - assert_tag :tag => 'memberships', - :parent => {:tag => 'user'}, - :children => {:count => 1} - end - end - end - - context ".json" do - should "return requested user" do - get '/users/2.json' - - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['user'] - assert_equal 2, json['user']['id'] - end - - context "with include=memberships" do - should "include memberships" do - get '/users/2.json?include=memberships' - - assert_response :success - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Array, json['user']['memberships'] - assert_equal [{ - "id"=>1, - "project"=>{"name"=>"eCookbook", "id"=>1}, - "roles"=>[{"name"=>"Manager", "id"=>1}] - }], json['user']['memberships'] - end - end - end - end - - context "GET /users/current" do - context ".xml" do - should "require authentication" do - get '/users/current.xml' - - assert_response 401 - end - - should "return current user" do - get '/users/current.xml', {}, credentials('jsmith') - - assert_tag :tag => 'user', - :child => {:tag => 'id', :content => '2'} - end - end - end - - test "GET /users/:id should not return login for other user" do - get '/users/3.xml', {}, credentials('jsmith') - assert_response :success - assert_no_tag 'user', :child => {:tag => 'login'} - end - - test "GET /users/:id should return login for current user" do - get '/users/2.xml', {}, credentials('jsmith') - assert_response :success - assert_tag 'user', :child => {:tag => 'login', :content => 'jsmith'} - end - - test "GET /users/:id should not return api_key for other user" do - get '/users/3.xml', {}, credentials('jsmith') - assert_response :success - assert_no_tag 'user', :child => {:tag => 'api_key'} - end - - test "GET /users/:id should return api_key for current user" do - get '/users/2.xml', {}, credentials('jsmith') - assert_response :success - assert_tag 'user', :child => {:tag => 'api_key', :content => User.find(2).api_key} - end - - context "POST /users" do - context "with valid parameters" do - setup do - @parameters = { - :user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net', :password => 'secret123', - :mail_notification => 'only_assigned' - } - } - end - - context ".xml" do - should_allow_api_authentication(:post, - '/users.xml', - {:user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net', :password => 'secret123' - }}, - {:success_code => :created}) - - should "create a user with the attributes" do - assert_difference('User.count') do - post '/users.xml', @parameters, credentials('admin') - end - - user = User.first(:order => 'id DESC') - assert_equal 'foo', user.login - assert_equal 'Firstname', user.firstname - assert_equal 'Lastname', user.lastname - assert_equal 'foo@example.net', user.mail - assert_equal 'only_assigned', user.mail_notification - assert !user.admin? - assert user.check_password?('secret123') - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s} - end - end - - context ".json" do - should_allow_api_authentication(:post, - '/users.json', - {:user => { - :login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', - :mail => 'foo@example.net' - }}, - {:success_code => :created}) - - should "create a user with the attributes" do - assert_difference('User.count') do - post '/users.json', @parameters, credentials('admin') - end - - user = User.first(:order => 'id DESC') - assert_equal 'foo', user.login - assert_equal 'Firstname', user.firstname - assert_equal 'Lastname', user.lastname - assert_equal 'foo@example.net', user.mail - assert !user.admin? - - assert_response :created - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert_kind_of Hash, json['user'] - assert_equal user.id, json['user']['id'] - end - end - end - - context "with invalid parameters" do - setup do - @parameters = {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}} - end - - context ".xml" do - should "return errors" do - assert_no_difference('User.count') do - post '/users.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => { - :tag => 'error', - :content => "First name can't be blank" - } - end - end - - context ".json" do - should "return errors" do - assert_no_difference('User.count') do - post '/users.json', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert json.has_key?('errors') - assert_kind_of Array, json['errors'] - end - end - end - end - - context "PUT /users/2" do - context "with valid parameters" do - setup do - @parameters = { - :user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - } - } - end - - context ".xml" do - should_allow_api_authentication(:put, - '/users/2.xml', - {:user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - }}, - {:success_code => :ok}) - - should "update user with the attributes" do - assert_no_difference('User.count') do - put '/users/2.xml', @parameters, credentials('admin') - end - - user = User.find(2) - assert_equal 'jsmith', user.login - assert_equal 'John', user.firstname - assert_equal 'Renamed', user.lastname - assert_equal 'jsmith@somenet.foo', user.mail - assert !user.admin? - - assert_response :ok - assert_equal '', @response.body - end - end - - context ".json" do - should_allow_api_authentication(:put, - '/users/2.json', - {:user => { - :login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', - :mail => 'jsmith@somenet.foo' - }}, - {:success_code => :ok}) - - should "update user with the attributes" do - assert_no_difference('User.count') do - put '/users/2.json', @parameters, credentials('admin') - end - - user = User.find(2) - assert_equal 'jsmith', user.login - assert_equal 'John', user.firstname - assert_equal 'Renamed', user.lastname - assert_equal 'jsmith@somenet.foo', user.mail - assert !user.admin? - - assert_response :ok - assert_equal '', @response.body - end - end - end - - context "with invalid parameters" do - setup do - @parameters = { - :user => { - :login => 'jsmith', :firstname => '', :lastname => 'Lastname', - :mail => 'foo' - } - } - end - - context ".xml" do - should "return errors" do - assert_no_difference('User.count') do - put '/users/2.xml', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/xml', @response.content_type - assert_tag 'errors', :child => { - :tag => 'error', - :content => "First name can't be blank" - } - end - end - - context ".json" do - should "return errors" do - assert_no_difference('User.count') do - put '/users/2.json', @parameters, credentials('admin') - end - - assert_response :unprocessable_entity - assert_equal 'application/json', @response.content_type - json = ActiveSupport::JSON.decode(response.body) - assert_kind_of Hash, json - assert json.has_key?('errors') - assert_kind_of Array, json['errors'] - end - end - end - end - - context "DELETE /users/2" do - context ".xml" do - should_allow_api_authentication(:delete, - '/users/2.xml', - {}, - {:success_code => :ok}) - - should "delete user" do - assert_difference('User.count', -1) do - delete '/users/2.xml', {}, credentials('admin') - end - - assert_response :ok - assert_equal '', @response.body - end - end - - context ".json" do - should_allow_api_authentication(:delete, - '/users/2.xml', - {}, - {:success_code => :ok}) - - should "delete user" do - assert_difference('User.count', -1) do - delete '/users/2.json', {}, credentials('admin') - end - - assert_response :ok - assert_equal '', @response.body - end - end - end -end diff --git a/test/integration/api_test/versions_test.rb b/test/integration/api_test/versions_test.rb deleted file mode 100644 index c7c49606b..000000000 --- a/test/integration/api_test/versions_test.rb +++ /dev/null @@ -1,158 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::VersionsTest < Redmine::ApiTest::Base - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules, - :versions - - def setup - Setting.rest_api_enabled = '1' - end - - context "/projects/:project_id/versions" do - context "GET" do - should "return project versions" do - get '/projects/1/versions.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_tag :tag => 'versions', - :attributes => {:type => 'array'}, - :child => { - :tag => 'version', - :child => { - :tag => 'id', - :content => '2', - :sibling => { - :tag => 'name', - :content => '1.0' - } - } - } - end - end - - context "POST" do - should "create the version" do - assert_difference 'Version.count' do - post '/projects/1/versions.xml', {:version => {:name => 'API test'}}, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} - end - - should "create the version with due date" do - assert_difference 'Version.count' do - post '/projects/1/versions.xml', {:version => {:name => 'API test', :due_date => '2012-01-24'}}, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - assert_equal Date.parse('2012-01-24'), version.due_date - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_tag 'version', :child => {:tag => 'id', :content => version.id.to_s} - end - - should "create the version with custom fields" do - field = VersionCustomField.generate! - - assert_difference 'Version.count' do - post '/projects/1/versions.xml', { - :version => { - :name => 'API test', - :custom_fields => [ - {'id' => field.id.to_s, 'value' => 'Some value'} - ] - } - }, credentials('jsmith') - end - - version = Version.first(:order => 'id DESC') - assert_equal 'API test', version.name - assert_equal 'Some value', version.custom_field_value(field) - - assert_response :created - assert_equal 'application/xml', @response.content_type - assert_select 'version>custom_fields>custom_field[id=?]>value', field.id.to_s, 'Some value' - end - - context "with failure" do - should "return the errors" do - assert_no_difference('Version.count') do - post '/projects/1/versions.xml', {:version => {:name => ''}}, credentials('jsmith') - end - - assert_response :unprocessable_entity - assert_tag :errors, :child => {:tag => 'error', :content => "Name can't be blank"} - end - end - end - end - - context "/versions/:id" do - context "GET" do - should "return the version" do - get '/versions/2.xml' - - assert_response :success - assert_equal 'application/xml', @response.content_type - assert_select 'version' do - assert_select 'id', :text => '2' - assert_select 'name', :text => '1.0' - assert_select 'sharing', :text => 'none' - end - end - end - - context "PUT" do - should "update the version" do - put '/versions/2.xml', {:version => {:name => 'API update'}}, credentials('jsmith') - - assert_response :ok - assert_equal '', @response.body - assert_equal 'API update', Version.find(2).name - end - end - - context "DELETE" do - should "destroy the version" do - assert_difference 'Version.count', -1 do - delete '/versions/3.xml', {}, credentials('jsmith') - end - - assert_response :ok - assert_equal '', @response.body - assert_nil Version.find_by_id(3) - end - end - end -end diff --git a/test/integration/api_test/wiki_pages_test.rb b/test/integration/api_test/wiki_pages_test.rb deleted file mode 100644 index 77ada7331..000000000 --- a/test/integration/api_test/wiki_pages_test.rb +++ /dev/null @@ -1,193 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class Redmine::ApiTest::WikiPagesTest < Redmine::ApiTest::Base - fixtures :projects, :users, :roles, :members, :member_roles, - :enabled_modules, :wikis, :wiki_pages, :wiki_contents, - :wiki_content_versions, :attachments - - def setup - Setting.rest_api_enabled = '1' - end - - test "GET /projects/:project_id/wiki/index.xml should return wiki pages" do - get '/projects/ecookbook/wiki/index.xml' - assert_response 200 - assert_equal 'application/xml', response.content_type - assert_select 'wiki_pages[type=array]' do - assert_select 'wiki_page', :count => Wiki.find(1).pages.count - assert_select 'wiki_page' do - assert_select 'title', :text => 'CookBook_documentation' - assert_select 'version', :text => '3' - assert_select 'created_on' - assert_select 'updated_on' - end - assert_select 'wiki_page' do - assert_select 'title', :text => 'Page_with_an_inline_image' - assert_select 'parent[title=?]', 'CookBook_documentation' - end - end - end - - test "GET /projects/:project_id/wiki/:title.xml should return wiki page" do - get '/projects/ecookbook/wiki/CookBook_documentation.xml' - assert_response 200 - assert_equal 'application/xml', response.content_type - assert_select 'wiki_page' do - assert_select 'title', :text => 'CookBook_documentation' - assert_select 'version', :text => '3' - assert_select 'text' - assert_select 'author' - assert_select 'comments' - assert_select 'created_on' - assert_select 'updated_on' - end - end - - test "GET /projects/:project_id/wiki/:title.xml?include=attachments should include attachments" do - get '/projects/ecookbook/wiki/Page_with_an_inline_image.xml?include=attachments' - assert_response 200 - assert_equal 'application/xml', response.content_type - assert_select 'wiki_page' do - assert_select 'title', :text => 'Page_with_an_inline_image' - assert_select 'attachments[type=array]' do - assert_select 'attachment' do - assert_select 'id', :text => '3' - assert_select 'filename', :text => 'logo.gif' - end - end - end - end - - test "GET /projects/:project_id/wiki/:title.xml with unknown title and edit permission should respond with 404" do - get '/projects/ecookbook/wiki/Invalid_Page.xml', {}, credentials('jsmith') - assert_response 404 - assert_equal 'application/xml', response.content_type - end - - test "GET /projects/:project_id/wiki/:title/:version.xml should return wiki page version" do - get '/projects/ecookbook/wiki/CookBook_documentation/2.xml' - assert_response 200 - assert_equal 'application/xml', response.content_type - assert_select 'wiki_page' do - assert_select 'title', :text => 'CookBook_documentation' - assert_select 'version', :text => '2' - assert_select 'text' - assert_select 'author' - assert_select 'created_on' - assert_select 'updated_on' - end - end - - test "GET /projects/:project_id/wiki/:title/:version.xml without permission should be denied" do - Role.anonymous.remove_permission! :view_wiki_edits - - get '/projects/ecookbook/wiki/CookBook_documentation/2.xml' - assert_response 401 - assert_equal 'application/xml', response.content_type - end - - test "PUT /projects/:project_id/wiki/:title.xml should update wiki page" do - assert_no_difference 'WikiPage.count' do - assert_difference 'WikiContent::Version.count' do - put '/projects/ecookbook/wiki/CookBook_documentation.xml', - {:wiki_page => {:text => 'New content from API', :comments => 'API update'}}, - credentials('jsmith') - assert_response 200 - end - end - - page = WikiPage.find(1) - assert_equal 'New content from API', page.content.text - assert_equal 4, page.content.version - assert_equal 'API update', page.content.comments - assert_equal 'jsmith', page.content.author.login - end - - test "PUT /projects/:project_id/wiki/:title.xml with current versino should update wiki page" do - assert_no_difference 'WikiPage.count' do - assert_difference 'WikiContent::Version.count' do - put '/projects/ecookbook/wiki/CookBook_documentation.xml', - {:wiki_page => {:text => 'New content from API', :comments => 'API update', :version => '3'}}, - credentials('jsmith') - assert_response 200 - end - end - - page = WikiPage.find(1) - assert_equal 'New content from API', page.content.text - assert_equal 4, page.content.version - assert_equal 'API update', page.content.comments - assert_equal 'jsmith', page.content.author.login - end - - test "PUT /projects/:project_id/wiki/:title.xml with stale version should respond with 409" do - assert_no_difference 'WikiPage.count' do - assert_no_difference 'WikiContent::Version.count' do - put '/projects/ecookbook/wiki/CookBook_documentation.xml', - {:wiki_page => {:text => 'New content from API', :comments => 'API update', :version => '2'}}, - credentials('jsmith') - assert_response 409 - end - end - end - - test "PUT /projects/:project_id/wiki/:title.xml should create the page if it does not exist" do - assert_difference 'WikiPage.count' do - assert_difference 'WikiContent::Version.count' do - put '/projects/ecookbook/wiki/New_page_from_API.xml', - {:wiki_page => {:text => 'New content from API', :comments => 'API create'}}, - credentials('jsmith') - assert_response 201 - end - end - - page = WikiPage.order('id DESC').first - assert_equal 'New_page_from_API', page.title - assert_equal 'New content from API', page.content.text - assert_equal 1, page.content.version - assert_equal 'API create', page.content.comments - assert_equal 'jsmith', page.content.author.login - assert_nil page.parent - end - - test "PUT /projects/:project_id/wiki/:title.xml with parent" do - assert_difference 'WikiPage.count' do - assert_difference 'WikiContent::Version.count' do - put '/projects/ecookbook/wiki/New_subpage_from_API.xml', - {:wiki_page => {:parent_title => 'CookBook_documentation', :text => 'New content from API', :comments => 'API create'}}, - credentials('jsmith') - assert_response 201 - end - end - - page = WikiPage.order('id DESC').first - assert_equal 'New_subpage_from_API', page.title - assert_equal WikiPage.find(1), page.parent - end - - test "DELETE /projects/:project_id/wiki/:title.xml should destroy the page" do - assert_difference 'WikiPage.count', -1 do - delete '/projects/ecookbook/wiki/CookBook_documentation.xml', {}, credentials('jsmith') - assert_response 200 - end - - assert_nil WikiPage.find_by_id(1) - end -end diff --git a/test/integration/application_test.rb b/test/integration/application_test.rb deleted file mode 100644 index 66be18e93..000000000 --- a/test/integration/application_test.rb +++ /dev/null @@ -1,67 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ApplicationTest < ActionController::IntegrationTest - include Redmine::I18n - - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def test_set_localization - Setting.default_language = 'en' - - # a french user - get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' - assert_response :success - assert_tag :tag => 'h2', :content => 'Projets' - assert_equal :fr, current_language - - # then an italien user - get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'it;q=0.8,en-us;q=0.5,en;q=0.3' - assert_response :success - assert_tag :tag => 'h2', :content => 'Progetti' - assert_equal :it, current_language - - # not a supported language: default language should be used - get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'zz' - assert_response :success - assert_tag :tag => 'h2', :content => 'Projects' - end - - def test_token_based_access_should_not_start_session - # issue of a private project - get 'issues/4.atom' - assert_response 302 - - rss_key = User.find(2).rss_key - get "issues/4.atom?key=#{rss_key}" - assert_response 200 - assert_nil session[:user_id] - end - - def test_missing_template_should_respond_with_404 - get '/login.png' - assert_response 404 - end -end diff --git a/test/integration/attachments_test.rb b/test/integration/attachments_test.rb deleted file mode 100644 index d73b636ec..000000000 --- a/test/integration/attachments_test.rb +++ /dev/null @@ -1,132 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AttachmentsTest < ActionController::IntegrationTest - fixtures :projects, :enabled_modules, - :users, :roles, :members, :member_roles, - :trackers, :projects_trackers, - :issue_statuses, :enumerations - - def test_upload_as_js_and_attach_to_an_issue - log_user('jsmith', 'jsmith') - - token = ajax_upload('myupload.txt', 'File content') - - assert_difference 'Issue.count' do - post '/projects/ecookbook/issues', { - :issue => {:tracker_id => 1, :subject => 'Issue with upload'}, - :attachments => {'1' => {:filename => 'myupload.txt', :description => 'My uploaded file', :token => token}} - } - assert_response 302 - end - - issue = Issue.order('id DESC').first - assert_equal 'Issue with upload', issue.subject - assert_equal 1, issue.attachments.count - - attachment = issue.attachments.first - assert_equal 'myupload.txt', attachment.filename - assert_equal 'My uploaded file', attachment.description - assert_equal 'File content'.length, attachment.filesize - end - - def test_upload_as_js_and_preview_as_inline_attachment - log_user('jsmith', 'jsmith') - - token = ajax_upload('myupload.jpg', 'JPEG content') - - post '/issues/preview/new/ecookbook', { - :issue => {:tracker_id => 1, :description => 'Inline upload: !myupload.jpg!'}, - :attachments => {'1' => {:filename => 'myupload.jpg', :description => 'My uploaded file', :token => token}} - } - assert_response :success - - attachment_path = response.body.match(%r{ {:tracker_id => 1, :subject => ''}, - :attachments => {'1' => {:filename => 'myupload.txt', :description => 'My uploaded file', :token => token}} - } - assert_response :success - end - assert_select 'input[type=hidden][name=?][value=?]', 'attachments[p0][token]', token - assert_select 'input[name=?][value=?]', 'attachments[p0][filename]', 'myupload.txt' - assert_select 'input[name=?][value=?]', 'attachments[p0][description]', 'My uploaded file' - - assert_difference 'Issue.count' do - post '/projects/ecookbook/issues', { - :issue => {:tracker_id => 1, :subject => 'Issue with upload'}, - :attachments => {'p0' => {:filename => 'myupload.txt', :description => 'My uploaded file', :token => token}} - } - assert_response 302 - end - - issue = Issue.order('id DESC').first - assert_equal 'Issue with upload', issue.subject - assert_equal 1, issue.attachments.count - - attachment = issue.attachments.first - assert_equal 'myupload.txt', attachment.filename - assert_equal 'My uploaded file', attachment.description - assert_equal 'File content'.length, attachment.filesize - end - - def test_upload_as_js_and_destroy - log_user('jsmith', 'jsmith') - - token = ajax_upload('myupload.txt', 'File content') - - attachment = Attachment.order('id DESC').first - attachment_path = "/attachments/#{attachment.id}.js?attachment_id=1" - assert_include "href: '#{attachment_path}'", response.body, "Path to attachment: #{attachment_path} not found in response:\n#{response.body}" - - assert_difference 'Attachment.count', -1 do - delete attachment_path - assert_response :success - end - - assert_include "$('#attachments_1').remove();", response.body - end - - private - - def ajax_upload(filename, content, attachment_id=1) - assert_difference 'Attachment.count' do - post "/uploads.js?attachment_id=#{attachment_id}&filename=#{filename}", content, {"CONTENT_TYPE" => 'application/octet-stream'} - assert_response :success - assert_equal 'text/javascript', response.content_type - end - - token = response.body.match(/\.val\('(\d+\.[0-9a-f]+)'\)/)[1] - assert_not_nil token, "No upload token found in response:\n#{response.body}" - token - end -end diff --git a/test/integration/issues_test.rb b/test/integration/issues_test.rb deleted file mode 100644 index 340521895..000000000 --- a/test/integration/issues_test.rb +++ /dev/null @@ -1,220 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class IssuesTest < ActionController::IntegrationTest - fixtures :projects, - :users, - :roles, - :members, - :member_roles, - :trackers, - :projects_trackers, - :enabled_modules, - :issue_statuses, - :issues, - :enumerations, - :custom_fields, - :custom_values, - :custom_fields_trackers - - # create an issue - def test_add_issue - log_user('jsmith', 'jsmith') - get 'projects/1/issues/new', :tracker_id => '1' - assert_response :success - assert_template 'issues/new' - - post 'projects/1/issues', :tracker_id => "1", - :issue => { :start_date => "2006-12-26", - :priority_id => "4", - :subject => "new test issue", - :category_id => "", - :description => "new issue", - :done_ratio => "0", - :due_date => "", - :assigned_to_id => "" }, - :custom_fields => {'2' => 'Value for field 2'} - # find created issue - issue = Issue.find_by_subject("new test issue") - assert_kind_of Issue, issue - - # check redirection - assert_redirected_to :controller => 'issues', :action => 'show', :id => issue - follow_redirect! - assert_equal issue, assigns(:issue) - - # check issue attributes - assert_equal 'jsmith', issue.author.login - assert_equal 1, issue.project.id - assert_equal 1, issue.status.id - end - - # add then remove 2 attachments to an issue - def test_issue_attachments - log_user('jsmith', 'jsmith') - set_tmp_attachments_directory - - put 'issues/1', - :notes => 'Some notes', - :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'This is an attachment'}} - assert_redirected_to "/issues/1" - - # make sure attachment was saved - attachment = Issue.find(1).attachments.find_by_filename("testfile.txt") - assert_kind_of Attachment, attachment - assert_equal Issue.find(1), attachment.container - assert_equal 'This is an attachment', attachment.description - # verify the size of the attachment stored in db - #assert_equal file_data_1.length, attachment.filesize - # verify that the attachment was written to disk - assert File.exist?(attachment.diskfile) - - # remove the attachments - Issue.find(1).attachments.each(&:destroy) - assert_equal 0, Issue.find(1).attachments.length - end - - def test_other_formats_links_on_index - get '/projects/ecookbook/issues' - - %w(Atom PDF CSV).each do |format| - assert_tag :a, :content => format, - :attributes => { :href => "/projects/ecookbook/issues.#{format.downcase}", - :rel => 'nofollow' } - end - end - - def test_other_formats_links_on_index_without_project_id_in_url - get '/issues', :project_id => 'ecookbook' - - %w(Atom PDF CSV).each do |format| - assert_tag :a, :content => format, - :attributes => { :href => "/projects/ecookbook/issues.#{format.downcase}", - :rel => 'nofollow' } - end - end - - def test_pagination_links_on_index - Setting.per_page_options = '2' - get '/projects/ecookbook/issues' - - assert_tag :a, :content => '2', - :attributes => { :href => '/projects/ecookbook/issues?page=2' } - - end - - def test_pagination_links_on_index_without_project_id_in_url - Setting.per_page_options = '2' - get '/issues', :project_id => 'ecookbook' - - assert_tag :a, :content => '2', - :attributes => { :href => '/projects/ecookbook/issues?page=2' } - - end - - def test_issue_with_user_custom_field - @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all) - Role.anonymous.add_permission! :add_issues, :edit_issues - users = Project.find(1).users - tester = users.first - - # Issue form - get '/projects/ecookbook/issues/new' - assert_response :success - assert_tag :select, - :attributes => {:name => "issue[custom_field_values][#{@field.id}]"}, - :children => {:count => (users.size + 1)}, # +1 for blank value - :child => { - :tag => 'option', - :attributes => {:value => tester.id.to_s}, - :content => tester.name - } - - # Create issue - assert_difference 'Issue.count' do - post '/projects/ecookbook/issues', - :issue => { - :tracker_id => '1', - :priority_id => '4', - :subject => 'Issue with user custom field', - :custom_field_values => {@field.id.to_s => users.first.id.to_s} - } - end - issue = Issue.first(:order => 'id DESC') - assert_response 302 - - # Issue view - follow_redirect! - assert_tag :th, - :content => /Tester/, - :sibling => { - :tag => 'td', - :content => tester.name - } - assert_tag :select, - :attributes => {:name => "issue[custom_field_values][#{@field.id}]"}, - :children => {:count => (users.size + 1)}, # +1 for blank value - :child => { - :tag => 'option', - :attributes => {:value => tester.id.to_s, :selected => 'selected'}, - :content => tester.name - } - - # Update issue - new_tester = users[1] - assert_difference 'Journal.count' do - put "/issues/#{issue.id}", - :notes => 'Updating custom field', - :issue => { - :custom_field_values => {@field.id.to_s => new_tester.id.to_s} - } - end - assert_response 302 - - # Issue view - follow_redirect! - assert_tag :content => 'Tester', - :ancestor => {:tag => 'ul', :attributes => {:class => /details/}}, - :sibling => { - :content => tester.name, - :sibling => { - :content => new_tester.name - } - } - end - - def test_update_using_invalid_http_verbs - subject = 'Updated by an invalid http verb' - - get '/issues/update/1', {:issue => {:subject => subject}}, credentials('jsmith') - assert_response 404 - assert_not_equal subject, Issue.find(1).subject - - post '/issues/1', {:issue => {:subject => subject}}, credentials('jsmith') - assert_response 404 - assert_not_equal subject, Issue.find(1).subject - end - - def test_get_watch_should_be_invalid - assert_no_difference 'Watcher.count' do - get '/watchers/watch?object_type=issue&object_id=1', {}, credentials('jsmith') - assert_response 404 - end - end -end diff --git a/test/integration/layout_test.rb b/test/integration/layout_test.rb deleted file mode 100644 index 4d2e56492..000000000 --- a/test/integration/layout_test.rb +++ /dev/null @@ -1,119 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class LayoutTest < ActionController::IntegrationTest - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - test "browsing to a missing page should render the base layout" do - get "/users/100000000" - - assert_response :not_found - - # UsersController uses the admin layout by default - assert_select "#admin-menu", :count => 0 - end - - test "browsing to an unauthorized page should render the base layout" do - change_user_password('miscuser9', 'test1234') - - log_user('miscuser9','test1234') - - get "/admin" - assert_response :forbidden - assert_select "#admin-menu", :count => 0 - end - - def test_top_menu_and_search_not_visible_when_login_required - with_settings :login_required => '1' do - get '/' - assert_select "#top-menu > ul", 0 - assert_select "#quick-search", 0 - end - end - - def test_top_menu_and_search_visible_when_login_not_required - with_settings :login_required => '0' do - get '/' - assert_select "#top-menu > ul" - assert_select "#quick-search" - end - end - - def test_wiki_formatter_header_tags - Role.anonymous.add_permission! :add_issues - - get '/projects/ecookbook/issues/new' - assert_tag :script, - :attributes => {:src => %r{^/javascripts/jstoolbar/jstoolbar-textile.min.js}}, - :parent => {:tag => 'head'} - end - - def test_calendar_header_tags - with_settings :default_language => 'fr' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-fr.js", response.body - end - - with_settings :default_language => 'en-GB' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-en-GB.js", response.body - end - - with_settings :default_language => 'en' do - get '/issues' - assert_not_include "/javascripts/i18n/jquery.ui.datepicker", response.body - end - - with_settings :default_language => 'zh' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-zh-CN.js", response.body - end - - with_settings :default_language => 'zh-TW' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-zh-TW.js", response.body - end - - with_settings :default_language => 'pt' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-pt.js", response.body - end - - with_settings :default_language => 'pt-BR' do - get '/issues' - assert_include "/javascripts/i18n/jquery.ui.datepicker-pt-BR.js", response.body - end - end - - def test_search_field_outside_project_should_link_to_global_search - get '/' - assert_select 'div#quick-search form[action=/search]' - end - - def test_search_field_inside_project_should_link_to_project_search - get '/projects/ecookbook' - assert_select 'div#quick-search form[action=/projects/ecookbook/search]' - end -end diff --git a/test/integration/lib/redmine/hook_test.rb b/test/integration/lib/redmine/hook_test.rb deleted file mode 100644 index dc53c92f7..000000000 --- a/test/integration/lib/redmine/hook_test.rb +++ /dev/null @@ -1,89 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../../test_helper', __FILE__) - -class HookTest < ActionController::IntegrationTest - fixtures :users, :roles, :projects, :members, :member_roles - - # Hooks that are manually registered later - class ProjectBasedTemplate < Redmine::Hook::ViewListener - def view_layouts_base_html_head(context) - # Adds a project stylesheet - stylesheet_link_tag(context[:project].identifier) if context[:project] - end - end - - class SidebarContent < Redmine::Hook::ViewListener - def view_layouts_base_sidebar(context) - content_tag('p', 'Sidebar hook') - end - end - - class ContentForInsideHook < Redmine::Hook::ViewListener - render_on :view_welcome_index_left, :inline => <<-VIEW -<% content_for :header_tags do %> - <%= javascript_include_tag 'test_plugin.js', :plugin => 'test_plugin' %> - <%= stylesheet_link_tag 'test_plugin.css', :plugin => 'test_plugin' %> -<% end %> - -

ContentForInsideHook content

-VIEW - end - - def setup - Redmine::Hook.clear_listeners - end - - def teardown - Redmine::Hook.clear_listeners - end - - def test_html_head_hook_response - Redmine::Hook.add_listener(ProjectBasedTemplate) - - get '/projects/ecookbook' - assert_tag :tag => 'link', :attributes => {:href => '/stylesheets/ecookbook.css'}, - :parent => {:tag => 'head'} - end - - def test_empty_sidebar_should_be_hidden - get '/' - assert_select 'div#main.nosidebar' - end - - def test_sidebar_with_hook_content_should_not_be_hidden - Redmine::Hook.add_listener(SidebarContent) - - get '/' - assert_select 'div#sidebar p', :text => 'Sidebar hook' - assert_select 'div#main' - assert_select 'div#main.nosidebar', 0 - end - - def test_hook_with_content_for_should_append_content - Redmine::Hook.add_listener(ContentForInsideHook) - - get '/' - assert_response :success - assert_select 'p', :text => 'ContentForInsideHook content' - assert_select 'head' do - assert_select 'script[src=/plugin_assets/test_plugin/javascripts/test_plugin.js]' - assert_select 'link[href=/plugin_assets/test_plugin/stylesheets/test_plugin.css]' - end - end -end diff --git a/test/integration/lib/redmine/menu_manager_test.rb b/test/integration/lib/redmine/menu_manager_test.rb deleted file mode 100644 index db9d8d561..000000000 --- a/test/integration/lib/redmine/menu_manager_test.rb +++ /dev/null @@ -1,76 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../../test_helper', __FILE__) - -class MenuManagerTest < ActionController::IntegrationTest - include Redmine::I18n - - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, :issue_categories, - :projects_trackers, - :roles, - :member_roles, - :members, - :enabled_modules - - def test_project_menu_with_specific_locale - get 'projects/ecookbook/issues', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3' - - assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => ll('fr', :label_activity), - :attributes => { :href => '/projects/ecookbook/activity', - :class => 'activity' } } } - assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => ll('fr', :label_issue_plural), - :attributes => { :href => '/projects/ecookbook/issues', - :class => 'issues selected' } } } - end - - def test_project_menu_with_additional_menu_items - Setting.default_language = 'en' - assert_no_difference 'Redmine::MenuManager.items(:project_menu).size' do - Redmine::MenuManager.map :project_menu do |menu| - menu.push :foo, { :controller => 'projects', :action => 'show' }, :caption => 'Foo' - menu.push :bar, { :controller => 'projects', :action => 'show' }, :before => :activity - menu.push :hello, { :controller => 'projects', :action => 'show' }, :caption => Proc.new {|p| p.name.upcase }, :after => :bar - end - - get 'projects/ecookbook' - assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Foo', - :attributes => { :class => 'foo' } } } - - assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Bar', - :attributes => { :class => 'bar' } }, - :before => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK' } } } - - assert_tag :div, :attributes => { :id => 'main-menu' }, - :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK', - :attributes => { :class => 'hello' } }, - :before => { :tag => 'li', :child => { :tag => 'a', :content => 'Activity' } } } - - # Remove the menu items - Redmine::MenuManager.map :project_menu do |menu| - menu.delete :foo - menu.delete :bar - menu.delete :hello - end - end - end -end diff --git a/test/integration/lib/redmine/themes_test.rb b/test/integration/lib/redmine/themes_test.rb deleted file mode 100644 index 7c21a24b7..000000000 --- a/test/integration/lib/redmine/themes_test.rb +++ /dev/null @@ -1,74 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../../test_helper', __FILE__) - -class ThemesTest < ActionController::IntegrationTest - - def setup - @theme = Redmine::Themes.themes.last - Setting.ui_theme = @theme.id - end - - def teardown - Setting.ui_theme = '' - end - - def test_application_css - get '/' - - assert_response :success - assert_tag :tag => 'link', - :attributes => {:href => %r{^/themes/#{@theme.dir}/stylesheets/application.css}} - end - - def test_without_theme_js - get '/' - - assert_response :success - assert_no_tag :tag => 'script', - :attributes => {:src => %r{^/themes/#{@theme.dir}/javascripts/theme.js}} - end - - def test_with_theme_js - # Simulates a theme.js - @theme.javascripts << 'theme' - get '/' - - assert_response :success - assert_tag :tag => 'script', - :attributes => {:src => %r{^/themes/#{@theme.dir}/javascripts/theme.js}} - - ensure - @theme.javascripts.delete 'theme' - end - - def test_with_sub_uri - Redmine::Utils.relative_url_root = '/foo' - @theme.javascripts << 'theme' - get '/' - - assert_response :success - assert_tag :tag => 'link', - :attributes => {:href => %r{^/foo/themes/#{@theme.dir}/stylesheets/application.css}} - assert_tag :tag => 'script', - :attributes => {:src => %r{^/foo/themes/#{@theme.dir}/javascripts/theme.js}} - - ensure - Redmine::Utils.relative_url_root = '' - end -end diff --git a/test/integration/projects_test.rb b/test/integration/projects_test.rb deleted file mode 100644 index 70d4d9dd3..000000000 --- a/test/integration/projects_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ProjectsTest < ActionController::IntegrationTest - fixtures :projects, :users, :members, :enabled_modules - - def test_archive_project - subproject = Project.find(1).children.first - log_user("admin", "admin") - get "admin/projects" - assert_response :success - assert_template "admin/projects" - post "projects/1/archive" - assert_redirected_to "/admin/projects" - assert !Project.find(1).active? - - get 'projects/1' - assert_response 403 - get "projects/#{subproject.id}" - assert_response 403 - - post "projects/1/unarchive" - assert_redirected_to "/admin/projects" - assert Project.find(1).active? - get "projects/1" - assert_response :success - end - - def test_modules_should_not_allow_get - assert_no_difference 'EnabledModule.count' do - get '/projects/1/modules', {:enabled_module_names => ['']}, credentials('jsmith') - assert_response 404 - end - end -end diff --git a/test/integration/repositories_git_test.rb b/test/integration/repositories_git_test.rb deleted file mode 100644 index e5c556900..000000000 --- a/test/integration/repositories_git_test.rb +++ /dev/null @@ -1,50 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class RepositoriesGitTest < ActionController::IntegrationTest - fixtures :projects, :users, :roles, :members, :member_roles, - :repositories, :enabled_modules - - REPOSITORY_PATH = Rails.root.join('tmp/test/git_repository').to_s - REPOSITORY_PATH.gsub!(/\//, "\\") if Redmine::Platform.mswin? - PRJ_ID = 3 - - def setup - User.current = nil - @project = Project.find(PRJ_ID) - @repository = Repository::Git.create( - :project => @project, - :url => REPOSITORY_PATH, - :path_encoding => 'ISO-8859-1' - ) - assert @repository - end - - if File.directory?(REPOSITORY_PATH) - def test_index - get '/projects/subproject1/repository/' - assert_response :success - end - - def test_diff_two_revs - get '/projects/subproject1/repository/diff?rev=61b685fbe&rev_to=2f9c0091' - assert_response :success - end - end -end diff --git a/test/integration/users_test.rb b/test/integration/users_test.rb deleted file mode 100644 index dea40a1f0..000000000 --- a/test/integration/users_test.rb +++ /dev/null @@ -1,29 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class UsersTest < ActionController::IntegrationTest - fixtures :users - - def test_destroy_should_not_accept_get_requests - assert_no_difference 'User.count' do - get '/users/destroy/2', {}, credentials('admin') - assert_response 404 - end - end -end diff --git a/test/unit/activity_test.rb b/test/unit/activity_test.rb deleted file mode 100644 index 81fecf65e..000000000 --- a/test/unit/activity_test.rb +++ /dev/null @@ -1,129 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ActivityTest < ActiveSupport::TestCase - fixtures :projects, :versions, :attachments, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details, - :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages, :time_entries, - :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions - - def setup - @project = Project.find(1) - end - - def test_activity_without_subprojects - events = find_events(User.anonymous, :project => @project) - assert_not_nil events - - assert events.include?(Issue.find(1)) - assert !events.include?(Issue.find(4)) - # subproject issue - assert !events.include?(Issue.find(5)) - end - - def test_activity_with_subprojects - events = find_events(User.anonymous, :project => @project, :with_subprojects => 1) - assert_not_nil events - - assert events.include?(Issue.find(1)) - # subproject issue - assert events.include?(Issue.find(5)) - end - - def test_global_activity_anonymous - events = find_events(User.anonymous) - assert_not_nil events - - assert events.include?(Issue.find(1)) - assert events.include?(Message.find(5)) - # Issue of a private project - assert !events.include?(Issue.find(4)) - # Private issue and comment - assert !events.include?(Issue.find(14)) - assert !events.include?(Journal.find(5)) - end - - def test_global_activity_logged_user - events = find_events(User.find(2)) # manager - assert_not_nil events - - assert events.include?(Issue.find(1)) - # Issue of a private project the user belongs to - assert events.include?(Issue.find(4)) - end - - def test_user_activity - user = User.find(2) - events = Redmine::Activity::Fetcher.new(User.anonymous, :author => user).events(nil, nil, :limit => 10) - - assert(events.size > 0) - assert(events.size <= 10) - assert_nil(events.detect {|e| e.event_author != user}) - end - - def test_files_activity - f = Redmine::Activity::Fetcher.new(User.anonymous, :project => Project.find(1)) - f.scope = ['files'] - events = f.events - - assert_kind_of Array, events - assert events.include?(Attachment.find_by_container_type_and_container_id('Project', 1)) - assert events.include?(Attachment.find_by_container_type_and_container_id('Version', 1)) - assert_equal [Attachment], events.collect(&:class).uniq - assert_equal %w(Project Version), events.collect(&:container_type).uniq.sort - end - - def test_event_group_for_issue - issue = Issue.find(1) - assert_equal issue, issue.event_group - end - - def test_event_group_for_journal - issue = Issue.find(1) - journal = issue.journals.first - assert_equal issue, journal.event_group - end - - def test_event_group_for_issue_time_entry - time = TimeEntry.where(:issue_id => 1).first - assert_equal time.issue, time.event_group - end - - def test_event_group_for_project_time_entry - time = TimeEntry.where(:issue_id => nil).first - assert_equal time, time.event_group - end - - def test_event_group_for_message - message = Message.find(1) - reply = message.children.first - assert_equal message, message.event_group - assert_equal message, reply.event_group - end - - def test_event_group_for_wiki_content_version - content = WikiContent::Version.find(1) - assert_equal content.page, content.event_group - end - - private - - def find_events(user, options={}) - Redmine::Activity::Fetcher.new(user, options).events(Date.today - 30, Date.today + 1) - end -end diff --git a/test/unit/applied_project_test.rb b/test/unit/applied_project_test.rb deleted file mode 100644 index 708605d17..000000000 --- a/test/unit/applied_project_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class AppliedProjectTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/apply_project_master_test.rb b/test/unit/apply_project_master_test.rb deleted file mode 100644 index 62309b315..000000000 --- a/test/unit/apply_project_master_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ApplyProjectMasterTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/attachment_test.rb b/test/unit/attachment_test.rb deleted file mode 100644 index 83abee85b..000000000 --- a/test/unit/attachment_test.rb +++ /dev/null @@ -1,287 +0,0 @@ -# encoding: utf-8 -# -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AttachmentTest < ActiveSupport::TestCase - fixtures :users, :projects, :roles, :members, :member_roles, - :enabled_modules, :issues, :trackers, :attachments - - class MockFile - attr_reader :original_filename, :content_type, :content, :size - - def initialize(attributes) - @original_filename = attributes[:original_filename] - @content_type = attributes[:content_type] - @content = attributes[:content] || "Content" - @size = content.size - end - end - - def setup - set_tmp_attachments_directory - end - - def test_container_for_new_attachment_should_be_nil - assert_nil Attachment.new.container - end - - def test_create - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'testfile.txt', a.filename - assert_equal 59, a.filesize - assert_equal 'text/plain', a.content_type - assert_equal 0, a.downloads - assert_equal '1478adae0d4eb06d35897518540e25d6', a.digest - - #新增的属性检查 - assert_equal 'txt',a.suffix_type - assert_equal 'txt',a.show_suffix_type - - assert a.disk_directory - assert_match %r{\A\d{4}/\d{2}\z}, a.disk_directory - - assert File.exist?(a.diskfile) - assert_equal 59, File.size(a.diskfile) - end - - def test_copy_should_preserve_attributes - a = Attachment.find(1) - copy = a.copy - - assert_save copy - copy = Attachment.order('id DESC').first - %w(filename filesize content_type author_id created_on description digest disk_filename disk_directory diskfile).each do |attribute| - assert_equal a.send(attribute), copy.send(attribute), "#{attribute} was different" - end - end - - def test_size_should_be_validated_for_new_file - with_settings :attachment_max_size => 0 do - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", "text/plain"), - :author => User.find(1)) - assert !a.save - end - end - - def test_size_should_not_be_validated_when_copying - a = Attachment.create!(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", "text/plain"), - :author => User.find(1)) - with_settings :attachment_max_size => 0 do - copy = a.copy - assert copy.save - end - end - - def test_description_length_should_be_validated - a = Attachment.new(:description => 'a' * 300) - assert !a.save - assert_not_nil a.errors[:description] - end - - def test_destroy - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", "text/plain"), - :author => User.find(1)) - assert a.save - assert_equal 'testfile.txt', a.filename - assert_equal 59, a.filesize - assert_equal 'text/plain', a.content_type - assert_equal 0, a.downloads - assert_equal '1478adae0d4eb06d35897518540e25d6', a.digest - diskfile = a.diskfile - assert File.exist?(diskfile) - assert_equal 59, File.size(a.diskfile) - assert a.destroy - assert !File.exist?(diskfile) - end - - def test_destroy_should_not_delete_file_referenced_by_other_attachment - a = Attachment.create!(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", "text/plain"), - :author => User.find(1)) - diskfile = a.diskfile - - copy = a.copy - copy.save! - - assert File.exists?(diskfile) - a.destroy - assert File.exists?(diskfile) - copy.destroy - assert !File.exists?(diskfile) - end - - def test_create_should_auto_assign_content_type - a = Attachment.new(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", ""), - :author => User.find(1)) - assert a.save - assert_equal 'text/plain', a.content_type - end - - def test_identical_attachments_at_the_same_time_should_not_overwrite - a1 = Attachment.create!(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", ""), - :author => User.find(1)) - a2 = Attachment.create!(:container => Issue.find(1), - :file => uploaded_test_file("testfile.txt", ""), - :author => User.find(1)) - assert a1.disk_filename != a2.disk_filename - end - - def test_filename_should_be_basenamed - a = Attachment.new(:file => MockFile.new(:original_filename => "path/to/the/file")) - assert_equal 'file', a.filename - end - - def test_filename_should_be_sanitized - a = Attachment.new(:file => MockFile.new(:original_filename => "valid:[] invalid:?%*|\"'<>chars")) - assert_equal 'valid_[] invalid_chars', a.filename - end - - def test_diskfilename - assert Attachment.disk_filename("test_file.txt") =~ /^\d{12}_test_file.txt$/ - assert_equal 'test_file.txt', Attachment.disk_filename("test_file.txt")[13..-1] - assert_equal '770c509475505f37c2b8fb6030434d6b.txt', Attachment.disk_filename("test_accentué.txt")[13..-1] - assert_equal 'f8139524ebb8f32e51976982cd20a85d', Attachment.disk_filename("test_accentué")[13..-1] - assert_equal 'cbb5b0f30978ba03731d61f9f6d10011', Attachment.disk_filename("test_accentué.ça")[13..-1] - end - - def test_title - a = Attachment.new(:filename => "test.png") - assert_equal "test.png", a.title - - a = Attachment.new(:filename => "test.png", :description => "Cool image") - assert_equal "test.png (Cool image)", a.title - end - - def test_prune_should_destroy_old_unattached_attachments - Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1, :created_on => 2.days.ago) - Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1, :created_on => 2.days.ago) - Attachment.create!(:file => uploaded_test_file("testfile.txt", ""), :author_id => 1) - - assert_difference 'Attachment.count', -2 do - Attachment.prune - end - end - - def test_move_from_root_to_target_directory_should_move_root_files - a = Attachment.find(20) - assert a.disk_directory.blank? - # Create a real file for this fixture - File.open(a.diskfile, "w") do |f| - f.write "test file at the root of files directory" - end - assert a.readable? - Attachment.move_from_root_to_target_directory - - a.reload - assert_equal '2012/05', a.disk_directory - assert a.readable? - end - - test "Attachmnet.attach_files should attach the file" do - issue = Issue.first - assert_difference 'Attachment.count' do - Attachment.attach_files(issue, - '1' => { - 'file' => uploaded_test_file('testfile.txt', 'text/plain'), - 'description' => 'test' - }) - end - - attachment = Attachment.first(:order => 'id DESC') - assert_equal issue, attachment.container - assert_equal 'testfile.txt', attachment.filename - assert_equal 59, attachment.filesize - assert_equal 'test', attachment.description - assert_equal 'text/plain', attachment.content_type - assert File.exists?(attachment.diskfile) - assert_equal 59, File.size(attachment.diskfile) - end - - test "Attachmnet.attach_files should add unsaved files to the object as unsaved attachments" do - # Max size of 0 to force Attachment creation failures - with_settings(:attachment_max_size => 0) do - @project = Project.find(1) - response = Attachment.attach_files(@project, { - '1' => {'file' => mock_file, 'description' => 'test'}, - '2' => {'file' => mock_file, 'description' => 'test'} - }) - - assert response[:unsaved].present? - assert_equal 2, response[:unsaved].length - assert response[:unsaved].first.new_record? - assert response[:unsaved].second.new_record? - assert_equal response[:unsaved], @project.unsaved_attachments - end - end - - def test_latest_attach - set_fixtures_attachments_directory - a1 = Attachment.find(16) - assert_equal "testfile.png", a1.filename - assert a1.readable? - assert (! a1.visible?(User.anonymous)) - assert a1.visible?(User.find(2)) - a2 = Attachment.find(17) - assert_equal "testfile.PNG", a2.filename - assert a2.readable? - assert (! a2.visible?(User.anonymous)) - assert a2.visible?(User.find(2)) - assert a1.created_on < a2.created_on - - la1 = Attachment.latest_attach([a1, a2], "testfile.png") - assert_equal 17, la1.id - la2 = Attachment.latest_attach([a1, a2], "Testfile.PNG") - assert_equal 17, la2.id - - set_tmp_attachments_directory - end - - def test_thumbnailable_should_be_true_for_images - assert_equal true, Attachment.new(:filename => 'test.jpg').thumbnailable? - end - - def test_thumbnailable_should_be_true_for_non_images - assert_equal false, Attachment.new(:filename => 'test.txt').thumbnailable? - end - - if convert_installed? - def test_thumbnail_should_generate_the_thumbnail - set_fixtures_attachments_directory - attachment = Attachment.find(16) - Attachment.clear_thumbnails - - assert_difference "Dir.glob(File.join(Attachment.thumbnails_storage_path, '*.thumb')).size" do - thumbnail = attachment.thumbnail - assert_equal "16_8e0294de2441577c529f170b6fb8f638_100.thumb", File.basename(thumbnail) - assert File.exists?(thumbnail) - end - end - else - puts '(ImageMagick convert not available)' - end -end diff --git a/test/unit/attachmentstype_test.rb b/test/unit/attachmentstype_test.rb deleted file mode 100644 index 0dcee4479..000000000 --- a/test/unit/attachmentstype_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class AttachmentstypeTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/auth_source_ldap_test.rb b/test/unit/auth_source_ldap_test.rb deleted file mode 100644 index 6febe303b..000000000 --- a/test/unit/auth_source_ldap_test.rb +++ /dev/null @@ -1,141 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class AuthSourceLdapTest < ActiveSupport::TestCase - include Redmine::I18n - fixtures :auth_sources - - def setup - end - - def test_create - a = AuthSourceLdap.new(:name => 'My LDAP', :host => 'ldap.example.net', :port => 389, :base_dn => 'dc=example,dc=net', :attr_login => 'sAMAccountName') - assert a.save - end - - def test_should_strip_ldap_attributes - a = AuthSourceLdap.new(:name => 'My LDAP', :host => 'ldap.example.net', :port => 389, :base_dn => 'dc=example,dc=net', :attr_login => 'sAMAccountName', - :attr_firstname => 'givenName ') - assert a.save - assert_equal 'givenName', a.reload.attr_firstname - end - - def test_replace_port_zero_to_389 - a = AuthSourceLdap.new( - :name => 'My LDAP', :host => 'ldap.example.net', :port => 0, - :base_dn => 'dc=example,dc=net', :attr_login => 'sAMAccountName', - :attr_firstname => 'givenName ') - assert a.save - assert_equal 389, a.port - end - - def test_filter_should_be_validated - set_language_if_valid 'en' - - a = AuthSourceLdap.new(:name => 'My LDAP', :host => 'ldap.example.net', :port => 389, :attr_login => 'sn') - a.filter = "(mail=*@redmine.org" - assert !a.valid? - assert_include "LDAP filter is invalid", a.errors.full_messages - - a.filter = "(mail=*@redmine.org)" - assert a.valid? - end - - if ldap_configured? - test '#authenticate with a valid LDAP user should return the user attributes' do - auth = AuthSourceLdap.find(1) - auth.update_attribute :onthefly_register, true - - attributes = auth.authenticate('example1','123456') - assert attributes.is_a?(Hash), "An hash was not returned" - assert_equal 'Example', attributes[:firstname] - assert_equal 'One', attributes[:lastname] - assert_equal 'example1@redmine.org', attributes[:mail] - assert_equal auth.id, attributes[:auth_source_id] - attributes.keys.each do |attribute| - assert User.new.respond_to?("#{attribute}="), "Unexpected :#{attribute} attribute returned" - end - end - - test '#authenticate with an invalid LDAP user should return nil' do - auth = AuthSourceLdap.find(1) - assert_equal nil, auth.authenticate('nouser','123456') - end - - test '#authenticate without a login should return nil' do - auth = AuthSourceLdap.find(1) - assert_equal nil, auth.authenticate('','123456') - end - - test '#authenticate without a password should return nil' do - auth = AuthSourceLdap.find(1) - assert_equal nil, auth.authenticate('edavis','') - end - - test '#authenticate without filter should return any user' do - auth = AuthSourceLdap.find(1) - assert auth.authenticate('example1','123456') - assert auth.authenticate('edavis', '123456') - end - - test '#authenticate with filter should return user who matches the filter only' do - auth = AuthSourceLdap.find(1) - auth.filter = "(mail=*@redmine.org)" - - assert auth.authenticate('example1','123456') - assert_nil auth.authenticate('edavis', '123456') - end - - def test_authenticate_should_timeout - auth_source = AuthSourceLdap.find(1) - auth_source.timeout = 1 - def auth_source.initialize_ldap_con(*args); sleep(5); end - - assert_raise AuthSourceTimeoutException do - auth_source.authenticate 'example1', '123456' - end - end - - def test_search_should_return_matching_entries - results = AuthSource.search("exa") - assert_equal 1, results.size - result = results.first - assert_kind_of Hash, result - assert_equal "example1", result[:login] - assert_equal "Example", result[:firstname] - assert_equal "One", result[:lastname] - assert_equal "example1@redmine.org", result[:mail] - assert_equal 1, result[:auth_source_id] - end - - def test_search_with_no_match_should_return_an_empty_array - results = AuthSource.search("wro") - assert_equal [], results - end - - def test_search_with_exception_should_return_an_empty_array - Net::LDAP.stubs(:new).raises(Net::LDAP::LdapError, 'Cannot connect') - - results = AuthSource.search("exa") - assert_equal [], results - end - else - puts '(Test LDAP server not configured)' - end -end diff --git a/test/unit/board_test.rb b/test/unit/board_test.rb deleted file mode 100644 index 50f0c160b..000000000 --- a/test/unit/board_test.rb +++ /dev/null @@ -1,116 +0,0 @@ -# encoding: utf-8 -# -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class BoardTest < ActiveSupport::TestCase - fixtures :projects, :boards, :messages, :attachments, :watchers - - include Redmine::I18n - - def setup - @project = Project.find(1) - end - - def test_create - board = Board.new(:project => @project, :name => 'Test board', :description => 'Test board description') - assert board.save - board.reload - assert_equal 'Test board', board.name - assert_equal 'Test board description', board.description - assert_equal @project, board.project - assert_equal 0, board.topics_count - assert_equal 0, board.messages_count - assert_nil board.last_message - # last position - assert_equal @project.boards.size, board.position - end - - def test_parent_should_be_in_same_project - set_language_if_valid 'en' - board = Board.new(:project_id => 3, :name => 'Test', :description => 'Test', :parent_id => 1) - assert !board.save - assert_include "Parent forum is invalid", board.errors.full_messages - end - - def test_valid_parents_should_not_include_self_nor_a_descendant - board1 = Board.generate!(:project_id => 3) - board2 = Board.generate!(:project_id => 3, :parent => board1) - board3 = Board.generate!(:project_id => 3, :parent => board2) - board4 = Board.generate!(:project_id => 3) - - assert_equal [board4], board1.reload.valid_parents.sort_by(&:id) - assert_equal [board1, board4], board2.reload.valid_parents.sort_by(&:id) - assert_equal [board1, board2, board4], board3.reload.valid_parents.sort_by(&:id) - assert_equal [board1, board2, board3], board4.reload.valid_parents.sort_by(&:id) - end - - def test_position_should_be_assigned_with_parent_scope - parent1 = Board.generate!(:project_id => 3) - parent2 = Board.generate!(:project_id => 3) - child1 = Board.generate!(:project_id => 3, :parent => parent1) - child2 = Board.generate!(:project_id => 3, :parent => parent1) - - assert_equal 1, parent1.reload.position - assert_equal 1, child1.reload.position - assert_equal 2, child2.reload.position - assert_equal 2, parent2.reload.position - end - - def test_board_tree_should_yield_boards_with_level - parent1 = Board.generate!(:project_id => 3) - parent2 = Board.generate!(:project_id => 3) - child1 = Board.generate!(:project_id => 3, :parent => parent1) - child2 = Board.generate!(:project_id => 3, :parent => parent1) - child3 = Board.generate!(:project_id => 3, :parent => child1) - - tree = Board.board_tree(Project.find(3).boards) - - assert_equal [ - [parent1, 0], - [child1, 1], - [child3, 2], - [child2, 1], - [parent2, 0] - ], tree - end - - def test_destroy - board = Board.find(1) - assert_difference 'Message.count', -6 do - assert_difference 'Attachment.count', -1 do - assert_difference 'Watcher.count', -1 do - assert board.destroy - end - end - end - assert_equal 0, Message.count(:conditions => {:board_id => 1}) - end - - def test_destroy_should_nullify_children - parent = Board.generate!(:project => @project) - child = Board.generate!(:project => @project, :parent => parent) - assert_equal parent, child.parent - - assert parent.destroy - child.reload - assert_nil child.parent - assert_nil child.parent_id - end -end diff --git a/test/unit/bug_to_osp_test.rb b/test/unit/bug_to_osp_test.rb deleted file mode 100644 index 5e466f081..000000000 --- a/test/unit/bug_to_osp_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class BugToOspTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/changeset_test.rb b/test/unit/changeset_test.rb deleted file mode 100644 index 41679175f..000000000 --- a/test/unit/changeset_test.rb +++ /dev/null @@ -1,476 +0,0 @@ -# encoding: utf-8 -# -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class ChangesetTest < ActiveSupport::TestCase - fixtures :projects, :repositories, - :issues, :issue_statuses, :issue_categories, - :changesets, :changes, - :enumerations, - :custom_fields, :custom_values, - :users, :members, :member_roles, :trackers, - :enabled_modules, :roles - - def test_ref_keywords_any - ActionMailer::Base.deliveries.clear - Setting.commit_fix_status_id = IssueStatus.find( - :first, :conditions => ["is_closed = ?", true]).id - Setting.commit_fix_done_ratio = '90' - Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = 'fixes , closes' - - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'New commit (#2). Fixes #1', - :revision => '12345') - assert c.save - assert_equal [1, 2], c.issue_ids.sort - fixed = Issue.find(1) - assert fixed.closed? - assert_equal 90, fixed.done_ratio - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_ref_keywords - Setting.commit_ref_keywords = 'refs' - Setting.commit_fix_keywords = '' - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'Ignores #2. Refs #1', - :revision => '12345') - assert c.save - assert_equal [1], c.issue_ids.sort - end - - def test_ref_keywords_any_only - Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = '' - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'Ignores #2. Refs #1', - :revision => '12345') - assert c.save - assert_equal [1, 2], c.issue_ids.sort - end - - def test_ref_keywords_any_with_timelog - Setting.commit_ref_keywords = '*' - Setting.commit_logtime_enabled = '1' - - { - '2' => 2.0, - '2h' => 2.0, - '2hours' => 2.0, - '15m' => 0.25, - '15min' => 0.25, - '3h15' => 3.25, - '3h15m' => 3.25, - '3h15min' => 3.25, - '3:15' => 3.25, - '3.25' => 3.25, - '3.25h' => 3.25, - '3,25' => 3.25, - '3,25h' => 3.25, - }.each do |syntax, expected_hours| - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => 24.hours.ago, - :comments => "Worked on this issue #1 @#{syntax}", - :revision => '520', - :user => User.find(2)) - assert_difference 'TimeEntry.count' do - c.scan_comment_for_issue_ids - end - assert_equal [1], c.issue_ids.sort - - time = TimeEntry.first(:order => 'id desc') - assert_equal 1, time.issue_id - assert_equal 1, time.project_id - assert_equal 2, time.user_id - assert_equal expected_hours, time.hours, - "@#{syntax} should be logged as #{expected_hours} hours but was #{time.hours}" - assert_equal Date.yesterday, time.spent_on - assert time.activity.is_default? - assert time.comments.include?('r520'), - "r520 was expected in time_entry comments: #{time.comments}" - end - end - - def test_ref_keywords_closing_with_timelog - Setting.commit_fix_status_id = IssueStatus.find( - :first, :conditions => ["is_closed = ?", true]).id - Setting.commit_ref_keywords = '*' - Setting.commit_fix_keywords = 'fixes , closes' - Setting.commit_logtime_enabled = '1' - - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'This is a comment. Fixes #1 @4.5, #2 @1', - :user => User.find(2)) - assert_difference 'TimeEntry.count', 2 do - c.scan_comment_for_issue_ids - end - - assert_equal [1, 2], c.issue_ids.sort - assert Issue.find(1).closed? - assert Issue.find(2).closed? - - times = TimeEntry.all(:order => 'id desc', :limit => 2) - assert_equal [1, 2], times.collect(&:issue_id).sort - end - - def test_ref_keywords_any_line_start - Setting.commit_ref_keywords = '*' - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => '#1 is the reason of this commit', - :revision => '12345') - assert c.save - assert_equal [1], c.issue_ids.sort - end - - def test_ref_keywords_allow_brackets_around_a_issue_number - Setting.commit_ref_keywords = '*' - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => '[#1] Worked on this issue', - :revision => '12345') - assert c.save - assert_equal [1], c.issue_ids.sort - end - - def test_ref_keywords_allow_brackets_around_multiple_issue_numbers - Setting.commit_ref_keywords = '*' - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => '[#1 #2, #3] Worked on these', - :revision => '12345') - assert c.save - assert_equal [1,2,3], c.issue_ids.sort - end - - def test_commit_referencing_a_subproject_issue - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'refs #5, a subproject issue', - :revision => '12345') - assert c.save - assert_equal [5], c.issue_ids.sort - assert c.issues.first.project != c.project - end - - def test_commit_closing_a_subproject_issue - with_settings :commit_fix_status_id => 5, :commit_fix_keywords => 'closes', - :default_language => 'en' do - issue = Issue.find(5) - assert !issue.closed? - assert_difference 'Journal.count' do - c = Changeset.new(:repository => Project.find(1).repository, - :committed_on => Time.now, - :comments => 'closes #5, a subproject issue', - :revision => '12345') - assert c.save - end - assert issue.reload.closed? - journal = Journal.first(:order => 'id DESC') - assert_equal issue, journal.issue - assert_include "Applied in changeset ecookbook:r12345.", journal.notes - end - end - - def test_commit_referencing_a_parent_project_issue - # repository of child project - r = Repository::Subversion.create!( - :project => Project.find(3), - :url => 'svn://localhost/test') - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :comments => 'refs #2, an issue of a parent project', - :revision => '12345') - assert c.save - assert_equal [2], c.issue_ids.sort - assert c.issues.first.project != c.project - end - - def test_commit_referencing_a_project_with_commit_cross_project_ref_disabled - r = Repository::Subversion.create!( - :project => Project.find(3), - :url => 'svn://localhost/test') - - with_settings :commit_cross_project_ref => '0' do - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :comments => 'refs #4, an issue of a different project', - :revision => '12345') - assert c.save - assert_equal [], c.issue_ids - end - end - - def test_commit_referencing_a_project_with_commit_cross_project_ref_enabled - r = Repository::Subversion.create!( - :project => Project.find(3), - :url => 'svn://localhost/test') - - with_settings :commit_cross_project_ref => '1' do - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :comments => 'refs #4, an issue of a different project', - :revision => '12345') - assert c.save - assert_equal [4], c.issue_ids - end - end - - def test_text_tag_revision - c = Changeset.new(:revision => '520') - assert_equal 'r520', c.text_tag - end - - def test_text_tag_revision_with_same_project - c = Changeset.new(:revision => '520', :repository => Project.find(1).repository) - assert_equal 'r520', c.text_tag(Project.find(1)) - end - - def test_text_tag_revision_with_different_project - c = Changeset.new(:revision => '520', :repository => Project.find(1).repository) - assert_equal 'ecookbook:r520', c.text_tag(Project.find(2)) - end - - def test_text_tag_revision_with_repository_identifier - r = Repository::Subversion.create!( - :project_id => 1, - :url => 'svn://localhost/test', - :identifier => 'documents') - - c = Changeset.new(:revision => '520', :repository => r) - assert_equal 'documents|r520', c.text_tag - assert_equal 'ecookbook:documents|r520', c.text_tag(Project.find(2)) - end - - def test_text_tag_hash - c = Changeset.new( - :scmid => '7234cb2750b63f47bff735edc50a1c0a433c2518', - :revision => '7234cb2750b63f47bff735edc50a1c0a433c2518') - assert_equal 'commit:7234cb2750b63f47bff735edc50a1c0a433c2518', c.text_tag - end - - def test_text_tag_hash_with_same_project - c = Changeset.new(:revision => '7234cb27', :scmid => '7234cb27', :repository => Project.find(1).repository) - assert_equal 'commit:7234cb27', c.text_tag(Project.find(1)) - end - - def test_text_tag_hash_with_different_project - c = Changeset.new(:revision => '7234cb27', :scmid => '7234cb27', :repository => Project.find(1).repository) - assert_equal 'ecookbook:commit:7234cb27', c.text_tag(Project.find(2)) - end - - def test_text_tag_hash_all_number - c = Changeset.new(:scmid => '0123456789', :revision => '0123456789') - assert_equal 'commit:0123456789', c.text_tag - end - - def test_previous - changeset = Changeset.find_by_revision('3') - assert_equal Changeset.find_by_revision('2'), changeset.previous - end - - def test_previous_nil - changeset = Changeset.find_by_revision('1') - assert_nil changeset.previous - end - - def test_next - changeset = Changeset.find_by_revision('2') - assert_equal Changeset.find_by_revision('3'), changeset.next - end - - def test_next_nil - changeset = Changeset.find_by_revision('10') - assert_nil changeset.next - end - - def test_comments_should_be_converted_to_utf8 - proj = Project.find(3) - # str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt") - str = "Texte encod\xe9 en ISO-8859-1." - str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'ISO-8859-1' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => str) - assert( c.save ) - str_utf8 = "Texte encod\xc3\xa9 en ISO-8859-1." - str_utf8.force_encoding("UTF-8") if str_utf8.respond_to?(:force_encoding) - assert_equal str_utf8, c.comments - end - - def test_invalid_utf8_sequences_in_comments_should_be_replaced_latin1 - proj = Project.find(3) - # str = File.read("#{RAILS_ROOT}/test/fixtures/encoding/iso-8859-1.txt") - str1 = "Texte encod\xe9 en ISO-8859-1." - str2 = "\xe9a\xe9b\xe9c\xe9d\xe9e test" - str1.force_encoding("UTF-8") if str1.respond_to?(:force_encoding) - str2.force_encoding("ASCII-8BIT") if str2.respond_to?(:force_encoding) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'UTF-8' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => str1, - :committer => str2) - assert( c.save ) - assert_equal "Texte encod? en ISO-8859-1.", c.comments - assert_equal "?a?b?c?d?e test", c.committer - end - - def test_invalid_utf8_sequences_in_comments_should_be_replaced_ja_jis - proj = Project.find(3) - str = "test\xb5\xfetest\xb5\xfe" - if str.respond_to?(:force_encoding) - str.force_encoding('ASCII-8BIT') - end - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'ISO-2022-JP' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => str) - assert( c.save ) - assert_equal "test??test??", c.comments - end - - def test_comments_should_be_converted_all_latin1_to_utf8 - s1 = "\xC2\x80" - s2 = "\xc3\x82\xc2\x80" - s4 = s2.dup - if s1.respond_to?(:force_encoding) - s3 = s1.dup - s1.force_encoding('ASCII-8BIT') - s2.force_encoding('ASCII-8BIT') - s3.force_encoding('ISO-8859-1') - s4.force_encoding('UTF-8') - assert_equal s3.encode('UTF-8'), s4 - end - proj = Project.find(3) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'ISO-8859-1' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => s1) - assert( c.save ) - assert_equal s4, c.comments - end - - def test_invalid_utf8_sequences_in_paths_should_be_replaced - proj = Project.find(3) - str1 = "Texte encod\xe9 en ISO-8859-1" - str2 = "\xe9a\xe9b\xe9c\xe9d\xe9e test" - str1.force_encoding("UTF-8") if str1.respond_to?(:force_encoding) - str2.force_encoding("ASCII-8BIT") if str2.respond_to?(:force_encoding) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'UTF-8' ) - assert r - cs = Changeset.new( - :repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => "test") - assert(cs.save) - ch = Change.new( - :changeset => cs, - :action => "A", - :path => str1, - :from_path => str2, - :from_revision => "345") - assert(ch.save) - assert_equal "Texte encod? en ISO-8859-1", ch.path - assert_equal "?a?b?c?d?e test", ch.from_path - end - - def test_comments_nil - proj = Project.find(3) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'ISO-8859-1' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => nil, - :committer => nil) - assert( c.save ) - assert_equal "", c.comments - assert_equal nil, c.committer - if c.comments.respond_to?(:force_encoding) - assert_equal "UTF-8", c.comments.encoding.to_s - end - end - - def test_comments_empty - proj = Project.find(3) - r = Repository::Bazaar.create!( - :project => proj, - :url => '/tmp/test/bazaar', - :log_encoding => 'ISO-8859-1' ) - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '12345', - :comments => "", - :committer => "") - assert( c.save ) - assert_equal "", c.comments - assert_equal "", c.committer - if c.comments.respond_to?(:force_encoding) - assert_equal "UTF-8", c.comments.encoding.to_s - assert_equal "UTF-8", c.committer.encoding.to_s - end - end - - def test_identifier - c = Changeset.find_by_revision('1') - assert_equal c.revision, c.identifier - end -end diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb deleted file mode 100644 index 11ab50af3..000000000 --- a/test/unit/comment_test.rb +++ /dev/null @@ -1,57 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CommentTest < ActiveSupport::TestCase - fixtures :users, :news, :comments, :projects, :enabled_modules - - def setup - @jsmith = User.find(2) - @news = News.find(1) - end - - def test_create - comment = Comment.new(:commented => @news, :author => @jsmith, :comments => "my comment") - assert comment.save - @news.reload - assert_equal 2, @news.comments_count - end - - def test_create_should_send_notification - Watcher.create!(:watchable => @news, :user => @jsmith) - - with_settings :notified_events => %w(news_comment_added) do - assert_difference 'ActionMailer::Base.deliveries.size' do - Comment.create!(:commented => @news, :author => @jsmith, :comments => "my comment") - end - end - end - - def test_validate - comment = Comment.new(:commented => @news) - assert !comment.save - assert_equal 2, comment.errors.count - end - - def test_destroy - comment = Comment.find(1) - assert comment.destroy - @news.reload - assert_equal 0, @news.comments_count - end -end diff --git a/test/unit/contesting_softapplication_test.rb b/test/unit/contesting_softapplication_test.rb deleted file mode 100644 index 0c1364caa..000000000 --- a/test/unit/contesting_softapplication_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ContestingSoftapplicationTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/contestnotification_test.rb b/test/unit/contestnotification_test.rb deleted file mode 100644 index 22b8113c7..000000000 --- a/test/unit/contestnotification_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ContestnotificationTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/course_infos_test.rb b/test/unit/course_infos_test.rb deleted file mode 100644 index f20a519db..000000000 --- a/test/unit/course_infos_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class CourseInfosTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/course_status_test.rb b/test/unit/course_status_test.rb deleted file mode 100644 index 6c8fc11be..000000000 --- a/test/unit/course_status_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class CourseStatusTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/custom_field_test.rb b/test/unit/custom_field_test.rb deleted file mode 100644 index c8db3da96..000000000 --- a/test/unit/custom_field_test.rb +++ /dev/null @@ -1,244 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CustomFieldTest < ActiveSupport::TestCase - fixtures :custom_fields - - def test_create - field = UserCustomField.new(:name => 'Money money money', :field_format => 'float') - assert field.save - end - - def test_before_validation - field = CustomField.new(:name => 'test_before_validation', :field_format => 'int') - field.searchable = true - assert field.save - assert_equal false, field.searchable - field.searchable = true - assert field.save - assert_equal false, field.searchable - end - - def test_regexp_validation - field = IssueCustomField.new(:name => 'regexp', :field_format => 'text', :regexp => '[a-z0-9') - assert !field.save - assert_include I18n.t('activerecord.errors.messages.invalid'), - field.errors[:regexp] - field.regexp = '[a-z0-9]' - assert field.save - end - - def test_default_value_should_be_validated - field = CustomField.new(:name => 'Test', :field_format => 'int') - field.default_value = 'abc' - assert !field.valid? - field.default_value = '6' - assert field.valid? - end - - def test_default_value_should_not_be_validated_when_blank - field = CustomField.new(:name => 'Test', :field_format => 'list', :possible_values => ['a', 'b'], :is_required => true, :default_value => '') - assert field.valid? - end - - def test_should_not_change_field_format_of_existing_custom_field - field = CustomField.find(1) - field.field_format = 'int' - assert_equal 'list', field.field_format - end - - def test_possible_values_should_accept_an_array - field = CustomField.new - field.possible_values = ["One value", ""] - assert_equal ["One value"], field.possible_values - end - - def test_possible_values_should_accept_a_string - field = CustomField.new - field.possible_values = "One value" - assert_equal ["One value"], field.possible_values - end - - def test_possible_values_should_accept_a_multiline_string - field = CustomField.new - field.possible_values = "One value\nAnd another one \r\n \n" - assert_equal ["One value", "And another one"], field.possible_values - end - - if "string".respond_to?(:encoding) - def test_possible_values_stored_as_binary_should_be_utf8_encoded - field = CustomField.find(11) - assert_kind_of Array, field.possible_values - assert field.possible_values.size > 0 - field.possible_values.each do |value| - assert_equal "UTF-8", value.encoding.name - end - end - end - - def test_destroy - field = CustomField.find(1) - assert field.destroy - end - - def test_new_subclass_instance_should_return_an_instance - f = CustomField.new_subclass_instance('IssueCustomField') - assert_kind_of IssueCustomField, f - end - - def test_new_subclass_instance_should_set_attributes - f = CustomField.new_subclass_instance('IssueCustomField', :name => 'Test') - assert_kind_of IssueCustomField, f - assert_equal 'Test', f.name - end - - def test_new_subclass_instance_with_invalid_class_name_should_return_nil - assert_nil CustomField.new_subclass_instance('WrongClassName') - end - - def test_new_subclass_instance_with_non_subclass_name_should_return_nil - assert_nil CustomField.new_subclass_instance('Project') - end - - def test_string_field_validation_with_blank_value - f = CustomField.new(:field_format => 'string') - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - - f.is_required = true - assert !f.valid_field_value?(nil) - assert !f.valid_field_value?('') - end - - def test_string_field_validation_with_min_and_max_lengths - f = CustomField.new(:field_format => 'string', :min_length => 2, :max_length => 5) - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('a' * 2) - assert !f.valid_field_value?('a') - assert !f.valid_field_value?('a' * 6) - end - - def test_string_field_validation_with_regexp - f = CustomField.new(:field_format => 'string', :regexp => '^[A-Z0-9]*$') - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('ABC') - assert !f.valid_field_value?('abc') - end - - def test_date_field_validation - f = CustomField.new(:field_format => 'date') - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('1975-07-14') - assert !f.valid_field_value?('1975-07-33') - assert !f.valid_field_value?('abc') - end - - def test_list_field_validation - f = CustomField.new(:field_format => 'list', :possible_values => ['value1', 'value2']) - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('value2') - assert !f.valid_field_value?('abc') - end - - def test_int_field_validation - f = CustomField.new(:field_format => 'int') - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('123') - assert f.valid_field_value?('+123') - assert f.valid_field_value?('-123') - assert !f.valid_field_value?('6abc') - end - - def test_float_field_validation - f = CustomField.new(:field_format => 'float') - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?('11.2') - assert f.valid_field_value?('-6.250') - assert f.valid_field_value?('5') - assert !f.valid_field_value?('6abc') - end - - def test_multi_field_validation - f = CustomField.new(:field_format => 'list', :multiple => 'true', :possible_values => ['value1', 'value2']) - - assert f.valid_field_value?(nil) - assert f.valid_field_value?('') - assert f.valid_field_value?([]) - assert f.valid_field_value?([nil]) - assert f.valid_field_value?(['']) - - assert f.valid_field_value?('value2') - assert !f.valid_field_value?('abc') - - assert f.valid_field_value?(['value2']) - assert !f.valid_field_value?(['abc']) - - assert f.valid_field_value?(['', 'value2']) - assert !f.valid_field_value?(['', 'abc']) - - assert f.valid_field_value?(['value1', 'value2']) - assert !f.valid_field_value?(['value1', 'abc']) - end - - def test_changing_multiple_to_false_should_delete_multiple_values - field = ProjectCustomField.create!(:name => 'field', :field_format => 'list', :multiple => 'true', :possible_values => ['field1', 'field2']) - other = ProjectCustomField.create!(:name => 'other', :field_format => 'list', :multiple => 'true', :possible_values => ['other1', 'other2']) - - item_with_multiple_values = Project.generate!(:custom_field_values => {field.id => ['field1', 'field2'], other.id => ['other1', 'other2']}) - item_with_single_values = Project.generate!(:custom_field_values => {field.id => ['field1'], other.id => ['other2']}) - - assert_difference 'CustomValue.count', -1 do - field.multiple = false - field.save! - end - - item_with_multiple_values = Project.find(item_with_multiple_values.id) - assert_kind_of String, item_with_multiple_values.custom_field_value(field) - assert_kind_of Array, item_with_multiple_values.custom_field_value(other) - assert_equal 2, item_with_multiple_values.custom_field_value(other).size - end - - def test_value_class_should_return_the_class_used_for_fields_values - assert_equal User, CustomField.new(:field_format => 'user').value_class - assert_equal Version, CustomField.new(:field_format => 'version').value_class - end - - def test_value_class_should_return_nil_for_other_fields - assert_nil CustomField.new(:field_format => 'text').value_class - assert_nil CustomField.new.value_class - end - - def test_value_from_keyword_for_list_custom_field - field = CustomField.find(1) - assert_equal 'PostgreSQL', field.value_from_keyword('postgresql', Issue.find(1)) - end -end diff --git a/test/unit/custom_field_user_format_test.rb b/test/unit/custom_field_user_format_test.rb deleted file mode 100644 index 042b5e120..000000000 --- a/test/unit/custom_field_user_format_test.rb +++ /dev/null @@ -1,77 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CustomFieldUserFormatTest < ActiveSupport::TestCase - fixtures :custom_fields, :projects, :members, :users, :member_roles, :trackers, :issues - - def setup - @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user') - end - - def test_possible_values_with_no_arguments - assert_equal [], @field.possible_values - assert_equal [], @field.possible_values(nil) - end - - def test_possible_values_with_project_resource - project = Project.find(1) - possible_values = @field.possible_values(project.issues.first) - assert possible_values.any? - assert_equal project.users.sort.collect(&:id).map(&:to_s), possible_values - end - - def test_possible_values_with_nil_project_resource - project = Project.find(1) - assert_equal [], @field.possible_values(Issue.new) - end - - def test_possible_values_options_with_no_arguments - assert_equal [], @field.possible_values_options - assert_equal [], @field.possible_values_options(nil) - end - - def test_possible_values_options_with_project_resource - project = Project.find(1) - possible_values_options = @field.possible_values_options(project.issues.first) - assert possible_values_options.any? - assert_equal project.users.sort.map {|u| [u.name, u.id.to_s]}, possible_values_options - end - - def test_possible_values_options_with_array - projects = Project.find([1, 2]) - possible_values_options = @field.possible_values_options(projects) - assert possible_values_options.any? - assert_equal (projects.first.users & projects.last.users).sort.map {|u| [u.name, u.id.to_s]}, possible_values_options - end - - def test_cast_blank_value - assert_equal nil, @field.cast_value(nil) - assert_equal nil, @field.cast_value("") - end - - def test_cast_valid_value - user = @field.cast_value("2") - assert_kind_of User, user - assert_equal User.find(2), user - end - - def test_cast_invalid_value - assert_equal nil, @field.cast_value("187") - end -end diff --git a/test/unit/custom_field_version_format_test.rb b/test/unit/custom_field_version_format_test.rb deleted file mode 100644 index 9b1cf6781..000000000 --- a/test/unit/custom_field_version_format_test.rb +++ /dev/null @@ -1,76 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CustomFieldVersionFormatTest < ActiveSupport::TestCase - fixtures :custom_fields, :projects, :members, :users, :member_roles, :trackers, :issues, :versions - - def setup - @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'version') - end - - def test_possible_values_with_no_arguments - assert_equal [], @field.possible_values - assert_equal [], @field.possible_values(nil) - end - - def test_possible_values_with_project_resource - project = Project.find(1) - possible_values = @field.possible_values(project.issues.first) - assert possible_values.any? - assert_equal project.shared_versions.sort.collect(&:id).map(&:to_s), possible_values - end - - def test_possible_values_with_nil_project_resource - assert_equal [], @field.possible_values(Issue.new) - end - - def test_possible_values_options_with_no_arguments - assert_equal [], @field.possible_values_options - assert_equal [], @field.possible_values_options(nil) - end - - def test_possible_values_options_with_project_resource - project = Project.find(1) - possible_values_options = @field.possible_values_options(project.issues.first) - assert possible_values_options.any? - assert_equal project.shared_versions.sort.map {|u| [u.name, u.id.to_s]}, possible_values_options - end - - def test_possible_values_options_with_array - projects = Project.find([1, 2]) - possible_values_options = @field.possible_values_options(projects) - assert possible_values_options.any? - assert_equal (projects.first.shared_versions & projects.last.shared_versions).sort.map {|u| [u.name, u.id.to_s]}, possible_values_options - end - - def test_cast_blank_value - assert_equal nil, @field.cast_value(nil) - assert_equal nil, @field.cast_value("") - end - - def test_cast_valid_value - version = @field.cast_value("2") - assert_kind_of Version, version - assert_equal Version.find(2), version - end - - def test_cast_invalid_value - assert_equal nil, @field.cast_value("187") - end -end diff --git a/test/unit/custom_value_test.rb b/test/unit/custom_value_test.rb deleted file mode 100644 index 9f057e69c..000000000 --- a/test/unit/custom_value_test.rb +++ /dev/null @@ -1,39 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class CustomValueTest < ActiveSupport::TestCase - fixtures :custom_fields, :custom_values, :users - - def test_default_value - field = CustomField.find_by_default_value('Default string') - assert_not_nil field - - v = CustomValue.new(:custom_field => field) - assert_equal 'Default string', v.value - - v = CustomValue.new(:custom_field => field, :value => 'Not empty') - assert_equal 'Not empty', v.value - end - - def test_sti_polymorphic_association - # Rails uses top level sti class for polymorphic association. See #3978. - assert !User.find(4).custom_values.empty? - assert !CustomValue.find(2).customized.nil? - end -end diff --git a/test/unit/default_data_test.rb b/test/unit/default_data_test.rb deleted file mode 100644 index 07421bcfe..000000000 --- a/test/unit/default_data_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class DefaultDataTest < ActiveSupport::TestCase - include Redmine::I18n - fixtures :roles - - def test_no_data - assert !Redmine::DefaultData::Loader::no_data? - Role.delete_all("builtin = 0") - Tracker.delete_all - IssueStatus.delete_all - Enumeration.delete_all - assert Redmine::DefaultData::Loader::no_data? - end - - def test_load - valid_languages.each do |lang| - begin - Role.delete_all("builtin = 0") - Tracker.delete_all - IssueStatus.delete_all - Enumeration.delete_all - assert Redmine::DefaultData::Loader::load(lang) - assert_not_nil DocumentCategory.first - assert_not_nil IssuePriority.first - assert_not_nil TimeEntryActivity.first - rescue ActiveRecord::RecordInvalid => e - assert false, ":#{lang} default data is invalid (#{e.message})." - end - end - end -end diff --git a/test/unit/document_category_test.rb b/test/unit/document_category_test.rb deleted file mode 100644 index c7b5bfbec..000000000 --- a/test/unit/document_category_test.rb +++ /dev/null @@ -1,47 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class DocumentCategoryTest < ActiveSupport::TestCase - fixtures :enumerations, :documents, :issues - - def test_should_be_an_enumeration - assert DocumentCategory.ancestors.include?(Enumeration) - end - - def test_objects_count - assert_equal 2, DocumentCategory.find_by_name("Uncategorized").objects_count - assert_equal 0, DocumentCategory.find_by_name("User documentation").objects_count - end - - def test_option_name - assert_equal :enumeration_doc_categories, DocumentCategory.new.option_name - end - - def test_default - assert_nil DocumentCategory.where(:is_default => true).first - e = Enumeration.find_by_name('Technical documentation') - e.update_attributes(:is_default => true) - assert_equal 3, DocumentCategory.default.id - end - - def test_force_default - assert_nil DocumentCategory.where(:is_default => true).first - assert_equal 1, DocumentCategory.default.id - end -end diff --git a/test/unit/document_test.rb b/test/unit/document_test.rb deleted file mode 100644 index 218f78d13..000000000 --- a/test/unit/document_test.rb +++ /dev/null @@ -1,62 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class DocumentTest < ActiveSupport::TestCase - fixtures :projects, :enumerations, :documents, :attachments, - :enabled_modules, - :users, :members, :member_roles, :roles, - :groups_users - - def test_create - doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation')) - assert doc.save - end - - def test_create_should_send_email_notification - ActionMailer::Base.deliveries.clear - - with_settings :notified_events => %w(document_added) do - doc = Document.new(:project => Project.find(1), :title => 'New document', :category => Enumeration.find_by_name('User documentation')) - assert doc.save - end - assert_equal 1, ActionMailer::Base.deliveries.size - end - - def test_create_with_default_category - # Sets a default category - e = Enumeration.find_by_name('Technical documentation') - e.update_attributes(:is_default => true) - - doc = Document.new(:project => Project.find(1), :title => 'New document') - assert_equal e, doc.category - assert doc.save - end - - def test_updated_on_with_attachments - d = Document.find(1) - assert d.attachments.any? - assert_equal d.attachments.map(&:created_on).max, d.updated_on - end - - def test_updated_on_without_attachments - d = Document.find(2) - assert d.attachments.empty? - assert_equal d.created_on, d.updated_on - end -end diff --git a/test/unit/enabled_module_test.rb b/test/unit/enabled_module_test.rb deleted file mode 100644 index 0abc9375d..000000000 --- a/test/unit/enabled_module_test.rb +++ /dev/null @@ -1,43 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class EnabledModuleTest < ActiveSupport::TestCase - fixtures :projects, :wikis - - def test_enabling_wiki_should_create_a_wiki - CustomField.delete_all - project = Project.create!(:name => 'Project with wiki', :identifier => 'wikiproject') - assert_nil project.wiki - project.enabled_module_names = ['wiki'] - project.reload - assert_not_nil project.wiki - assert_equal 'Wiki', project.wiki.start_page - end - - def test_reenabling_wiki_should_not_create_another_wiki - project = Project.find(1) - assert_not_nil project.wiki - project.enabled_module_names = [] - project.reload - assert_no_difference 'Wiki.count' do - project.enabled_module_names = ['wiki'] - end - assert_not_nil project.wiki - end -end diff --git a/test/unit/enumeration_test.rb b/test/unit/enumeration_test.rb deleted file mode 100644 index 1b0b46d0b..000000000 --- a/test/unit/enumeration_test.rb +++ /dev/null @@ -1,130 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class EnumerationTest < ActiveSupport::TestCase - fixtures :enumerations, :issues, :custom_fields, :custom_values - - def test_objects_count - # low priority - assert_equal 6, Enumeration.find(4).objects_count - # urgent - assert_equal 0, Enumeration.find(7).objects_count - end - - def test_in_use - # low priority - assert Enumeration.find(4).in_use? - # urgent - assert !Enumeration.find(7).in_use? - end - - def test_default - e = Enumeration.default - assert e.is_a?(Enumeration) - assert e.is_default? - assert e.active? - assert_equal 'Default Enumeration', e.name - end - - def test_default_non_active - e = Enumeration.find(12) - assert e.is_a?(Enumeration) - assert e.is_default? - assert e.active? - e.update_attributes(:active => false) - assert e.is_default? - assert !e.active? - end - - def test_create - e = Enumeration.new(:name => 'Not default', :is_default => false) - e.type = 'Enumeration' - assert e.save - assert_equal 'Default Enumeration', Enumeration.default.name - end - - def test_create_as_default - e = Enumeration.new(:name => 'Very urgent', :is_default => true) - e.type = 'Enumeration' - assert e.save - assert_equal e, Enumeration.default - end - - def test_update_default - e = Enumeration.default - e.update_attributes(:name => 'Changed', :is_default => true) - assert_equal e, Enumeration.default - end - - def test_update_default_to_non_default - e = Enumeration.default - e.update_attributes(:name => 'Changed', :is_default => false) - assert_nil Enumeration.default - end - - def test_change_default - e = Enumeration.find_by_name('Default Enumeration') - e.update_attributes(:name => 'Changed Enumeration', :is_default => true) - assert_equal e, Enumeration.default - end - - def test_destroy_with_reassign - Enumeration.find(4).destroy(Enumeration.find(6)) - assert_nil Issue.where(:priority_id => 4).first - assert_equal 6, Enumeration.find(6).objects_count - end - - def test_should_be_customizable - assert Enumeration.included_modules.include?(Redmine::Acts::Customizable::InstanceMethods) - end - - def test_should_belong_to_a_project - association = Enumeration.reflect_on_association(:project) - assert association, "No Project association found" - assert_equal :belongs_to, association.macro - end - - def test_should_act_as_tree - enumeration = Enumeration.find(4) - - assert enumeration.respond_to?(:parent) - assert enumeration.respond_to?(:children) - end - - def test_is_override - # Defaults to off - enumeration = Enumeration.find(4) - assert !enumeration.is_override? - - # Setup as an override - enumeration.parent = Enumeration.find(5) - assert enumeration.is_override? - end - - def test_get_subclasses - classes = Enumeration.get_subclasses - assert_include IssuePriority, classes - assert_include DocumentCategory, classes - assert_include TimeEntryActivity, classes - - classes.each do |klass| - assert_equal Enumeration, klass.superclass - end - end -end diff --git a/test/unit/first_page_test.rb b/test/unit/first_page_test.rb deleted file mode 100644 index 77e2cc97a..000000000 --- a/test/unit/first_page_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class FirstPageTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/forum_test.rb b/test/unit/forum_test.rb deleted file mode 100644 index a6f90e493..000000000 --- a/test/unit/forum_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ForumTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/unit/group_test.rb b/test/unit/group_test.rb deleted file mode 100644 index 6d9a91707..000000000 --- a/test/unit/group_test.rb +++ /dev/null @@ -1,136 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../test_helper', __FILE__) - -class GroupTest < ActiveSupport::TestCase - fixtures :projects, :trackers, :issue_statuses, :issues, - :enumerations, :users, - :projects_trackers, - :roles, - :member_roles, - :members, - :groups_users - - include Redmine::I18n - - def test_create - g = Group.new(:name => 'New group') - assert g.save - g.reload - assert_equal 'New group', g.name - end - - def test_name_should_accept_255_characters - name = 'a' * 255 - g = Group.new(:name => name) - assert g.save - g.reload - assert_equal name, g.name - end - - def test_blank_name_error_message - set_language_if_valid 'en' - g = Group.new - assert !g.save - assert_include "Name can't be blank", g.errors.full_messages - end - - def test_blank_name_error_message_fr - set_language_if_valid 'fr' - str = "Nom doit \xc3\xaatre renseign\xc3\xa9(e)" - str.force_encoding('UTF-8') if str.respond_to?(:force_encoding) - g = Group.new - assert !g.save - assert_include str, g.errors.full_messages - end - - def test_group_roles_should_be_given_to_added_user - group = Group.find(11) - user = User.find(9) - project = Project.first - - Member.create!(:principal => group, :project => project, :role_ids => [1, 2]) - group.users << user - assert user.member_of?(project) - end - - def test_new_roles_should_be_given_to_existing_user - group = Group.find(11) - user = User.find(9) - project = Project.first - - group.users << user - m = Member.create!(:principal => group, :project => project, :role_ids => [1, 2]) - assert user.member_of?(project) - end - - def test_user_roles_should_updated_when_updating_user_ids - group = Group.find(11) - user = User.find(9) - project = Project.first - - Member.create!(:principal => group, :project => project, :role_ids => [1, 2]) - group.user_ids = [user.id] - group.save! - assert User.find(9).member_of?(project) - - group.user_ids = [1] - group.save! - assert !User.find(9).member_of?(project) - end - - def test_user_roles_should_updated_when_updating_group_roles - group = Group.find(11) - user = User.find(9) - project = Project.first - group.users << user - m = Member.create!(:principal => group, :project => project, :role_ids => [1]) - assert_equal [1], user.reload.roles_for_project(project).collect(&:id).sort - - m.role_ids = [1, 2] - assert_equal [1, 2], user.reload.roles_for_project(project).collect(&:id).sort - - m.role_ids = [2] - assert_equal [2], user.reload.roles_for_project(project).collect(&:id).sort - - m.role_ids = [1] - assert_equal [1], user.reload.roles_for_project(project).collect(&:id).sort - end - - def test_user_memberships_should_be_removed_when_removing_group_membership - assert User.find(8).member_of?(Project.find(5)) - Member.find_by_project_id_and_user_id(5, 10).destroy - assert !User.find(8).member_of?(Project.find(5)) - end - - def test_user_roles_should_be_removed_when_removing_user_from_group - assert User.find(8).member_of?(Project.find(5)) - User.find(8).groups = [] - assert !User.find(8).member_of?(Project.find(5)) - end - - def test_destroy_should_unassign_issues - group = Group.first - Issue.update_all(["assigned_to_id = ?", group.id], 'id = 1') - - assert group.destroy - assert group.destroyed? - - assert_equal nil, Issue.find(1).assigned_to_id - end -end diff --git a/test/unit/helpers/activities_helper_test.rb b/test/unit/helpers/activities_helper_test.rb deleted file mode 100644 index e90f25ad7..000000000 --- a/test/unit/helpers/activities_helper_test.rb +++ /dev/null @@ -1,101 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class ActivitiesHelperTest < ActionView::TestCase - include ActivitiesHelper - - class MockEvent - attr_reader :event_datetime, :event_group, :name - - def initialize(group=nil) - @@count ||= 0 - @name = "e#{@@count}" - @event_datetime = Time.now + @@count.hours - @event_group = group || self - @@count += 1 - end - - def self.clear - @@count = 0 - end - end - - def setup - MockEvent.clear - end - - def test_sort_activity_events_should_sort_by_datetime - events = [] - events << MockEvent.new - events << MockEvent.new - events << MockEvent.new - - assert_equal [ - ['e2', false], - ['e1', false], - ['e0', false] - ], sort_activity_events(events).map {|event, grouped| [event.name, grouped]} - end - - def test_sort_activity_events_should_group_events - events = [] - events << MockEvent.new - events << MockEvent.new(events[0]) - events << MockEvent.new(events[0]) - - assert_equal [ - ['e2', false], - ['e1', true], - ['e0', true] - ], sort_activity_events(events).map {|event, grouped| [event.name, grouped]} - end - - def test_sort_activity_events_with_group_not_in_set_should_group_events - e = MockEvent.new - events = [] - events << MockEvent.new(e) - events << MockEvent.new(e) - - assert_equal [ - ['e2', false], - ['e1', true] - ], sort_activity_events(events).map {|event, grouped| [event.name, grouped]} - end - - def test_sort_activity_events_should_sort_by_datetime_and_group - events = [] - events << MockEvent.new - events << MockEvent.new - events << MockEvent.new - events << MockEvent.new(events[1]) - events << MockEvent.new(events[2]) - events << MockEvent.new - events << MockEvent.new(events[2]) - - assert_equal [ - ['e6', false], - ['e4', true], - ['e2', true], - ['e5', false], - ['e3', false], - ['e1', true], - ['e0', false] - ], sort_activity_events(events).map {|event, grouped| [event.name, grouped]} - end -end diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb deleted file mode 100644 index 7a70ddb57..000000000 --- a/test/unit/helpers/application_helper_test.rb +++ /dev/null @@ -1,1223 +0,0 @@ -# encoding: utf-8 -# -# Redmine - project management software -# Copyright (C) 2006-2013 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 -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# 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. -# -# 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. - -require File.expand_path('../../../test_helper', __FILE__) - -class ApplicationHelperTest < ActionView::TestCase - include ERB::Util - include Rails.application.routes.url_helpers - - fixtures :projects, :roles, :enabled_modules, :users, - :repositories, :changesets, - :trackers, :issue_statuses, :issues, :versions, :documents, - :wikis, :wiki_pages, :wiki_contents, - :boards, :messages, :news, - :attachments, :enumerations - - def setup - super - set_tmp_attachments_directory - end - - context "#link_to_if_authorized" do - context "authorized user" do - should "be tested" - end - - context "unauthorized user" do - should "be tested" - end - - should "allow using the :controller and :action for the target link" do - User.current = User.find_by_login('admin') - - @project = Issue.first.project # Used by helper - response = link_to_if_authorized("By controller/action", - {:controller => 'issues', :action => 'edit', :id => Issue.first.id}) - assert_match /href/, response - end - - end - - def test_auto_links - to_test = { - 'http://foo.bar' => 'http://foo.bar', - 'http://foo.bar/~user' => 'http://foo.bar/~user', - 'http://foo.bar.' => 'http://foo.bar.', - 'https://foo.bar.' => 'https://foo.bar.', - 'This is a link: http://foo.bar.' => 'This is a link: http://foo.bar.', - 'A link (eg. http://foo.bar).' => 'A link (eg. http://foo.bar).', - 'http://foo.bar/foo.bar#foo.bar.' => 'http://foo.bar/foo.bar#foo.bar.', - 'http://www.foo.bar/Test_(foobar)' => 'http://www.foo.bar/Test_(foobar)', - '(see inline link : http://www.foo.bar/Test_(foobar))' => '(see inline link : http://www.foo.bar/Test_(foobar))', - '(see inline link : http://www.foo.bar/Test)' => '(see inline link : http://www.foo.bar/Test)', - '(see inline link : http://www.foo.bar/Test).' => '(see inline link : http://www.foo.bar/Test).', - '(see "inline link":http://www.foo.bar/Test_(foobar))' => '(see inline link)', - '(see "inline link":http://www.foo.bar/Test)' => '(see inline link)', - '(see "inline link":http://www.foo.bar/Test).' => '(see inline link).', - 'www.foo.bar' => 'www.foo.bar', - 'http://foo.bar/page?p=1&t=z&s=' => 'http://foo.bar/page?p=1&t=z&s=', - 'http://foo.bar/page#125' => 'http://foo.bar/page#125', - 'http://foo@www.bar.com' => 'http://foo@www.bar.com', - 'http://foo:bar@www.bar.com' => 'http://foo:bar@www.bar.com', - 'ftp://foo.bar' => 'ftp://foo.bar', - 'ftps://foo.bar' => 'ftps://foo.bar', - 'sftp://foo.bar' => 'sftp://foo.bar', - # two exclamation marks - 'http://example.net/path!602815048C7B5C20!302.html' => 'http://example.net/path!602815048C7B5C20!302.html', - # escaping - 'http://foo"bar' => 'http://foo"bar', - # wrap in angle brackets - '' => '<http://foo.bar>', - # invalid urls - 'http://' => 'http://', - 'www.' => 'www.', - 'test-www.bar.com' => 'test-www.bar.com', - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - if 'ruby'.respond_to?(:encoding) - def test_auto_links_with_non_ascii_characters - to_test = { - 'http://foo.bar/тест' => 'http://foo.bar/тест' - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - else - puts 'Skipping test_auto_links_with_non_ascii_characters, unsupported ruby version' - end - - def test_auto_mailto - to_test = { - 'test@foo.bar' => '', - 'test@www.foo.bar' => '', - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - def test_inline_images - to_test = { - '!http://foo.bar/image.jpg!' => '', - 'floating !>http://foo.bar/image.jpg!' => 'floating
', - 'with class !(some-class)http://foo.bar/image.jpg!' => 'with class ', - 'with style !{width:100px;height:100px}http://foo.bar/image.jpg!' => 'with style ', - 'with title !http://foo.bar/image.jpg(This is a title)!' => 'with title This is a title', - 'with title !http://foo.bar/image.jpg(This is a double-quoted "title")!' => 'with title This is a double-quoted "title"', - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - def test_inline_images_inside_tags - raw = <<-RAW -h1. !foo.png! Heading - -Centered image: - -p=. !bar.gif! -RAW - - assert textilizable(raw).include?('') - assert textilizable(raw).include?('') - end - - def test_attached_images - to_test = { - 'Inline image: !logo.gif!' => 'Inline image: This is a logo', - 'Inline image: !logo.GIF!' => 'Inline image: This is a logo', - 'No match: !ogo.gif!' => 'No match: ', - 'No match: !ogo.GIF!' => 'No match: ', - # link image - '!logo.gif!:http://foo.bar/' => 'This is a logo', - } - attachments = Attachment.all - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :attachments => attachments) } - end - - def test_attached_images_filename_extension - set_tmp_attachments_directory - a1 = Attachment.new( - :container => Issue.find(1), - :file => mock_file_with_options({:original_filename => "testtest.JPG"}), - :author => User.find(1)) - assert a1.save - assert_equal "testtest.JPG", a1.filename - assert_equal "image/jpeg", a1.content_type - assert a1.image? - - a2 = Attachment.new( - :container => Issue.find(1), - :file => mock_file_with_options({:original_filename => "testtest.jpeg"}), - :author => User.find(1)) - assert a2.save - assert_equal "testtest.jpeg", a2.filename - assert_equal "image/jpeg", a2.content_type - assert a2.image? - - a3 = Attachment.new( - :container => Issue.find(1), - :file => mock_file_with_options({:original_filename => "testtest.JPE"}), - :author => User.find(1)) - assert a3.save - assert_equal "testtest.JPE", a3.filename - assert_equal "image/jpeg", a3.content_type - assert a3.image? - - a4 = Attachment.new( - :container => Issue.find(1), - :file => mock_file_with_options({:original_filename => "Testtest.BMP"}), - :author => User.find(1)) - assert a4.save - assert_equal "Testtest.BMP", a4.filename - assert_equal "image/x-ms-bmp", a4.content_type - assert a4.image? - - to_test = { - 'Inline image: !testtest.jpg!' => - 'Inline image: ', - 'Inline image: !testtest.jpeg!' => - 'Inline image: ', - 'Inline image: !testtest.jpe!' => - 'Inline image: ', - 'Inline image: !testtest.bmp!' => - 'Inline image: ', - } - - attachments = [a1, a2, a3, a4] - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :attachments => attachments) } - end - - def test_attached_images_should_read_later - set_fixtures_attachments_directory - a1 = Attachment.find(16) - assert_equal "testfile.png", a1.filename - assert a1.readable? - assert (! a1.visible?(User.anonymous)) - assert a1.visible?(User.find(2)) - a2 = Attachment.find(17) - assert_equal "testfile.PNG", a2.filename - assert a2.readable? - assert (! a2.visible?(User.anonymous)) - assert a2.visible?(User.find(2)) - assert a1.created_on < a2.created_on - - to_test = { - 'Inline image: !testfile.png!' => - 'Inline image: ', - 'Inline image: !Testfile.PNG!' => - 'Inline image: ', - } - attachments = [a1, a2] - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :attachments => attachments) } - set_tmp_attachments_directory - end - - def test_textile_external_links - to_test = { - 'This is a "link":http://foo.bar' => 'This is a link', - 'This is an intern "link":/foo/bar' => 'This is an intern link', - '"link (Link title)":http://foo.bar' => 'link', - '"link (Link title with "double-quotes")":http://foo.bar' => 'link', - "This is not a \"Link\":\n\nAnother paragraph" => "This is not a \"Link\":

\n\n\n\t

Another paragraph", - # no multiline link text - "This is a double quote \"on the first line\nand another on a second line\":test" => "This is a double quote \"on the first line
and another on a second line\":test", - # mailto link - "\"system administrator\":mailto:sysadmin@example.com?subject=redmine%20permissions" => "system administrator", - # two exclamation marks - '"a link":http://example.net/path!602815048C7B5C20!302.html' => 'a link', - # escaping - '"test":http://foo"bar' => 'test', - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - if 'ruby'.respond_to?(:encoding) - def test_textile_external_links_with_non_ascii_characters - to_test = { - 'This is a "link":http://foo.bar/тест' => 'This is a link' - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - else - puts 'Skipping test_textile_external_links_with_non_ascii_characters, unsupported ruby version' - end - - def test_redmine_links - issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3}, - :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') - note_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3, :anchor => 'note-14'}, - :class => Issue.find(3).css_classes, :title => 'Error 281 when updating a recipe (New)') - - revision_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, - :class => 'changeset', :title => 'My very first commit do not escaping #<>&') - revision_link2 = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, - :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') - - changeset_link2 = link_to('691322a8eb01e11fd7', - {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, - :class => 'changeset', :title => 'My very first commit do not escaping #<>&') - - document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1}, - :class => 'document') - - version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2}, - :class => 'version') - - board_url = {:controller => 'boards', :action => 'show', :id => 2, :project_id => 'ecookbook'} - - message_url = {:controller => 'messages', :action => 'show', :board_id => 1, :id => 4} - - news_url = {:controller => 'news', :action => 'show', :id => 1} - - project_url = {:controller => 'projects', :action => 'show', :id => 'subproject1'} - - source_url = '/projects/ecookbook/repository/entry/some/file' - source_url_with_rev = '/projects/ecookbook/repository/revisions/52/entry/some/file' - source_url_with_ext = '/projects/ecookbook/repository/entry/some/file.ext' - source_url_with_rev_and_ext = '/projects/ecookbook/repository/revisions/52/entry/some/file.ext' - source_url_with_branch = '/projects/ecookbook/repository/revisions/branch/entry/some/file' - - export_url = '/projects/ecookbook/repository/raw/some/file' - export_url_with_rev = '/projects/ecookbook/repository/revisions/52/raw/some/file' - export_url_with_ext = '/projects/ecookbook/repository/raw/some/file.ext' - export_url_with_rev_and_ext = '/projects/ecookbook/repository/revisions/52/raw/some/file.ext' - export_url_with_branch = '/projects/ecookbook/repository/revisions/branch/raw/some/file' - - to_test = { - # tickets - '#3, [#3], (#3) and #3.' => "#{issue_link}, [#{issue_link}], (#{issue_link}) and #{issue_link}.", - # ticket notes - '#3-14' => note_link, - '#3#note-14' => note_link, - # should not ignore leading zero - '#03' => '#03', - # changesets - 'r1' => revision_link, - 'r1.' => "#{revision_link}.", - 'r1, r2' => "#{revision_link}, #{revision_link2}", - 'r1,r2' => "#{revision_link},#{revision_link2}", - 'commit:691322a8eb01e11fd7' => changeset_link2, - # documents - 'document#1' => document_link, - 'document:"Test document"' => document_link, - # versions - 'version#2' => version_link, - 'version:1.0' => version_link, - 'version:"1.0"' => version_link, - # source - 'source:some/file' => link_to('source:some/file', source_url, :class => 'source'), - 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'), - 'source:/some/file.' => link_to('source:/some/file', source_url, :class => 'source') + ".", - 'source:/some/file.ext.' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".", - 'source:/some/file. ' => link_to('source:/some/file', source_url, :class => 'source') + ".", - 'source:/some/file.ext. ' => link_to('source:/some/file.ext', source_url_with_ext, :class => 'source') + ".", - 'source:/some/file, ' => link_to('source:/some/file', source_url, :class => 'source') + ",", - 'source:/some/file@52' => link_to('source:/some/file@52', source_url_with_rev, :class => 'source'), - 'source:/some/file@branch' => link_to('source:/some/file@branch', source_url_with_branch, :class => 'source'), - 'source:/some/file.ext@52' => link_to('source:/some/file.ext@52', source_url_with_rev_and_ext, :class => 'source'), - 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url + "#L110", :class => 'source'), - 'source:/some/file.ext#L110' => link_to('source:/some/file.ext#L110', source_url_with_ext + "#L110", :class => 'source'), - 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url_with_rev + "#L110", :class => 'source'), - # export - 'export:/some/file' => link_to('export:/some/file', export_url, :class => 'source download'), - 'export:/some/file.ext' => link_to('export:/some/file.ext', export_url_with_ext, :class => 'source download'), - 'export:/some/file@52' => link_to('export:/some/file@52', export_url_with_rev, :class => 'source download'), - 'export:/some/file.ext@52' => link_to('export:/some/file.ext@52', export_url_with_rev_and_ext, :class => 'source download'), - 'export:/some/file@branch' => link_to('export:/some/file@branch', export_url_with_branch, :class => 'source download'), - # forum - 'forum#2' => link_to('Discussion', board_url, :class => 'board'), - 'forum:Discussion' => link_to('Discussion', board_url, :class => 'board'), - # message - 'message#4' => link_to('Post 2', message_url, :class => 'message'), - 'message#5' => link_to('RE: post 2', message_url.merge(:anchor => 'message-5', :r => 5), :class => 'message'), - # news - 'news#1' => link_to('eCookbook first release !', news_url, :class => 'news'), - 'news:"eCookbook first release !"' => link_to('eCookbook first release !', news_url, :class => 'news'), - # project - 'project#3' => link_to('eCookbook Subproject 1', project_url, :class => 'project'), - 'project:subproject1' => link_to('eCookbook Subproject 1', project_url, :class => 'project'), - 'project:"eCookbook subProject 1"' => link_to('eCookbook Subproject 1', project_url, :class => 'project'), - # not found - '#0123456789' => '#0123456789', - # invalid expressions - 'source:' => 'source:', - # url hash - "http://foo.bar/FAQ#3" => 'http://foo.bar/FAQ#3', - } - @project = Project.find(1) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text), "#{text} failed" } - end - - def test_redmine_links_with_a_different_project_before_current_project - vp1 = Version.generate!(:project_id => 1, :name => '1.4.4') - vp3 = Version.generate!(:project_id => 3, :name => '1.4.4') - - @project = Project.find(3) - assert_equal %(

1.4.4 1.4.4

), - textilizable("ecookbook:version:1.4.4 version:1.4.4") - end - - def test_escaped_redmine_links_should_not_be_parsed - to_test = [ - '#3.', - '#3-14.', - '#3#-note14.', - 'r1', - 'document#1', - 'document:"Test document"', - 'version#2', - 'version:1.0', - 'version:"1.0"', - 'source:/some/file' - ] - @project = Project.find(1) - to_test.each { |text| assert_equal "

#{text}

", textilizable("!" + text), "#{text} failed" } - end - - def test_cross_project_redmine_links - source_link = link_to('ecookbook:source:/some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}, - :class => 'source') - - changeset_link = link_to('ecookbook:r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, - :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') - - to_test = { - # documents - 'document:"Test document"' => 'document:"Test document"', - 'ecookbook:document:"Test document"' => 'Test document', - 'invalid:document:"Test document"' => 'invalid:document:"Test document"', - # versions - 'version:"1.0"' => 'version:"1.0"', - 'ecookbook:version:"1.0"' => '1.0', - 'invalid:version:"1.0"' => 'invalid:version:"1.0"', - # changeset - 'r2' => 'r2', - 'ecookbook:r2' => changeset_link, - 'invalid:r2' => 'invalid:r2', - # source - 'source:/some/file' => 'source:/some/file', - 'ecookbook:source:/some/file' => source_link, - 'invalid:source:/some/file' => 'invalid:source:/some/file', - } - @project = Project.find(3) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text), "#{text} failed" } - end - - def test_multiple_repositories_redmine_links - svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn_repo-1', :url => 'file:///foo/hg') - Changeset.create!(:repository => svn, :committed_on => Time.now, :revision => '123') - hg = Repository::Mercurial.create!(:project_id => 1, :identifier => 'hg1', :url => '/foo/hg') - Changeset.create!(:repository => hg, :committed_on => Time.now, :revision => '123', :scmid => 'abcd') - - changeset_link = link_to('r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, - :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') - svn_changeset_link = link_to('svn_repo-1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn_repo-1', :rev => 123}, - :class => 'changeset', :title => '') - hg_changeset_link = link_to('hg1|abcd', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'hg1', :rev => 'abcd'}, - :class => 'changeset', :title => '') - - source_link = link_to('source:some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}, :class => 'source') - hg_source_link = link_to('source:hg1|some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :repository_id => 'hg1', :path => ['some', 'file']}, :class => 'source') - - to_test = { - 'r2' => changeset_link, - 'svn_repo-1|r123' => svn_changeset_link, - 'invalid|r123' => 'invalid|r123', - 'commit:hg1|abcd' => hg_changeset_link, - 'commit:invalid|abcd' => 'commit:invalid|abcd', - # source - 'source:some/file' => source_link, - 'source:hg1|some/file' => hg_source_link, - 'source:invalid|some/file' => 'source:invalid|some/file', - } - - @project = Project.find(1) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text), "#{text} failed" } - end - - def test_cross_project_multiple_repositories_redmine_links - svn = Repository::Subversion.create!(:project_id => 1, :identifier => 'svn1', :url => 'file:///foo/hg') - Changeset.create!(:repository => svn, :committed_on => Time.now, :revision => '123') - hg = Repository::Mercurial.create!(:project_id => 1, :identifier => 'hg1', :url => '/foo/hg') - Changeset.create!(:repository => hg, :committed_on => Time.now, :revision => '123', :scmid => 'abcd') - - changeset_link = link_to('ecookbook:r2', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 2}, - :class => 'changeset', :title => 'This commit fixes #1, #2 and references #1 & #3') - svn_changeset_link = link_to('ecookbook:svn1|r123', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'svn1', :rev => 123}, - :class => 'changeset', :title => '') - hg_changeset_link = link_to('ecookbook:hg1|abcd', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :repository_id => 'hg1', :rev => 'abcd'}, - :class => 'changeset', :title => '') - - source_link = link_to('ecookbook:source:some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => ['some', 'file']}, :class => 'source') - hg_source_link = link_to('ecookbook:source:hg1|some/file', {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :repository_id => 'hg1', :path => ['some', 'file']}, :class => 'source') - - to_test = { - 'ecookbook:r2' => changeset_link, - 'ecookbook:svn1|r123' => svn_changeset_link, - 'ecookbook:invalid|r123' => 'ecookbook:invalid|r123', - 'ecookbook:commit:hg1|abcd' => hg_changeset_link, - 'ecookbook:commit:invalid|abcd' => 'ecookbook:commit:invalid|abcd', - 'invalid:commit:invalid|abcd' => 'invalid:commit:invalid|abcd', - # source - 'ecookbook:source:some/file' => source_link, - 'ecookbook:source:hg1|some/file' => hg_source_link, - 'ecookbook:source:invalid|some/file' => 'ecookbook:source:invalid|some/file', - 'invalid:source:invalid|some/file' => 'invalid:source:invalid|some/file', - } - - @project = Project.find(3) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text), "#{text} failed" } - end - - def test_redmine_links_git_commit - changeset_link = link_to('abcd', - { - :controller => 'repositories', - :action => 'revision', - :id => 'subproject1', - :rev => 'abcd', - }, - :class => 'changeset', :title => 'test commit') - to_test = { - 'commit:abcd' => changeset_link, - } - @project = Project.find(3) - r = Repository::Git.create!(:project => @project, :url => '/tmp/test/git') - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => 'abcd', - :scmid => 'abcd', - :comments => 'test commit') - assert( c.save ) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - # TODO: Bazaar commit id contains mail address, so it contains '@' and '_'. - def test_redmine_links_darcs_commit - changeset_link = link_to('20080308225258-98289-abcd456efg.gz', - { - :controller => 'repositories', - :action => 'revision', - :id => 'subproject1', - :rev => '123', - }, - :class => 'changeset', :title => 'test commit') - to_test = { - 'commit:20080308225258-98289-abcd456efg.gz' => changeset_link, - } - @project = Project.find(3) - r = Repository::Darcs.create!( - :project => @project, :url => '/tmp/test/darcs', - :log_encoding => 'UTF-8') - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => '20080308225258-98289-abcd456efg.gz', - :comments => 'test commit') - assert( c.save ) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - def test_redmine_links_mercurial_commit - changeset_link_rev = link_to('r123', - { - :controller => 'repositories', - :action => 'revision', - :id => 'subproject1', - :rev => '123' , - }, - :class => 'changeset', :title => 'test commit') - changeset_link_commit = link_to('abcd', - { - :controller => 'repositories', - :action => 'revision', - :id => 'subproject1', - :rev => 'abcd' , - }, - :class => 'changeset', :title => 'test commit') - to_test = { - 'r123' => changeset_link_rev, - 'commit:abcd' => changeset_link_commit, - } - @project = Project.find(3) - r = Repository::Mercurial.create!(:project => @project, :url => '/tmp/test') - assert r - c = Changeset.new(:repository => r, - :committed_on => Time.now, - :revision => '123', - :scmid => 'abcd', - :comments => 'test commit') - assert( c.save ) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - def test_attachment_links - to_test = { - 'attachment:error281.txt' => 'error281.txt' - } - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :attachments => Issue.find(3).attachments), "#{text} failed" } - end - - def test_attachment_link_should_link_to_latest_attachment - set_tmp_attachments_directory - a1 = Attachment.generate!(:filename => "test.txt", :created_on => 1.hour.ago) - a2 = Attachment.generate!(:filename => "test.txt") - - assert_equal %(

test.txt

), - textilizable('attachment:test.txt', :attachments => [a1, a2]) - end - - def test_wiki_links - to_test = { - '[[CookBook documentation]]' => 'CookBook documentation', - '[[Another page|Page]]' => 'Page', - # title content should be formatted - '[[Another page|With _styled_ *title*]]' => 'With styled title', - '[[Another page|With title containing HTML entities & markups]]' => 'With title containing <strong>HTML entities & markups</strong>', - # link with anchor - '[[CookBook documentation#One-section]]' => 'CookBook documentation', - '[[Another page#anchor|Page]]' => 'Page', - # UTF8 anchor - '[[Another_page#Тест|Тест]]' => %|Тест|, - # page that doesn't exist - '[[Unknown page]]' => 'Unknown page', - '[[Unknown page|404]]' => '404', - # link to another project wiki - '[[onlinestore:]]' => 'onlinestore', - '[[onlinestore:|Wiki]]' => 'Wiki', - '[[onlinestore:Start page]]' => 'Start page', - '[[onlinestore:Start page|Text]]' => 'Text', - '[[onlinestore:Unknown page]]' => 'Unknown page', - # striked through link - '-[[Another page|Page]]-' => 'Page', - '-[[Another page|Page]] link-' => 'Page link', - # escaping - '![[Another page|Page]]' => '[[Another page|Page]]', - # project does not exist - '[[unknowproject:Start]]' => '[[unknowproject:Start]]', - '[[unknowproject:Start|Page title]]' => '[[unknowproject:Start|Page title]]', - } - - @project = Project.find(1) - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } - end - - def test_wiki_links_within_local_file_generation_context - - to_test = { - # link to a page - '[[CookBook documentation]]' => 'CookBook documentation', - '[[CookBook documentation|documentation]]' => 'documentation', - '[[CookBook documentation#One-section]]' => 'CookBook documentation', - '[[CookBook documentation#One-section|documentation]]' => 'documentation', - # page that doesn't exist - '[[Unknown page]]' => 'Unknown page', - '[[Unknown page|404]]' => '404', - '[[Unknown page#anchor]]' => 'Unknown page', - '[[Unknown page#anchor|404]]' => '404', - } - - @project = Project.find(1) - - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :wiki_links => :local) } - end - - def test_wiki_links_within_wiki_page_context - - page = WikiPage.find_by_title('Another_page' ) - - to_test = { - # link to another page - '[[CookBook documentation]]' => 'CookBook documentation', - '[[CookBook documentation|documentation]]' => 'documentation', - '[[CookBook documentation#One-section]]' => 'CookBook documentation', - '[[CookBook documentation#One-section|documentation]]' => 'documentation', - # link to the current page - '[[Another page]]' => 'Another page', - '[[Another page|Page]]' => 'Page', - '[[Another page#anchor]]' => 'Another page', - '[[Another page#anchor|Page]]' => 'Page', - # page that doesn't exist - '[[Unknown page]]' => 'Unknown page', - '[[Unknown page|404]]' => '404', - '[[Unknown page#anchor]]' => 'Unknown page', - '[[Unknown page#anchor|404]]' => '404', - } - - @project = Project.find(1) - - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(WikiContent.new( :text => text, :page => page ), :text) } - end - - def test_wiki_links_anchor_option_should_prepend_page_title_to_href - - to_test = { - # link to a page - '[[CookBook documentation]]' => 'CookBook documentation', - '[[CookBook documentation|documentation]]' => 'documentation', - '[[CookBook documentation#One-section]]' => 'CookBook documentation', - '[[CookBook documentation#One-section|documentation]]' => 'documentation', - # page that doesn't exist - '[[Unknown page]]' => 'Unknown page', - '[[Unknown page|404]]' => '404', - '[[Unknown page#anchor]]' => 'Unknown page', - '[[Unknown page#anchor|404]]' => '404', - } - - @project = Project.find(1) - - to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text, :wiki_links => :anchor) } - end - - def test_html_tags - to_test = { - "
content
" => "

<div>content</div>

", - "
content
" => "

<div class=\"bold\">content</div>

", - "" => "

<script>some script;</script>

", - # do not escape pre/code tags - "
\nline 1\nline2
" => "
\nline 1\nline2
", - "
\nline 1\nline2
" => "
\nline 1\nline2
", - "
content
" => "
<div>content</div>
", - "HTML comment: " => "

HTML comment: <!-- no comments -->

", - "