Redmine 4.1.1

This commit is contained in:
Manuel Cillero 2020-11-22 21:20:06 +01:00
parent 33e7b881a5
commit 3d976f1b3b
1593 changed files with 36180 additions and 19489 deletions

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -168,7 +170,7 @@ class AccountControllerOpenidTest < Redmine::ControllerTest
:lastname => 'User',
:mail => 'user@somedomain.com',
:identity_url => 'http://openid.example.com/good_blank_user'
}
}
assert_response 302

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -310,7 +312,7 @@ class AccountControllerTest < Redmine::ControllerTest
:firstname => 'John',
:lastname => 'Doe',
:mail => 'register@example.com'
}
}
assert_redirected_to '/my/account'
@ -324,7 +326,7 @@ class AccountControllerTest < Redmine::ControllerTest
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
@ -336,7 +338,7 @@ class AccountControllerTest < Redmine::ControllerTest
:firstname => 'John',
:lastname => 'Doe',
:mail => 'register@example.com'
}
}
assert_redirected_to '/'
@ -355,11 +357,11 @@ class AccountControllerTest < Redmine::ControllerTest
:firstname => 'John',
:lastname => 'Doe',
:mail => 'register@example.com'
},
},
:pref => {
:hide_mail => '1'
}
}
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -28,7 +30,6 @@ class ActivitiesControllerTest < Redmine::ControllerTest
:enabled_modules,
:journals, :journal_details
def test_project_index
get :index, :params => {
:id => 1,
@ -48,13 +49,14 @@ class ActivitiesControllerTest < Redmine::ControllerTest
end
def test_previous_project_index
@request.session[:user_id] = 1
get :index, :params => {
:id => 1,
:from => 2.days.ago.to_date
}
assert_response :success
assert_select 'h3', :text => /#{3.days.ago.to_date.day}/
assert_select 'h3', :text => /#{User.current.time_to_date(3.days.ago).day}/
assert_select 'dl dt.issue a', :text => /Cannot print recipes/
end
@ -141,7 +143,7 @@ class ActivitiesControllerTest < Redmine::ControllerTest
:show_issues => '1'
}
assert_response :success
assert_select 'title', :text => /Issues/
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -73,7 +75,7 @@ class AdminControllerTest < Redmine::ControllerTest
def test_load_default_configuration_data_should_rescue_error
delete_configuration_data
Redmine::DefaultData::Loader.stubs(:load).raises(Exception.new("Something went wrong"))
Redmine::DefaultData::Loader.stubs(:load).raises(StandardError.new("Something went wrong"))
post :default_configuration, :params => {
:lang => 'fr'
}
@ -97,7 +99,7 @@ class AdminControllerTest < Redmine::ControllerTest
end
def test_test_email_failure_should_display_the_error
Mailer.stubs(:test_email).raises(Exception, 'Some error message')
Mailer.stubs(:test_email).raises(StandardError, 'Some error message')
post :test_email
assert_redirected_to '/settings?tab=notifications'
assert_match /Some error message/, flash[:error]
@ -119,8 +121,10 @@ class AdminControllerTest < Redmine::ControllerTest
description 'This is a test plugin'
version '0.0.1'
settings :default => {'sample_setting' => 'value', 'foo'=>'bar'}, :partial => 'foo/settings'
directory 'test/fixtures/plugins/foo_plugin'
end
Redmine::Plugin.register :bar do
Redmine::Plugin.register :other do
directory 'test/fixtures/plugins/other_plugin'
end
get :plugins
@ -130,8 +134,8 @@ class AdminControllerTest < Redmine::ControllerTest
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 'tr#plugin-other' do
assert_select 'td span.name', :text => 'Other'
assert_select 'td.configure a', 0
end
end

View file

@ -0,0 +1,27 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2020 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 ApplicationControllerTest < Redmine::ControllerTest
def test_back_url_should_remove_utf8_checkmark_from_referer
@request.set_header 'HTTP_REFERER', "/path?utf8=\u2713&foo=bar"
assert_equal "/path?foo=bar", @controller.back_url
end
end

View file

@ -1,7 +1,7 @@
# encoding: utf-8
#
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -46,7 +46,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_select 'th.filename', :text => /issues_controller.rb\t\(révision 1484\)/
assert_select 'td.line-code', :text => /Demande créée avec succès/
end
set_tmp_attachments_directory
end
def test_show_diff_replace_cannot_convert_content
@ -64,7 +63,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_select 'td.line-code', :text => /Demande cr\?\?e avec succ\?s/
end
end
set_tmp_attachments_directory
end
def test_show_diff_latin_1
@ -82,7 +80,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_select 'td.line-code', :text => /Demande créée avec succès/
end
end
set_tmp_attachments_directory
end
def test_show_should_save_diff_type_as_user_preference
@ -132,7 +129,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_equal 'text/html', @response.content_type
set_tmp_attachments_directory
end
def test_show_text_file_utf_8
@ -143,8 +139,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert a.save
assert_equal 'japanese-utf-8.txt', a.filename
str_japanese = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e".force_encoding('UTF-8')
get :show, :params => {
:id => a.id
}
@ -152,7 +146,7 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_equal 'text/html', @response.content_type
assert_select 'tr#L1' do
assert_select 'th.line-num', :text => '1'
assert_select 'td', :text => /#{str_japanese}/
assert_select 'td', :text => /日本語/
end
end
@ -209,7 +203,38 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_equal 'text/html', @response.content_type
assert_select '.nodata', :text => 'No preview available. Download the file instead.'
end
end
def test_show_text_file_formated_markdown
set_tmp_attachments_directory
a = Attachment.new(:container => Issue.find(1),
:file => uploaded_test_file('testfile.md', 'text/plain'),
:author => User.find(1))
assert a.save
assert_equal 'testfile.md', a.filename
get :show, :params => {
:id => a.id
}
assert_response :success
assert_equal 'text/html', @response.content_type
assert_select 'div.wiki', :html => "<h1>Header 1</h1>\n\n<h2>Header 2</h2>\n\n<h3>Header 3</h3>"
end
def test_show_text_file_fromated_textile
set_tmp_attachments_directory
a = Attachment.new(:container => Issue.find(1),
:file => uploaded_test_file('testfile.textile', 'text/plain'),
:author => User.find(1))
assert a.save
assert_equal 'testfile.textile', a.filename
get :show, :params => {
:id => a.id
}
assert_response :success
assert_equal 'text/html', @response.content_type
assert_select 'div.wiki', :html => "<h1>Header 1</h1>\n\n\n\t<h2>Header 2</h2>\n\n\n\t<h3>Header 3</h3>"
end
def test_show_image
@ -229,7 +254,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
}
assert_equal 'text/html', @response.content_type
assert_select '.nodata', :text => 'No preview available. Download the file instead.'
set_tmp_attachments_directory
end
def test_show_file_from_private_issue_without_permission
@ -237,7 +261,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
: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
@ -247,7 +270,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_select 'h2', :text => /private.diff/
set_tmp_attachments_directory
end
def test_show_file_without_container_should_be_allowed_to_author
@ -287,6 +309,14 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_response 404
end
def test_show_renders_pagination
get :show, :params => { :id => 5, :type => 'inline' }
assert_response :success
assert_select 'ul.pages li.next', :text => /next/i
assert_select 'ul.pages li.previous', :text => /previous/i
end
def test_download_text_file
get :download, :params => {
:id => 4
@ -301,8 +331,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
:id => 4
}
assert_response 304
set_tmp_attachments_directory
end
def test_download_js_file
@ -336,7 +364,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_equal 'text/x-ruby', @response.content_type
set_tmp_attachments_directory
end
def test_download_should_assign_better_content_type_than_application_octet_stream
@ -347,7 +374,15 @@ class AttachmentsControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_equal 'text/x-ruby', @response.content_type
set_tmp_attachments_directory
end
def test_download_should_assign_application_octet_stream_if_content_type_is_not_determined
get :download, :params => {
:id => 22
}
assert_response :success
assert_nil Redmine::MimeType.of(attachments(:attachments_022).filename)
assert_equal 'application/octet-stream', @response.content_type
end
def test_download_missing_file
@ -355,7 +390,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
:id => 2
}
assert_response 404
set_tmp_attachments_directory
end
def test_download_should_be_denied_without_permission
@ -363,7 +397,6 @@ class AttachmentsControllerTest < Redmine::ControllerTest
:id => 7
}
assert_redirected_to '/login?back_url=http%3A%2F%2Ftest.host%2Fattachments%2Fdownload%2F7'
set_tmp_attachments_directory
end
if convert_installed?
@ -397,7 +430,7 @@ class AttachmentsControllerTest < Redmine::ControllerTest
end
def test_thumbnail_should_round_size
Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 250}
Redmine::Thumbnail.expects(:generate).with {|source, target, size| size == 300}
@request.session[:user_id] = 2
get :thumbnail, :params => {
@ -435,6 +468,22 @@ class AttachmentsControllerTest < Redmine::ControllerTest
puts '(ImageMagick convert not available)'
end
if gs_installed?
def test_thumbnail_for_pdf_should_be_png
skip unless convert_installed?
Attachment.clear_thumbnails
@request.session[:user_id] = 2
get :thumbnail, :params => {
:id => 23 # ecookbook-gantt.pdf
}
assert_response :success
assert_equal 'image/png', response.content_type
end
else
puts '(GhostScript convert not available)'
end
def test_edit_all
@request.session[:user_id] = 2
get :edit_all, :params => {
@ -453,6 +502,9 @@ class AttachmentsControllerTest < Redmine::ControllerTest
assert_select 'input[name=?][value=?]', 'attachments[4][description]', 'This is a Ruby source file'
end
end
# Link to the container in heading
assert_select 'h2 a', :text => "Feature request #2"
end
def test_edit_all_with_invalid_container_class_should_return_404
@ -488,12 +540,12 @@ class AttachmentsControllerTest < Redmine::ControllerTest
'1' => {
:filename => 'newname.text',
:description => ''
},
},
'4' => {
:filename => 'newname.rb',
:description => 'Renamed'
},
},
}
}
@ -512,12 +564,12 @@ class AttachmentsControllerTest < Redmine::ControllerTest
'1' => {
:filename => '',
:description => ''
},
},
'4' => {
:filename => 'newname.rb',
:description => 'Renamed'
},
},
}
}

View file

@ -1,7 +1,7 @@
# encoding: utf-8
#
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -23,9 +23,11 @@ class AttachmentsVisibilityTest < Redmine::ControllerTest
tests AttachmentsController
fixtures :users, :email_addresses, :projects, :roles, :members, :member_roles,
:enabled_modules, :projects_trackers, :issue_statuses, :enumerations,
:issues, :trackers, :versions
:issues, :trackers, :versions,
:custom_fields, :custom_fields_trackers, :custom_fields_projects
def setup
User.current = nil
set_tmp_attachments_directory
@field = IssueCustomField.generate!(:field_format => 'attachment', :visible => true)

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -159,6 +161,7 @@ class AuthSourcesControllerTest < Redmine::ControllerTest
:id => 1
}
assert_redirected_to '/auth_sources'
assert_equal 'This authentication mode is in use and cannot be deleted.', flash[:error]
end
end
@ -174,7 +177,7 @@ class AuthSourcesControllerTest < Redmine::ControllerTest
end
def test_test_connection_with_failure
AuthSourceLdap.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::LdapError.new("Something went wrong"))
AuthSourceLdap.any_instance.stubs(:initialize_ldap_con).raises(Net::LDAP::Error.new("Something went wrong"))
get :test_connection, :params => {
:id => 1

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -148,4 +150,20 @@ class AutoCompletesControllerTest < Redmine::ControllerTest
assert_response :success
assert_include 'application/json', response.headers['Content-Type']
end
def test_auto_complete_without_term_should_return_last_10_issues
# There are 9 issues generated by fixtures
# and we need two more to test the 10 limit
%w(1..2).each do
Issue.generate!
end
get :issues
assert_response :success
json = ActiveSupport::JSON.decode(response.body)
assert_equal 10, json.count
assert_equal Issue.last.id, json.first['id'].to_i
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -30,13 +32,38 @@ class CalendarsControllerTest < Redmine::ControllerTest
:issue_relations,
:issue_categories,
:enumerations,
:queries
:queries,
:users, :email_addresses
def test_show
get :show, :params => {
:project_id => 1
}
# Ensure that an issue to which a user is assigned is in the current
# month's calendar in order to test Gravatar
travel_to issues(:issues_002).start_date
with_settings :gravatar_enabled => '1' do
get :show, :params => {
:project_id => 1
}
end
assert_response :success
# query form
assert_select 'form#query_form' do
assert_select 'div#query_form_with_buttons.hide-when-print' do
assert_select 'div#query_form_content' do
assert_select 'fieldset#filters.collapsible'
end
assert_select 'p.contextual'
assert_select 'p.buttons'
end
end
# Assert context menu on issues
assert_select 'form[data-cm-url=?]', '/issues/context_menu'
assert_select 'div.issue.hascontextmenu.tooltip' do
assert_select 'input[name=?][type=?]', 'ids[]', 'checkbox'
assert_select 'img[class="gravatar"]'
end
end
def test_show_should_run_custom_queries
@ -109,8 +136,24 @@ class CalendarsControllerTest < Redmine::ControllerTest
get :show, :params => {
:query_id => 6
}
assert_response :success
assert_select 'h2', :text => 'Open issues grouped by tracker'
end
def test_show_calendar_day_css_classes
get :show, :params => {
:month => '12',
:year => '2016'
}
assert_response :success
assert_select 'tr:nth-child(2)' do
assert_select 'td.week-number', :text => '49'
# non working days should have "nwday" CSS class
assert_select 'td.nwday', 2
assert_select 'td.nwday', :text => '4'
assert_select 'td.nwday', :text => '10'
end
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -29,7 +31,7 @@ class CommentsControllerTest < Redmine::ControllerTest
post :create, :params => {
:id => 1,
:comment => {
:comments => 'This is a test comment'
:comments => 'This is a test comment'
}
}
assert_redirected_to '/news/1'
@ -46,7 +48,7 @@ class CommentsControllerTest < Redmine::ControllerTest
post :create, :params => {
:id => 1,
:comment => {
:comments => ''
:comments => ''
}
}
assert_response :redirect
@ -61,7 +63,7 @@ class CommentsControllerTest < Redmine::ControllerTest
post :create, :params => {
:id => 1,
:comment => {
:comments => 'This is a test comment'
:comments => 'This is a test comment'
}
}
assert_response 403

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -31,7 +33,8 @@ class ContextMenusControllerTest < Redmine::ControllerTest
:issues, :issue_statuses, :issue_categories,
:users,
:enumerations,
:time_entries
:time_entries,
:custom_fields, :custom_fields_trackers, :custom_fields_projects
def test_context_menu_one_issue
@request.session[:user_id] = 2
@ -187,7 +190,7 @@ class ContextMenusControllerTest < Redmine::ControllerTest
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', Project.find(1).members.count + 2 # users + 'none' + 'me'
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
@ -316,7 +319,7 @@ class ContextMenusControllerTest < Redmine::ControllerTest
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, :params => {
:ids => [1, 2]
}

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -45,7 +47,7 @@ class CustomFieldEnumerationsControllerTest < Redmine::ControllerTest
post :create, :params => {
:custom_field_id => @field.id,
:custom_field_enumeration => {
:name => 'Baz'
:name => 'Baz'
}
}
assert_redirected_to "/custom_fields/#{@field.id}/enumerations"
@ -63,7 +65,7 @@ class CustomFieldEnumerationsControllerTest < Redmine::ControllerTest
post :create, :params => {
:custom_field_id => @field.id,
:custom_field_enumeration => {
:name => 'Baz'
:name => 'Baz'
}
},
:xhr => true
@ -79,13 +81,13 @@ class CustomFieldEnumerationsControllerTest < Redmine::ControllerTest
:position => "1",
:name => "Baz",
:active => "1"
},
},
@foo.id.to_s => {
:position => "2",
:name => "Foo",
:active => "0"
}
}
}
}
assert_response 302

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -93,12 +95,77 @@ class CustomFieldsControllerTest < Redmine::ControllerTest
assert_select 'option[value=user]', :text => 'User'
assert_select 'option[value=version]', :text => 'Version'
end
# Visibility
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3
assert_select 'input[type=checkbox][name=?]', 'custom_field[project_ids][]', Project.count
assert_select 'input[type=hidden][name=?]', 'custom_field[project_ids][]', 1
assert_select 'input[type=hidden][name=type][value=IssueCustomField]'
end
end
def test_new_time_entry_custom_field
get :new, :params => {
:type => 'TimeEntryCustomField'
}
assert_response :success
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
# Visibility
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3
assert_select 'input[type=hidden][name=type][value=TimeEntryCustomField]'
end
end
def test_new_project_custom_field
get :new, :params => {
:type => 'ProjectCustomField'
}
assert_response :success
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
# Visibility
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3
assert_select 'input[type=hidden][name=type][value=ProjectCustomField]'
end
end
def test_new_version_custom_field
get :new, :params => {
:type => 'VersionCustomField'
}
assert_response :success
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
# Visibility
assert_select 'input[type=radio][name=?]', 'custom_field[visible]', 2
assert_select 'input[type=checkbox][name=?]', 'custom_field[role_ids][]', 3
assert_select 'input[type=hidden][name=type][value=VersionCustomField]'
end
end
def test_new_time_entry_custom_field_should_not_show_trackers_and_projects
get :new, :params => {
:type => 'TimeEntryCustomField'
@ -191,7 +258,7 @@ class CustomFieldsControllerTest < Redmine::ControllerTest
:type => 'IssueCustomField',
:custom_field => {
:field_format => 'list'
},
},
:format => 'js'
},
:xhr => true
@ -245,7 +312,7 @@ class CustomFieldsControllerTest < Redmine::ControllerTest
:field_format => "string",
:is_for_all => "0",
:project_ids => ["1", "3", ""]
}
}
assert_response 302
@ -254,6 +321,20 @@ class CustomFieldsControllerTest < Redmine::ControllerTest
assert_equal [1, 3], field.projects.map(&:id).sort
end
def test_create_with_continue_params
assert_difference 'CustomField.count' do
post :create, :params => {
:type => 'IssueCustomField',
:continue => 'Create and Continue',
:custom_field => {
:name => 'foo',
:field_format => 'string'
}
}
end
assert_redirected_to '/custom_fields/new?type=IssueCustomField'
end
def test_create_with_failure
assert_no_difference 'CustomField.count' do
post :create, :params => {

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -20,7 +22,7 @@ require File.expand_path('../../test_helper', __FILE__)
class DocumentsControllerTest < Redmine::ControllerTest
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
:enabled_modules, :documents, :enumerations,
:groups_users, :attachments
:groups_users, :attachments, :user_preferences
def setup
User.current = nil
@ -29,7 +31,7 @@ class DocumentsControllerTest < Redmine::ControllerTest
def test_index
# Sets a default category
e = Enumeration.find_by_name('Technical documentation')
e.update_attributes(:is_default => true)
e.update(:is_default => true)
get :index, :params => {
:project_id => 'ecookbook'
@ -45,13 +47,32 @@ class DocumentsControllerTest < Redmine::ControllerTest
end
end
def test_index_grouped_by_category
get :index, :params => {
:project_id => 'ecookbook',
:sort_by => 'category'
}
assert_response :success
assert_select '#content' do
# ascending order of DocumentCategory#id.
['Uncategorized', 'Technical documentation'].each_with_index do |text,idx|
assert_select "h3:nth-of-type(#{idx + 1})", :text => text
end
end
end
def test_index_grouped_by_date
get :index, :params => {
:project_id => 'ecookbook',
:sort_by => 'date'
}
assert_response :success
assert_select 'h3', :text => '2007-02-12'
assert_select '#content' do
# descending order of date.
['2007-03-05', '2007-02-12'].each_with_index do |text,idx|
assert_select "h3:nth-of-type(#{idx + 1})", :text => text
end
end
end
def test_index_grouped_by_title
@ -60,7 +81,12 @@ class DocumentsControllerTest < Redmine::ControllerTest
:sort_by => 'title'
}
assert_response :success
assert_select 'h3', :text => 'T'
assert_select '#content' do
# ascending order of title.
['A', 'T'].each_with_index do |text,idx|
assert_select "h3:nth-of-type(#{idx + 1})", :text => text
end
end
end
def test_index_grouped_by_author
@ -69,23 +95,26 @@ class DocumentsControllerTest < Redmine::ControllerTest
:sort_by => 'author'
}
assert_response :success
assert_select 'h3', :text => 'John Smith'
assert_select '#content' do
# ascending order of author.
['John Smith', 'Redmine Admin'].each_with_index do |text,idx|
assert_select "h3:nth-of-type(#{idx + 1})", :text => text
end
end
end
def test_index_with_long_description
# adds a long description to the first document
doc = documents(:documents_001)
doc.update_attributes(:description => <<LOREM)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut egestas, mi vehicula varius varius, ipsum massa fermentum orci, eget tristique ante sem vel mi. Nulla facilisi. Donec enim libero, luctus ac sagittis sit amet, vehicula sagittis magna. Duis ultrices molestie ante, eget scelerisque sem iaculis vitae. Etiam fermentum mauris vitae metus pharetra condimentum fermentum est pretium. Proin sollicitudin elementum quam quis pharetra. Aenean facilisis nunc quis elit volutpat mollis. Aenean eleifend varius euismod. Ut dolor est, congue eget dapibus eget, elementum eu odio. Integer et lectus neque, nec scelerisque nisi. EndOfLineHere
Vestibulum non velit mi. Aliquam scelerisque libero ut nulla fringilla a sollicitudin magna rhoncus. Praesent a nunc lorem, ac porttitor eros. Sed ac diam nec neque interdum adipiscing quis quis justo. Donec arcu nunc, fringilla eu dictum at, venenatis ac sem. Vestibulum quis elit urna, ac mattis sapien. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
LOREM
doc.update(:description => <<~LOREM)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut egestas, mi vehicula varius varius, ipsum massa fermentum orci, eget tristique ante sem vel mi. Nulla facilisi. Donec enim libero, luctus ac sagittis sit amet, vehicula sagittis magna. Duis ultrices molestie ante, eget scelerisque sem iaculis vitae. Etiam fermentum mauris vitae metus pharetra condimentum fermentum est pretium. Proin sollicitudin elementum quam quis pharetra. Aenean facilisis nunc quis elit volutpat mollis. Aenean eleifend varius euismod. Ut dolor est, congue eget dapibus eget, elementum eu odio. Integer et lectus neque, nec scelerisque nisi. EndOfLineHere
Vestibulum non velit mi. Aliquam scelerisque libero ut nulla fringilla a sollicitudin magna rhoncus. Praesent a nunc lorem, ac porttitor eros. Sed ac diam nec neque interdum adipiscing quis quis justo. Donec arcu nunc, fringilla eu dictum at, venenatis ac sem. Vestibulum quis elit urna, ac mattis sapien. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
LOREM
get :index, :params => {
:project_id => 'ecookbook'
}
assert_response :success
# 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..."))
@ -118,10 +147,10 @@ LOREM
:title => 'DocumentsControllerTest#test_post_new',
:description => 'This is a new document',
:category_id => 2
},
},
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
end
@ -132,7 +161,7 @@ LOREM
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
assert_equal 2, ActionMailer::Base.deliveries.size
end
def test_create_with_failure
@ -152,14 +181,14 @@ LOREM
def test_create_non_default_category
@request.session[:user_id] = 2
category2 = Enumeration.find_by_name('User documentation')
category2.update_attributes(:is_default => true)
category2.update(:is_default => true)
category1 = Enumeration.find_by_name('Uncategorized')
post :create, :params => {
:project_id => 'ecookbook',
:document => {
:title => 'no default',
:description => 'This is a new document',
:category_id => category1.id
:category_id => category1.id
}
}
assert_redirected_to '/projects/ecookbook/documents'
@ -203,6 +232,7 @@ LOREM
end
def test_destroy
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Document.count', -1 do
delete :destroy, :params => {
@ -214,13 +244,14 @@ LOREM
end
def test_add_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Attachment.count' do
post :add_attachment, :params => {
:id => 1,
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -185,7 +187,6 @@ class EmailAddressesControllerTest < Redmine::ControllerTest
assert [mail.bcc, mail.cc].flatten.include?('another@somenet.foo')
end
def test_destroy
@request.session[:user_id] = 2
email = EmailAddress.create!(:user_id => 2, :address => 'another@somenet.foo')

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -82,6 +84,21 @@ class EnumerationsControllerTest < Redmine::ControllerTest
assert_equal "sample", Enumeration.find_by(:name => 'Sample').custom_field_values.last.value
end
def test_create_with_multiple_select_list_custom_fields
custom_field = IssuePriorityCustomField.generate!(:field_format => 'list', :multiple => true, :possible_values => ['1', '2', '3', '4'])
assert_difference 'IssuePriority.count' do
post :create, :params => {
:enumeration => {
:type => 'IssuePriority',
:name => 'Sample',
:custom_field_values => {custom_field.id.to_s => ['1', '2']}
}
}
end
assert_redirected_to '/enumerations'
assert_equal ['1', '2'].sort, Enumeration.find_by(:name => 'Sample').custom_field_values.last.value.sort
end
def test_create_with_failure
assert_no_difference 'IssuePriority.count' do
post :create, :params => {

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -82,7 +84,7 @@ class FilesControllerTest < Redmine::ControllerTest
:version_id => '',
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
assert_response :redirect
@ -109,7 +111,7 @@ class FilesControllerTest < Redmine::ControllerTest
:version_id => '2',
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
assert_response :redirect

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -25,16 +27,42 @@ class GanttsControllerTest < Redmine::ControllerTest
:member_roles,
:members,
:enabled_modules,
:versions
:versions,
:email_addresses
def test_gantt_should_work
i2 = Issue.find(2)
i2.update_attribute(:due_date, 1.month.from_now)
get :show, :params => {
:project_id => 1
}
with_settings :gravatar_enabled => '1' do
get :show, :params => {
:project_id => 1
}
end
assert_response :success
# query form
assert_select 'form#query_form' do
assert_select 'div#query_form_with_buttons.hide-when-print' do
assert_select 'div#query_form_content' do
assert_select 'fieldset#filters.collapsible'
assert_select 'fieldset#options'
end
assert_select 'p.contextual' do
prev_month, next_month = User.current.today.prev_month, User.current.today.next_month
assert_select 'a[accesskey="p"][href=?]', project_gantt_path(:project_id => 1, :month => prev_month.month, :year => prev_month.year)
assert_select 'a[accesskey="n"][href=?]', project_gantt_path(:project_id => 1, :month => next_month.month, :year => next_month.year)
end
assert_select 'p.buttons'
end
end
# Assert context menu on issues subject and gantt bar
assert_select 'div[class=?]', 'issue-subject hascontextmenu'
assert_select 'div.tooltip.hascontextmenu' do
assert_select 'img[class="gravatar"]'
end
assert_select "form[data-cm-url=?]", '/issues/context_menu'
# Issue with start and due dates
i = Issue.find(1)
assert_not_nil i.due_date
@ -127,7 +155,7 @@ class GanttsControllerTest < Redmine::ControllerTest
assert @response.body.starts_with?('%PDF')
end
if Object.const_defined?(:Magick)
if Object.const_defined?(:MiniMagick)
def test_gantt_should_export_to_png
get :show, :params => {
:project_id => 1,
@ -137,4 +165,28 @@ class GanttsControllerTest < Redmine::ControllerTest
assert_equal 'image/png', @response.content_type
end
end
def test_gantt_should_respect_gantt_months_limit_setting
with_settings :gantt_months_limit => '40' do
# `months` parameter can be less than or equal to
# `Setting.gantt_months_limit`
get :show, :params => {
:project_id => 1,
:zoom => 4,
:months => 40
}
assert_response :success
assert_select 'div.gantt_hdr>a', :text => /^[\d-]+$/, :count => 40
# Displays 6 months (the default value for `months`) if `months` exceeds
# gant_months_limit
get :show, :params => {
:project_id => 1,
:zoom => 4,
:months => 41
}
assert_response :success
assert_select 'div.gantt_hdr>a', :text => /^[\d-]+$/, :count => 6
end
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -54,6 +56,20 @@ class GroupsControllerTest < Redmine::ControllerTest
assert_response :success
end
def test_show_should_display_custom_fields
GroupCustomField.generate!(name: 'field_visible', visible: true)
Group.find(10).update(custom_field_values: {GroupCustomField.last.id => 'value_visible'})
GroupCustomField.generate!(name: 'field_invisible', visible: false)
Group.find(10).update(custom_field_values: {GroupCustomField.last.id => 'value_invisible'})
get :show, :params => {:id => 10}
assert_response :success
assert_select 'li', :text => /field_visible/
assert_select 'li', :text => /value_visible/
assert_select 'li', :text => /field_invisible/, :count => 0
assert_select 'li', :text => /value_invisible/, :count => 0
end
def test_show_invalid_should_return_404
get :show, :params => {
:id => 99
@ -86,7 +102,7 @@ class GroupsControllerTest < Redmine::ControllerTest
post :create, :params => {
:group => {
:name => 'New group'
},
},
:continue => 'Create and continue'
}
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -19,7 +21,7 @@ require File.expand_path('../../test_helper', __FILE__)
class ImportsControllerTest < Redmine::ControllerTest
fixtures :projects, :enabled_modules,
:users, :email_addresses,
:users, :email_addresses, :user_preferences,
:roles, :members, :member_roles,
:issues, :issue_statuses,
:trackers, :projects_trackers,
@ -42,14 +44,16 @@ class ImportsControllerTest < Redmine::ControllerTest
end
def test_new_should_display_the_upload_form
get :new
get :new, :params => { :type => 'IssueImport', :project_id => 'subproject1' }
assert_response :success
assert_select 'input[name=?]', 'file'
assert_select 'input[name=?][type=?][value=?]', 'project_id', 'hidden', 'subproject1'
end
def test_create_should_save_the_file
import = new_record(Import) do
post :create, :params => {
:type => 'IssueImport',
:file => uploaded_test_file('import_issues.csv', 'text/csv')
}
assert_response 302
@ -172,7 +176,7 @@ class ImportsControllerTest < Redmine::ControllerTest
:mapping => {
:project_id => '1',
:tracker_id => '2',
:subject => '0'}
:subject => '0'}
}
}
assert_redirected_to "/imports/#{import.to_param}/run"
@ -183,7 +187,42 @@ class ImportsControllerTest < Redmine::ControllerTest
assert_equal '2', mapping['tracker_id']
assert_equal '0', mapping['subject']
end
def test_get_mapping_time_entry
Role.find(1).add_permission! :log_time_for_other_users
import = generate_time_entry_import
import.settings = {'separator' => ";", 'wrapper' => '"', 'encoding' => "ISO-8859-1"}
import.save!
get :mapping, :params => {
:id => import.to_param
}
assert_response :success
# 'user_id' field should be available because User#2 has both
# 'import_time_entries' and 'log_time_for_other_users' permissions
assert_select 'select[name=?]', 'import_settings[mapping][user_id]' do
# Current user should be the default value
assert_select 'option[value="value:2"][selected]', :text => User.find(2).name
assert_select 'option[value="value:3"]', :text => User.find(3).name
end
end
def test_get_mapping_time_entry_for_user_without_log_time_for_other_users_permission
import = generate_time_entry_import
import.settings = {'separator' => ";", 'wrapper' => '"', 'encoding' => "ISO-8859-1"}
import.save!
get :mapping, :params => {
:id => import.to_param
}
assert_response :success
assert_select 'select[name=?]', 'import_settings[mapping][user_id]', 0
end
def test_get_run
import = generate_import_with_mapping
@ -193,7 +232,7 @@ class ImportsControllerTest < Redmine::ControllerTest
assert_response :success
assert_select '#import-progress'
end
def test_post_run_should_import_the_file
import = generate_import_with_mapping
@ -234,6 +273,44 @@ class ImportsControllerTest < Redmine::ControllerTest
assert_equal ["Child of existing issue", "Child 1", "First"], issues.map(&:subject)
end
def test_post_run_with_notifications
import = generate_import
post :settings, :params => {
:id => import,
:import_settings => {
:separator => ';',
:wrapper => '"',
:encoding => 'ISO-8859-1',
:notifications => '1',
:mapping => {
:project_id => '1',
:tracker => '13',
:subject => '1',
:assigned_to => '11',
},
},
}
ActionMailer::Base.deliveries.clear
assert_difference 'Issue.count', 3 do
post :run, :params => {
:id => import,
}
assert_response :found
end
actual_email_count = ActionMailer::Base.deliveries.size
assert_not_equal 0, actual_email_count
import.reload
issue_ids = import.items.collect(&:obj_id)
expected_email_count =
Issue.where(:id => issue_ids).inject(0) do |sum, issue|
sum + (issue.notified_users | issue.notified_watchers).size
end
assert_equal expected_email_count, actual_email_count
end
def test_show_without_errors
import = generate_import_with_mapping
import.run

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -123,7 +125,7 @@ class IssueCategoriesControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 2,
:issue_category => {
:name => 'Testing'
:name => 'Testing'
}
}
end
@ -135,7 +137,7 @@ class IssueCategoriesControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 2,
:issue_category => {
:name => ''
:name => ''
}
}
assert_response :success
@ -146,7 +148,7 @@ class IssueCategoriesControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 97,
:issue_category => {
:name => 'Testing'
:name => 'Testing'
}
}
assert_response 404

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -18,7 +20,7 @@
require File.expand_path('../../test_helper', __FILE__)
class IssueStatusesControllerTest < Redmine::ControllerTest
fixtures :issue_statuses, :issues, :users, :trackers
fixtures :issue_statuses, :issues, :users, :trackers, :workflows
def setup
User.current = nil
@ -30,19 +32,34 @@ class IssueStatusesControllerTest < Redmine::ControllerTest
assert_response :success
assert_select 'table.issue_statuses'
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_index_should_show_warning_when_no_workflow_is_defined
status = IssueStatus.new :name => "No workflow"
status.save!
get :index
assert_response :success
assert_select 'table.issue_statuses tbody' do
assert_select 'tr:not(:last-of-type) span.icon-warning', :count => 0
assert_select 'tr:last-of-type' do
assert_select 'td.name', :text => status.name
assert_select 'td:nth-of-type(3) span.icon-warning',
:text => /#{I18n.t(:text_status_no_workflow)}/
end
end
end
def test_new
get :new
assert_response :success

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -44,7 +46,7 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:journal_details,
:queries
self.use_transactional_fixtures = false
self.use_transactional_tests = false
def setup
User.current = nil
@ -62,12 +64,12 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => 'My notes',
:lock_version => (issue.lock_version - 1)
},
},
:time_entry => {
:hours => '2.5',
:comments => '',
:activity_id => TimeEntryActivity.first.id
:activity_id => TimeEntryActivity.first.id
}
}
end
@ -98,16 +100,16 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => 'My notes',
:lock_version => (issue.lock_version - 1)
},
},
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
},
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
},
:time_entry => {
:hours => '2.5',
:comments => '',
:activity_id => TimeEntryActivity.first.id
:activity_id => TimeEntryActivity.first.id
}
}
end
@ -131,7 +133,7 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => '',
:lock_version => (issue.lock_version - 1)
}
}
assert_response :success
@ -151,8 +153,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => '',
:lock_version => 2
},
},
:last_journal_id => 1
}
assert_response :success
@ -170,8 +172,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => '',
:lock_version => 2
},
},
:last_journal_id => ''
}
assert_response :success
@ -190,7 +192,7 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:issue => {
:fixed_version_id => 4,
:lock_version => 2
},
},
:last_journal_id => ''
}
assert_response :success
@ -202,7 +204,7 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:issue => {
:fixed_version_id => 4,
:lock_version => 2
},
},
:last_journal_id => ''
}
assert_response :success
@ -219,8 +221,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => 'overwrite_conflict_resolution',
:lock_version => 2
},
},
:conflict_resolution => 'overwrite'
}
end
@ -243,8 +245,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => 'add_notes_conflict_resolution',
:lock_version => 2
},
},
:conflict_resolution => 'add_notes'
}
end
@ -269,8 +271,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:notes => 'add_privates_notes_conflict_resolution',
:private_notes => '1',
:lock_version => 2
},
},
:conflict_resolution => 'add_notes'
}
end
@ -291,8 +293,8 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
:fixed_version_id => 4,
:notes => 'add_notes_conflict_resolution',
:lock_version => 2
},
},
:conflict_resolution => 'cancel'
}
end
@ -309,12 +311,12 @@ class IssuesControllerTransactionTest < Redmine::ControllerTest
put :update, :params => {
:id => 1,
:issue => {
:subject => ''
},
:subject => ''
},
:time_entry => {
:hours => '2.5',
:comments => 'should not be added',
:activity_id => TimeEntryActivity.first.id
:activity_id => TimeEntryActivity.first.id
}
}
assert_response :success

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -29,11 +31,14 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
:projects_trackers,
:enabled_modules,
:enumerations,
:workflows
:workflows,
:custom_fields, :custom_fields_trackers
def setup
CustomField.delete_all
CustomField.destroy_all
Issue.delete_all
Watcher.delete_all
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all}
@fields = []
@fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true)))
@ -58,7 +63,7 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
}
Member.where(:project_id => 1).each do |member|
member.destroy unless @users_to_test.keys.include?(member.principal)
member.destroy unless @users_to_test.key?(member.principal)
end
end
@ -169,8 +174,8 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
:id => @issue.id,
:issue => {
:custom_field_values => {
@field1.id.to_s => "User#{user.id}Value0",
@field2.id.to_s => "User#{user.id}Value1",
@field1.id.to_s => "User#{user.id}Value0",
@field2.id.to_s => "User#{user.id}Value1",
@field3.id.to_s => "User#{user.id}Value2",
}
}
@ -220,7 +225,9 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
end
def test_index_with_partial_custom_field_visibility
CustomValue.delete_all
Issue.delete_all
p1 = Project.generate!
p2 = Project.generate!
user = User.generate!
@ -274,15 +281,16 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
:priority_id => 5,
:custom_field_values => {
@field1.id.to_s => 'Value0', @field2.id.to_s => 'Value1', @field3.id.to_s => 'Value2'
},
},
:watcher_user_ids => users_to_test.keys.map(&:id)
}
}
assert_response 302
end
end
assert_equal users_to_test.values.uniq.size, ActionMailer::Base.deliveries.size
assert_equal users_to_test.keys.size, ActionMailer::Base.deliveries.size
# tests that each user receives 1 email with the custom fields he is allowed to see only
users_to_test.each do |user, fields|
mails = ActionMailer::Base.deliveries.select {|m| m.bcc.include? user.mail}
@ -313,13 +321,13 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
:issue => {
:custom_field_values => {
@field1.id.to_s => 'NewValue0', @field2.id.to_s => 'NewValue1', @field3.id.to_s => 'NewValue2'
}
}
}
}
assert_response 302
end
assert_equal users_to_test.values.uniq.size, ActionMailer::Base.deliveries.size
assert_equal users_to_test.keys.size, ActionMailer::Base.deliveries.size
# tests that each user receives 1 email with the custom fields he is allowed to see only
users_to_test.each do |user, fields|
mails = ActionMailer::Base.deliveries.select {|m| m.bcc.include? user.mail}
@ -350,8 +358,8 @@ class IssuesCustomFieldsVisibilityTest < Redmine::ControllerTest
:issue => {
:custom_field_values => {
@field2.id.to_s => 'NewValue1', @field3.id.to_s => 'NewValue2'
}
}
}
}
assert_response 302

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -60,6 +62,7 @@ class JournalsControllerTest < Redmine::ControllerTest
end
def test_index_should_show_visible_custom_fields_only
set_tmp_attachments_directory
Issue.destroy_all
Journal.delete_all
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all}
@ -178,11 +181,13 @@ class JournalsControllerTest < Redmine::ControllerTest
@request.session[:user_id] = 2
get :new, :params => {
:id => 6,
:journal_id => 4
:journal_id => 4,
:journal_indice => 1
},
:xhr => true
assert_response :success
assert_equal 'text/javascript', response.content_type
assert_include 'Redmine Admin wrote in #note-1:', response.body
assert_include '> A comment with a private version', response.body
end
@ -253,6 +258,8 @@ class JournalsControllerTest < Redmine::ControllerTest
assert_equal 'text/javascript', response.content_type
assert_equal 'Updated notes', Journal.find(2).notes
assert_include 'journal-2-notes', response.body
# response should include journal_indice param for quote link
assert_include 'journal_indice=2', response.body
end
def test_update_xhr_with_private_notes_checked
@ -272,7 +279,7 @@ class JournalsControllerTest < Redmine::ControllerTest
end
def test_update_xhr_with_private_notes_unchecked
Journal.find(2).update_attributes(:private_notes => true)
Journal.find(2).update(:private_notes => true)
@request.session[:user_id] = 1
post :update, :params => {
:id => 2,

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -60,6 +62,22 @@ class MailHandlerControllerTest < Redmine::ControllerTest
assert_equal true, issue.is_private
end
def test_should_update_issue
# Enable API and set a key
Setting.mail_handler_api_enabled = 1
Setting.mail_handler_api_key = 'secret'
assert_no_difference 'Issue.count' do
assert_difference 'Journal.count' do
post :index, :params => {
:key => 'secret',
:email => IO.read(File.join(FIXTURES_PATH, 'ticket_reply.eml'))
}
end
end
assert_response 201
end
def test_should_respond_with_422_if_not_created
Project.find('onlinestore').destroy

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -33,7 +35,7 @@ class MessagesControllerTest < Redmine::ControllerTest
assert_select 'h2', :text => 'First post'
end
def test_show_should_contain_reply_field_tags_for_quoting
@request.session[:user_id] = 2
get :show, :params => {
@ -129,6 +131,7 @@ class MessagesControllerTest < Redmine::ControllerTest
}
}
end
assert_equal I18n.t(:notice_successful_create), flash[:notice]
message = Message.find_by_subject('Test created message')
assert_not_nil message
assert_redirected_to "/boards/1/topics/#{message.to_param}"
@ -136,14 +139,17 @@ class MessagesControllerTest < Redmine::ControllerTest
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
mails = ActionMailer::Base.deliveries
assert_not_empty mails
mails.each do |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
end
# author
assert mail.bcc.include?('jsmith@somenet.foo')
assert_equal ['jsmith@somenet.foo'], mails[0].bcc
# project member
assert mail.bcc.include?('dlopper@somenet.foo')
assert_equal ['dlopper@somenet.foo'], mails[1].bcc
end
def test_get_edit
@ -168,6 +174,7 @@ class MessagesControllerTest < Redmine::ControllerTest
}
}
assert_redirected_to '/boards/1/topics/1'
assert_equal I18n.t(:notice_successful_update), flash[:notice]
message = Message.find(1)
assert_equal 'New subject', message.subject
assert_equal 'New body', message.content
@ -186,6 +193,7 @@ class MessagesControllerTest < Redmine::ControllerTest
}
}
assert_redirected_to '/boards/1/topics/1'
assert_equal I18n.t(:notice_successful_update), flash[:notice]
message = Message.find(1)
assert_equal true, message.sticky?
assert_equal true, message.locked?
@ -214,15 +222,17 @@ class MessagesControllerTest < Redmine::ControllerTest
:id => 1,
:reply => {
:content => 'This is a test reply',
:subject => 'Test reply'
:subject => 'Test reply'
}
}
reply = Message.order('id DESC').first
assert_redirected_to "/boards/1/topics/1?r=#{reply.id}"
assert_equal I18n.t(:notice_successful_update), flash[:notice]
assert Message.find_by_subject('Test reply')
end
def test_destroy_topic
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Message.count', -3 do
post :destroy, :params => {
@ -231,6 +241,7 @@ class MessagesControllerTest < Redmine::ControllerTest
}
end
assert_redirected_to '/projects/ecookbook/boards/1'
assert_equal I18n.t(:notice_successful_delete), flash[:notice]
assert_nil Message.find_by_id(1)
end
@ -243,10 +254,26 @@ class MessagesControllerTest < Redmine::ControllerTest
}
end
assert_redirected_to '/boards/1/topics/1?r=2'
assert_equal I18n.t(:notice_successful_delete), flash[:notice]
assert_nil Message.find_by_id(2)
end
def test_quote
def test_quote_if_message_is_root
@request.session[:user_id] = 2
get :quote, :params => {
:board_id => 1,
:id => 1
},
:xhr => true
assert_response :success
assert_equal 'text/javascript', response.content_type
assert_include 'RE: First post', response.body
assert_include "Redmine Admin wrote:", response.body
assert_include '> This is the very first post\n> in the forum', response.body
end
def test_quote_if_message_is_not_root
@request.session[:user_id] = 2
get :quote, :params => {
:board_id => 1,
@ -257,6 +284,7 @@ class MessagesControllerTest < Redmine::ControllerTest
assert_equal 'text/javascript', response.content_type
assert_include 'RE: First post', response.body
assert_include 'John Smith wrote in message#3:', response.body
assert_include '> An other reply', response.body
end
@ -265,9 +293,9 @@ class MessagesControllerTest < Redmine::ControllerTest
post :preview, :params => {
:board_id => 1,
:message => {
:subject => "",
:content => "Previewed text"
}
:subject => ""
},
:text => "Previewed text"
}
assert_response :success
assert_include 'Previewed text', response.body
@ -280,8 +308,8 @@ class MessagesControllerTest < Redmine::ControllerTest
:board_id => 1,
:message => {
:subject => "",
:content => "Previewed text"
}
},
:text => "Previewed text"
}
assert_response :success
assert_include 'Previewed text', response.body

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -19,7 +21,8 @@ require File.expand_path('../../test_helper', __FILE__)
class MyControllerTest < Redmine::ControllerTest
fixtures :users, :email_addresses, :user_preferences, :roles, :projects, :members, :member_roles,
:issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources, :queries
:issues, :issue_statuses, :trackers, :enumerations, :custom_fields, :auth_sources, :queries, :enabled_modules,
:journals
def setup
@request.session[:user_id] = 2
@ -95,7 +98,7 @@ class MyControllerTest < Redmine::ControllerTest
assert_select 'table.issues.sort-by-due-date'
end
end
def test_page_with_issuequery_block_and_no_settings
user = User.find(2)
user.pref.my_page_layout = {'top' => ['issuequery']}
@ -125,7 +128,7 @@ class MyControllerTest < Redmine::ControllerTest
assert_select '#block-issuequery' do
assert_select 'a[href=?]', "/issues?query_id=#{query.id}"
# assert number of columns (columns from query + id column + checkbox column)
assert_select 'table.issues th', 6
assert_select 'table.issues th', 7
# assert results limit
assert_select 'table.issues tr.issue', 10
assert_select 'table.issues td.assigned_to'
@ -145,7 +148,7 @@ class MyControllerTest < Redmine::ControllerTest
assert_select '#block-issuequery' do
assert_select 'a[href=?]', "/projects/ecookbook/issues?query_id=#{query.id}"
# assert number of columns (columns from query + id column + checkbox column)
assert_select 'table.issues th', 6
assert_select 'table.issues th', 7
# assert results limit
assert_select 'table.issues tr.issue', 10
assert_select 'table.issues td.assigned_to'
@ -164,7 +167,7 @@ class MyControllerTest < Redmine::ControllerTest
assert_select '#block-issuequery' do
# assert number of columns (columns from query + id column + checkbox column)
assert_select 'table.issues th', 4
assert_select 'table.issues th', 5
assert_select 'table.issues th', :text => 'Due date'
end
end
@ -198,6 +201,50 @@ class MyControllerTest < Redmine::ControllerTest
end
end
def test_page_with_activity
user = User.find(2)
user.pref.my_page_layout = {'top' => ['activity']}
user.pref.time_zone = 'UTC'
user.pref.save!
get :page
assert_response :success
assert_select 'div#block-activity' do
assert_select 'h3' do
assert_select 'a[href=?]', activity_path(from: User.current.today, user_id: user.id), :text => 'Activity'
end
assert_select 'div#activity' do
assert_select 'dt', 10
end
end
end
def test_page_with_updated_issues_block
preferences = User.find(2).pref
preferences.my_page_layout = {'top' => ['issuesupdatedbyme']}
preferences.my_page_settings = {'issuesupdatedbyme' => {}}
preferences.save!
project = Project.find(3)
project.close
get :page
assert_response :success
assert_select '#block-issuesupdatedbyme' do
report_url = CGI.unescape(css_select('h3 a').first.attr('href'))
assert_match 'f[]=project.status', report_url
assert_match 'v[project.status][]=1', report_url
assert_match 'f[]=updated_by', report_url
assert_match 'v[updated_by][]=me', report_url
assert_select 'table.issues tbody tr', 2
assert_select 'table.issues tbody tr[id=?]', 'issue-1', 1, :title => 'Cannot print recipes'
assert_select 'table.issues tbody tr[id=?]', 'issue-14', 0
end
end
def test_page_with_all_blocks
blocks = Redmine::MyPage.blocks.keys
preferences = User.find(2).pref
@ -209,6 +256,94 @@ class MyControllerTest < Redmine::ControllerTest
assert_select 'div.mypage-box', blocks.size
end
def test_page_with_assigned_issues_block_should_not_show_issues_from_closed_projects
preferences = User.find(2).pref
preferences.my_page_layout = {'top' => ['issuesassignedtome']}
preferences.my_page_settings = {'issuesassignedtome' => {}}
preferences.save!
issue = Issue.find(1)
issue.assigned_to = User.find(2)
issue.save!
project = Project.find(2)
project.close
project.save
get :page
assert_response :success
assert_select '#block-issuesassignedtome table.issues tbody' do
report_url = css_select('h3 a').map {|e| e.attr('href')}.first
assert_match 'f%5B%5D=project.status', report_url
assert_match 'v%5Bproject.status%5D%5B%5D=1', report_url
assert_select 'tr', 1
assert_select 'tr[id=?]', 'issue-1', 1, :title => 'Cannot print recipes'
assert_select 'tr[id=?]', 'issue-4', 0
end
end
def test_page_with_reported_issues_block_should_not_show_issues_from_closed_projects
preferences = User.find(2).pref
preferences.my_page_layout = {'top' => ['issuesreportedbyme']}
preferences.my_page_settings = {'issuesreportedbyme' => {}}
preferences.save!
issue = Issue.find(1)
issue.assigned_to = User.find(2)
issue.save!
project = Project.find(2)
project.close
project.save
get :page
assert_response :success
assert_select '#block-issuesreportedbyme' do
report_url = css_select('h3 a').map {|e| e.attr('href')}.first
assert_match 'f%5B%5D=project.status', report_url
assert_match 'v%5Bproject.status%5D%5B%5D=1', report_url
assert_select 'table.issues tbody tr', 10
assert_select 'table.issues tbody tr[id=?]', 'issue-1', 1, :title => 'Cannot print recipes'
assert_select 'table.issues tbody tr[id=?]', 'issue-4', 0
end
end
def test_page_with_watched_issues_block_should_not_show_issues_from_closed_projects
preferences = User.find(2).pref
preferences.my_page_layout = {'top' => ['issueswatched']}
preferences.my_page_settings = {'issueswatched' => {}}
preferences.save!
issue = Issue.find(1)
issue.watcher_user_ids = ['1', '2']
issue.save!
issue2 = Issue.find(4)
issue2.watcher_user_ids = ['2']
issue2.save!
project = Project.find(2)
project.close
project.save
get :page
assert_response :success
assert_select '#block-issueswatched table.issues tbody' do
report_url = css_select('h3 a').map {|e| e.attr('href')}.first
assert_match 'f%5B%5D=project.status', report_url
assert_match 'v%5Bproject.status%5D%5B%5D=1', report_url
assert_select 'tr', 1
assert_select 'tr[id=?]', 'issue-1', 1, :title => 'Cannot print recipes'
assert_select 'tr[id=?]', 'issue-4', 0
end
end
def test_my_account_should_show_editable_custom_fields
get :account
assert_response :success
@ -229,6 +364,16 @@ class MyControllerTest < Redmine::ControllerTest
assert_select 'select[name=?]', 'user[language]'
end
def test_my_account_with_avatar_enabled_should_link_to_edit_avatar
with_settings :gravatar_enabled => '1' do
Redmine::Configuration.with 'avatar_server_url' => 'https://gravatar.com' do
get :account
assert_response :success
assert_select 'a[href=?] img.gravatar', 'https://gravatar.com'
end
end
end
def test_my_account_should_not_show_language_select_with_force_default_language_for_loggedin
with_settings :force_default_language_for_loggedin => '1' do
get :account
@ -238,7 +383,7 @@ class MyControllerTest < Redmine::ControllerTest
end
def test_update_account
post :account, :params => {
put :account, :params => {
:user => {
:firstname => "Joe",
:login => "root",
@ -246,8 +391,8 @@ class MyControllerTest < Redmine::ControllerTest
:group_ids => ['10'],
:custom_field_values => {
"4" => "0100562500"
}
}
}
}
@ -263,10 +408,10 @@ class MyControllerTest < Redmine::ControllerTest
def test_update_account_should_send_security_notification
ActionMailer::Base.deliveries.clear
post :account, :params => {
put :account, :params => {
:user => {
:mail => 'foobar@example.com'
}
}
@ -393,7 +538,7 @@ class MyControllerTest < Redmine::ControllerTest
post :update_page, :params => {
:settings => {
'issuesassignedtome' => {
'columns' => ['subject', 'due_date']}
'columns' => ['subject', 'due_date']}
}
},
:xhr => true
@ -450,7 +595,7 @@ class MyControllerTest < Redmine::ControllerTest
pref = User.find(2).pref
pref.my_page_layout = {'left' => ['news', 'calendar','documents']}
pref.save!
post :order_blocks, :params => {
:group => 'left',
:blocks => ['documents', 'calendar', 'news']
@ -464,7 +609,7 @@ class MyControllerTest < Redmine::ControllerTest
pref = User.find(2).pref
pref.my_page_layout = {'left' => ['news','documents'], 'right' => ['calendar']}
pref.save!
post :order_blocks, :params => {
:group => 'left',
:blocks => ['news', 'calendar', 'documents']

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -20,7 +22,7 @@ require File.expand_path('../../test_helper', __FILE__)
class NewsControllerTest < Redmine::ControllerTest
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
:enabled_modules, :news, :comments,
:attachments
:attachments, :user_preferences
def setup
User.current = nil
@ -116,7 +118,7 @@ class NewsControllerTest < Redmine::ControllerTest
:news => {
:title => 'NewsControllerTest',
:description => 'This is the description',
:summary => ''
:summary => ''
}
}
end
@ -127,7 +129,7 @@ class NewsControllerTest < Redmine::ControllerTest
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
assert_equal 2, ActionMailer::Base.deliveries.size
end
def test_post_create_with_attachment
@ -139,11 +141,11 @@ class NewsControllerTest < Redmine::ControllerTest
:project_id => 1,
:news => {
:title => 'Test',
:description => 'This is the description'
},
:description => 'This is the description'
},
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
end
@ -160,7 +162,7 @@ class NewsControllerTest < Redmine::ControllerTest
:news => {
:title => '',
:description => 'This is the description',
:summary => ''
:summary => ''
}
}
assert_response :success
@ -181,7 +183,7 @@ class NewsControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 1,
:news => {
:description => 'Description changed by test_post_edit'
:description => 'Description changed by test_post_edit'
}
}
assert_redirected_to '/news/1'
@ -197,11 +199,11 @@ class NewsControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 1,
:news => {
:description => 'This is the description'
},
:description => 'This is the description'
},
:attachments => {
'1' => {
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
'file' => uploaded_test_file('testfile.txt', 'text/plain')}
}
}
end
@ -215,7 +217,7 @@ class NewsControllerTest < Redmine::ControllerTest
put :update, :params => {
:id => 1,
:news => {
:description => ''
:description => ''
}
}
assert_response :success

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -28,62 +30,36 @@ class PreviewsControllerTest < Redmine::ControllerTest
:journals, :journal_details,
:news
def test_preview_new_issue
def test_preview_new_issue_description
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:issue => {
:description => 'Foo'
}
:text => 'Foo'
}
assert_response :success
assert_select 'fieldset' do
assert_select 'legend', :text => 'Description'
assert_select 'p', :text => 'Foo'
end
assert_select 'p', :text => 'Foo'
end
def test_preview_issue_notes_with_no_change_to_description
def test_preview_issue_description
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:issue_id => 1,
:text => 'Unable to print recipes'
}
assert_response :success
assert_select 'p', :text => 'Unable to print recipes'
end
def test_preview_issue_notes
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:id => 1,
:issue => {
:description => Issue.find(1).description,
:notes => 'Foo'
}
:text => 'Foo'
}
assert_response :success
assert_select 'legend', :text => 'Description', :count => 0
assert_select 'legend', :text => 'Notes'
end
def test_preview_issue_notes_with_change_to_description
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:id => 1,
:issue => {
:description => 'Changed description',
:notes => 'Foo'
}
}
assert_response :success
assert_select 'legend', :text => 'Description'
assert_select 'legend', :text => 'Notes'
end
def test_preview_journal_notes_for_update
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:id => 1,
:journal => {
:notes => 'Foo'
}
}
assert_response :success
assert_select 'legend', :text => 'Notes'
assert_select 'p', :text => 'Foo'
end
@ -92,53 +68,30 @@ class PreviewsControllerTest < Redmine::ControllerTest
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:id => 1,
:issue => {
:notes => 'attachment:foo.bar'
}
:issue_id => 1,
:field => 'notes',
:text => 'attachment:foo.bar'
}
assert_response :success
assert_select 'a.attachment', :text => 'foo.bar'
end
def test_preview_issue_with_project_changed
@request.session[:user_id] = 2
post :issue, :params => {
:project_id => '1',
:id => 1,
:issue => {
:notes => 'notes',
:project_id => 2
}
}
assert_response :success
assert_select 'legend', :text => 'Notes'
end
def test_preview_new_news
get :news, :params => {
:project_id => 1,
:news => {
:title => '',
:description => 'News description',
:summary => ''
}
:text => 'News description',
}
assert_response :success
assert_select 'fieldset.preview', :text => /News description/
assert_select 'p', :text => /News description/
end
def test_preview_existing_news
get :news, :params => {
:project_id => 1,
:id => 2,
:news => {
:title => '',
:description => 'News description',
:summary => ''
}
:text => 'News description'
}
assert_response :success
assert_select 'fieldset.preview', :text => /News description/
assert_select 'p', :text => /News description/
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -114,7 +116,7 @@ class PrincipalMembershipsControllerTest < Redmine::ControllerTest
:membership => {
:project_ids => [3],
:role_ids => [2]
},
},
:format => 'js'
},
:xhr => true
@ -134,7 +136,7 @@ class PrincipalMembershipsControllerTest < Redmine::ControllerTest
:user_id => 7,
:membership => {
:project_ids => [3]
},
},
:format => 'js'
},
:xhr => true
@ -184,7 +186,7 @@ class PrincipalMembershipsControllerTest < Redmine::ControllerTest
:id => 1,
:membership => {
:role_ids => [2]
},
},
:format => 'js'
},
:xhr => true

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -29,7 +31,7 @@ class ProjectEnumerationsControllerTest < Redmine::ControllerTest
:custom_fields_trackers, :custom_values,
:time_entries
self.use_transactional_fixtures = false
self.use_transactional_tests = false
def setup
@request.session[:user_id] = nil
@ -107,7 +109,6 @@ class ProjectEnumerationsControllerTest < Redmine::ControllerTest
})
assert project_activity_two.save
put :update, :params => {
:project_id => 1,
:enumerations => {
@ -143,8 +144,8 @@ class ProjectEnumerationsControllerTest < Redmine::ControllerTest
:enumerations => {
"9"=> {
"parent_id"=>"9", "custom_field_values"=> {
"7" => "1"}, "active"=>"0"} # Design, De-activate
"7" => "1"}, "active"=>"0"} # Design, De-activate
}
}
assert_response :redirect
@ -163,10 +164,11 @@ class ProjectEnumerationsControllerTest < Redmine::ControllerTest
# 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
user = User.find(1)
parent = TimeEntryActivity.find(9)
TimeEntryActivity.create!({:name => parent.name, :project_id => 1,
:position => parent.position, :active => true, :parent_id => 9})
TimeEntry.create!({:project_id => 1, :hours => 1.0, :user => User.find(1),
TimeEntry.create!({:project_id => 1, :hours => 1.0, :user => user, :author => user,
:issue_id => 3, :activity_id => 10, :spent_on => '2009-01-01'})
assert_equal 3, TimeEntry.where(:activity_id => 9, :project_id => 1).count
assert_equal 1, TimeEntry.where(:activity_id => 10, :project_id => 1).count

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -25,6 +27,8 @@ class ProjectsControllerTest < Redmine::ControllerTest
:attachments, :custom_fields, :custom_values, :time_entries,
:wikis, :wiki_pages, :wiki_contents, :wiki_content_versions
include Redmine::I18n
def setup
@request.session[:user_id] = nil
Setting.default_language = 'en'
@ -54,6 +58,198 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_select 'feed>entry', :count => Project.visible(User.current).count
end
def test_index_with_project_filter_is_my_projects
@request.session[:user_id] = 2
get :index, :params => {
:f => ['id'],
:op => {'id' => '='},
:v => {'id' => ['mine']}
}
assert_response :success
assert_select 'div#projects-index ul' do
assert_select 'a.project', 3
assert_select 'a', :text => 'eCookbook'
assert_select 'a', :text => 'OnlineStore'
assert_select 'a', :text => 'Private child of eCookbook'
end
end
def test_index_with_subproject_filter
@request.session[:user_id] = 1
get :index, :params => {
:f => ['parent_id'],
:op => {'parent_id' => '='},
:v => {'parent_id' => ['1']}
}
assert_response :success
assert_select 'div#projects-index ul' do
assert_select 'a.project', 3
assert_select 'a', :text => 'eCookbook Subproject 1'
assert_select 'a', :text => 'eCookbook Subproject 2'
assert_select 'a', :text => 'Private child of eCookbook'
end
end
def test_index_as_list_should_format_column_value
get :index, :params => {
:c => ['name', 'status', 'short_description', 'homepage', 'parent_id', 'identifier', 'is_public', 'created_on', 'cf_3'],
:display_type => 'list'
}
assert_response :success
project = Project.find(1)
assert_select 'table.projects' do
assert_select 'tr[id=?]', 'project-1' do
assert_select 'td.name a[href=?]', '/projects/ecookbook', :text => 'eCookbook'
assert_select 'td.status', :text => 'active'
assert_select 'td.short_description', :text => 'Recipes management application'
assert_select 'td.homepage a.external', :text => 'http://ecookbook.somenet.foo/'
assert_select 'td.identifier', :text => 'ecookbook'
assert_select 'td.is_public', :text => 'Yes'
assert_select 'td.created_on', :text => format_time(project.created_on)
assert_select 'td.cf_3.list', :text => 'Stable'
end
assert_select 'tr[id=?]', 'project-4' do
assert_select 'td.parent_id a[href=?]', '/projects/ecookbook', :text => 'eCookbook'
end
end
end
def test_index_as_list_should_show_my_favourite_projects
@request.session[:user_id] = 1
get :index, :params => {
:display_type => 'list'
}
assert_response :success
assert_select 'tr[id=?] td.name span[class=?]', 'project-5', 'icon icon-user my-project'
end
def test_index_as_list_should_indent_projects
@request.session[:user_id] = 1
get :index, :params => {
:c => ['name', 'short_description'],
:sort => 'parent_id:desc,lft:desc',
:display_type => 'list'
}
assert_response :success
child_level1 = css_select('tr#project-5').map {|e| e.attr('class')}.first.split(' ')
child_level2 = css_select('tr#project-6').map {|e| e.attr('class')}.first.split(' ')
assert_include 'idnt', child_level1
assert_include 'idnt-1', child_level1
assert_include 'idnt', child_level2
assert_include 'idnt-2', child_level2
end
def test_index_with_default_query_setting
with_settings :project_list_defaults => {'column_names' => %w(name short_description status)} do
get :index, :params => {
:display_type => 'list'
}
assert_response :success
end
assert_equal ['Name', 'Description', 'Status'], columns_in_list
end
def test_index_as_board_should_not_include_csv_export
@request.session[:user_id] = 1
get :index
assert_response :success
assert_select 'p.other-formats a.csv', 0
assert_select '#csv-export-options', 0
end
def test_index_as_list_should_include_csv_export
@request.session[:user_id] = 1
get :index, :params => {
:display_type => 'list',
:f => ['parent_id'],
:op => {'parent_id' => '='},
:v => {'parent_id' => ['1']}
}
assert_response :success
# Assert CSV export link
assert_select 'p.other-formats a.csv'
# Assert export modal
assert_select '#csv-export-options' do
assert_select 'form[action=?][method=get]', '/projects.csv' do
# filter
assert_select 'input[name=?][value=?]', 'f[]', 'parent_id'
assert_select 'input[name=?][value=?]', 'op[parent_id]', '='
assert_select 'input[name=?][value=?]', 'v[parent_id][]', '1'
# columns
assert_select 'input[name=?][type=hidden][value=?]', 'c[]', 'name'
assert_select 'input[name=?][type=hidden][value=?]', 'c[]', 'identifier'
assert_select 'input[name=?][type=hidden][value=?]', 'c[]', 'short_description'
assert_select 'input[name=?][type=hidden]', 'c[]', 3
assert_select 'input[name=?][value=?]', 'c[]', 'all_inline'
end
end
end
def test_index_csv
with_settings :date_format => '%m/%d/%Y' do
get :index, :params => {:format => 'csv'}
assert_response :success
assert_equal 'text/csv', response.media_type
end
end
def test_index_sort_by_custom_field
@request.session[:user_id] = 1
cf = ProjectCustomField.find(3)
CustomValue.create!(:custom_field => cf, :customized => Project.find(2), :value => 'Beta')
get(
:index,
:params => {
:display_type => 'list',
:c => ['name', 'identifier', 'cf_3'],
:set_filter => 1,
:sort => "cf_#{cf.id}:asc"
}
)
assert_response :success
assert_equal(
['Beta', 'Stable'],
columns_values_in_list('cf_3').reject {|p| p.empty?}
)
end
def test_index_with_int_custom_field_total
@request.session[:user_id] = 1
field = ProjectCustomField.generate!(:field_format => 'int')
CustomValue.create!(:customized => Project.find(1), :custom_field => field, :value => '2')
CustomValue.create!(:customized => Project.find(2), :custom_field => field, :value => '7')
get(
:index,
:params => {
:display_type => 'list',
:t => ["cf_#{field.id}"]
}
)
assert_response :success
assert_select '.query-totals'
assert_select ".total-for-cf-#{field.id} span.value", :text => '9'
end
def test_autocomplete_js
get :autocomplete, :params => {
:format => 'js',
@ -64,6 +260,16 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_equal 'text/javascript', response.content_type
end
def test_autocomplete_js_with_blank_search_term
get :autocomplete, :params => {
:format => 'js',
:q => ''
},
:xhr => true
assert_response :success
assert_equal 'text/javascript', response.content_type
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
@ -161,8 +367,8 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:tracker_ids => ['1', '3'],
# an issue custom field that is not for all project
:issue_custom_field_ids => ['9'],
@ -195,10 +401,10 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:parent_id => 1
}
}
assert_redirected_to '/projects/blog/settings'
@ -217,7 +423,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:project => {
:name => "blog",
:identifier => "blog"
},
},
:continue => 'Create and continue'
}
end
@ -235,11 +441,11 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:tracker_ids => ['1', '3'],
:enabled_module_names => ['issue_tracking', 'news', 'repository']
}
}
@ -270,10 +476,10 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:parent_id => 1
}
}
end
@ -293,10 +499,10 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:parent_id => 1
}
}
assert_redirected_to '/projects/blog/settings'
@ -317,9 +523,9 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
}
'3' => 'Beta'
}
}
}
end
@ -341,10 +547,10 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => "blog",
:is_public => 1,
:custom_field_values => {
'3' => 'Beta'
},
'3' => 'Beta'
},
:parent_id => 6
}
}
end
@ -365,7 +571,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:name => "blog1",
:identifier => "blog1",
:enabled_module_names => ["issue_tracking", "repository"]
}
}
end
@ -378,7 +584,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:name => "blog2",
:identifier => "blog2",
:enabled_module_names => ["issue_tracking", "repository"]
}
}
end
@ -398,7 +604,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => 'inherited',
:parent_id => parent.id,
:inherit_members => '1'
}
}
assert_response 302
@ -420,7 +626,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:name => "blog",
:identifier => "",
:enabled_module_names => %w(issue_tracking news)
}
}
end
@ -467,7 +673,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_select 'li', :text => /Development status/
assert_select 'li[class=?]', 'cf_3', :text => /Development status/
end
def test_show_should_not_display_hidden_custom_fields
@ -514,9 +720,9 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_response :success
end
def show_archived_project_should_be_denied
def test_show_archived_project_should_be_denied
project = Project.find_by_identifier('ecookbook')
project.archive!
project.archive
get :show, :params => {
:id => 'ecookbook'
@ -526,6 +732,18 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_not_include project.name, response.body
end
def test_show_archived_project_should_show_unarchive_link_to_admins
@request.session[:user_id] = 1
project = Project.find_by_identifier('ecookbook')
project.archive
get :show, :params => {
:id => 'ecookbook'
}
assert_response 403
assert_select 'a', :text => "Unarchive"
end
def test_show_should_not_show_private_subprojects_that_are_not_visible
get :show, :params => {
:id => 'ecookbook'
@ -553,6 +771,18 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_select 'table.issue-report td.total a', :text => %r{\A[1-9]\d*\z}
end
def test_show_should_spent_and_estimated_time
@request.session[:user_id] = 1
get :show, :params => {
:id => 'ecookbook'
}
assert_select 'div.spent_time.box>ul' do
assert_select '>li:nth-child(1)', :text => 'Estimated time: 203.50 hours'
assert_select '>li:nth-child(2)', :text => 'Spent time: 162.90 hours'
end
end
def test_settings
@request.session[:user_id] = 2 # manager
get :settings, :params => {
@ -589,22 +819,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
get :settings, :params => {
:id => 1
}
assert_response 302
end
def test_setting_with_wiki_module_and_no_wiki
Project.find(1).wiki.destroy
Role.find(1).add_permission! :manage_wiki
@request.session[:user_id] = 2
get :settings, :params => {
:id => 1
}
assert_response :success
assert_select 'form[action=?]', '/projects/ecookbook/wiki' do
assert_select 'input[name=?]', 'wiki[start_page]'
end
assert_response 403
end
def test_settings_should_accept_version_status_filter
@ -646,6 +861,27 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_select 'a#tab-versions[href=?]', '/projects/ecookbook/settings/versions?version_name=.1&version_status='
end
def test_settings_should_show_default_version_in_versions_tab
project = Project.find(1)
project.default_version_id = 3
project.save!
@request.session[:user_id] = 2
get :settings, :params => {
:id => 'ecookbook',
:tab => 'versions',
}
assert_response :success
assert_select 'table.versions tbody' do
# asserts that only one version is marked as default
assert_select 'td.tick span.icon-checked', 1
# asserts which version is marked as default
assert_select 'tr:first-child td.tick span.icon-checked', 1
end
end
def test_settings_should_show_locked_members
user = User.generate!
member = User.add_to_project(user, Project.find(1))
@ -684,6 +920,18 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_select 'a#tab-activities'
end
def test_settings_should_not_display_custom_fields_not_visible_for_user
@request.session[:user_id] = 2
ProjectCustomField.find_by_name('Development status').update_attribute :visible, false
get :settings, :params => {
:id => 'ecookbook'
}
assert_response :success
assert_select 'select#project_custom_field_values_3', :count => 0
end
def test_update
@request.session[:user_id] = 2 # manager
post :update, :params => {
@ -733,7 +981,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
:name => 'Closed'
}
}
assert_response 302
assert_response 403
assert_equal 'eCookbook', Project.find(1).name
end
@ -753,15 +1001,17 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_match /Successful update/, flash[:notice]
end
def test_modules
def test_update_modules
@request.session[:user_id] = 2
Project.find(1).enabled_module_names = ['issue_tracking', 'news']
post :modules, :params => {
post :update, :params => {
:id => 1,
:enabled_module_names => ['issue_tracking', 'repository', 'documents']
:project => {
:enabled_module_names => ['issue_tracking', 'repository', 'documents']
}
}
assert_redirected_to '/projects/ecookbook/settings/modules'
assert_redirected_to '/projects/ecookbook/settings'
assert_equal ['documents', 'issue_tracking', 'repository'], Project.find(1).enabled_module_names.sort
end
@ -778,6 +1028,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
end
def test_destroy_without_confirmation_should_show_confirmation_with_subprojects
set_tmp_attachments_directory
@request.session[:user_id] = 1 # admin
assert_no_difference 'Project.count' do
@ -793,6 +1044,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
end
def test_destroy_with_confirmation_should_destroy_the_project_and_subprojects
set_tmp_attachments_directory
@request.session[:user_id] = 1 # admin
assert_difference 'Project.count', -5 do
@ -900,10 +1152,8 @@ class ProjectsControllerTest < Redmine::ControllerTest
:id => source.id
}
assert_response :success
assert_select 'fieldset#project_issue_custom_fields' do
assert_select 'input[type=checkbox][value=?][checked=checked]', field1.id.to_s
assert_select 'input[type=checkbox][value=?]:not([checked])', field2.id.to_s
end
assert_select 'input[type=hidden][name=?][value=?]', 'project[issue_custom_field_ids][]', field1.id.to_s
assert_select 'input[type=hidden][name=?][value=?]', 'project[issue_custom_field_ids][]', field2.id.to_s, 0
end
def test_post_copy_should_copy_requested_items
@ -918,8 +1168,8 @@ class ProjectsControllerTest < Redmine::ControllerTest
:identifier => 'unique-copy',
:tracker_ids => ['1', '2', '3', ''],
:enabled_module_names => %w(issue_tracking time_tracking)
},
},
:only => %w(issues versions)
}
end
@ -958,21 +1208,42 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_select_error /Identifier cannot be blank/
end
def test_jump_without_project_id_should_redirect_to_active_tab
def test_bookmark_should_create_bookmark
@request.session[:user_id] = 3
post :bookmark, params: { id: 'ecookbook' }
assert_redirected_to controller: 'projects', action: 'show', id: 'ecookbook'
jb = Redmine::ProjectJumpBox.new(User.find(3))
assert jb.bookmark?(Project.find('ecookbook'))
refute jb.bookmark?(Project.find('onlinestore'))
end
def test_bookmark_should_delete_bookmark
@request.session[:user_id] = 3
jb = Redmine::ProjectJumpBox.new(User.find(3))
project = Project.find('ecookbook')
jb.bookmark_project project
delete :bookmark, params: { id: 'ecookbook' }
assert_redirected_to controller: 'projects', action: 'show', id: 'ecookbook'
jb = Redmine::ProjectJumpBox.new(User.find(3))
refute jb.bookmark?(Project.find('ecookbook'))
end
def test_index_jump_without_project_id_should_redirect_to_active_tab
get :index, :params => {
:jump => 'issues'
}
assert_redirected_to '/issues'
end
def test_jump_should_not_redirect_to_unknown_tab
def test_index_jump_should_not_redirect_to_unknown_tab
get :index, :params => {
:jump => 'foobar'
}
assert_response :success
end
def test_jump_should_redirect_to_active_tab
def test_show_jump_should_redirect_to_active_tab
get :show, :params => {
:id => 1,
:jump => 'issues'
@ -980,7 +1251,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_redirected_to '/projects/ecookbook/issues'
end
def test_jump_should_not_redirect_to_inactive_tab
def test_show_jump_should_not_redirect_to_inactive_tab
get :show, :params => {
:id => 3,
:jump => 'documents'
@ -988,7 +1259,7 @@ class ProjectsControllerTest < Redmine::ControllerTest
assert_response :success
end
def test_jump_should_not_redirect_to_unknown_tab
def test_show_jump_should_not_redirect_to_unknown_tab
get :show, :params => {
:id => 3,
:jump => 'foobar'

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -67,6 +69,26 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_response 404
end
def test_new_should_not_render_show_inline_columns_option_for_query_without_available_inline_columns
@request.session[:user_id] = 1
get :new, :params => {
:type => 'ProjectQuery'
}
assert_response :success
assert_select 'p[class=?]', 'block_columns', 0
end
def test_new_should_not_render_show_totals_option_for_query_without_totable_columns
@request.session[:user_id] = 1
get :new, :params => {
:type => 'ProjectQuery'
}
assert_response :success
assert_select 'p[class=?]', 'totables_columns', 0
end
def test_new_time_entry_query
@request.session[:user_id] = 2
get :new, :params => {
@ -75,6 +97,49 @@ class QueriesControllerTest < Redmine::ControllerTest
}
assert_response :success
assert_select 'input[name=type][value=?]', 'TimeEntryQuery'
assert_select 'p[class=?]', 'totable_columns', 1
assert_select 'p[class=?]', 'block_columns', 0
end
def test_new_project_query_for_projects
@request.session[:user_id] = 1
get :new, :params => {
:type => 'ProjectQuery'
}
assert_response :success
assert_select 'input[name=type][value=?]', 'ProjectQuery'
end
def test_new_project_query_should_not_render_roles_visibility_options
@request.session[:user_id] = 1
get :new, :params => {
:type => 'ProjectQuery'
}
assert_response :success
assert_select 'input[id=?]', 'query_visibility_0', 1
assert_select 'input[id=?]', 'query_visibility_2', 1
assert_select 'input[id=?]', 'query_visibility_1', 0
end
def test_new_project_query_should_not_render_for_all_projects_option
@request.session[:user_id] = 1
get :new, :params => {
:type => 'ProjectQuery'
}
assert_response :success
assert_select 'input[name=?]', 'for_all_projects', 0
end
def test_new_time_entry_query_should_select_spent_time_from_main_menu
@request.session[:user_id] = 2
get :new, :params => {
:project_id => 1,
:type => 'TimeEntryQuery'
}
assert_response :success
assert_select '#main-menu a.time-entries.selected'
end
def test_new_time_entry_query_with_issue_tracking_module_disabled_should_be_allowed
@ -96,10 +161,10 @@ class QueriesControllerTest < Redmine::ControllerTest
: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", "visibility" => "2"
}
@ -120,10 +185,10 @@ class QueriesControllerTest < Redmine::ControllerTest
: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", "visibility" => "0"
}
@ -144,10 +209,10 @@ class QueriesControllerTest < Redmine::ControllerTest
:fields => ["status_id", "assigned_to_id"],
:operators => {
"assigned_to_id" => "=", "status_id" => "o"
},
},
:values => {
"assigned_to_id" => ["1"], "status_id" => ["1"]
},
},
:query => {
"name" => "test_create_project_roles_query", "visibility" => "1", "role_ids" => ["1", "2", ""]
}
@ -165,13 +230,13 @@ class QueriesControllerTest < Redmine::ControllerTest
: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", "visibility" => "0"
},
},
:c => ["", "tracker", "subject", "priority", "category"]
}
@ -189,10 +254,10 @@ class QueriesControllerTest < Redmine::ControllerTest
:fields => ["assigned_to_id"],
:operators => {
"assigned_to_id" => "="
},
},
:values => {
"assigned_to_id" => ["me"]
},
},
:query => {
"name" => "test_new_global_query"
}
@ -212,15 +277,15 @@ class QueriesControllerTest < Redmine::ControllerTest
:default_columns => '1',
:operators => {
"status_id" => "o"
},
},
:values => {
"status_id" => ["1"]
},
},
:query => {
:name => "test_new_with_sort",
:visibility => "2",
:sort_criteria => {
"0" => ["due_date", "desc"], "1" => ["tracker", ""]}
"0" => ["due_date", "desc"], "1" => ["tracker", ""]}
}
}
@ -244,6 +309,31 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_select 'input[name=?]', 'query[name]'
end
def test_create_query_without_permission_should_fail
Role.all.each {|r| r.remove_permission! :save_queries, :manage_public_queries}
@request.session[:user_id] = 2
assert_no_difference '::Query.count' do
post :create, :params => {
:project_id => 'ecookbook',
:query => {:name => 'Foo'}
}
end
assert_response 403
end
def test_create_global_query_without_permission_should_fail
Role.all.each {|r| r.remove_permission! :save_queries, :manage_public_queries}
@request.session[:user_id] = 2
assert_no_difference '::Query.count' do
post :create, :params => {
:query => {:name => 'Foo'}
}
end
assert_response 403
end
def test_create_global_query_from_gantt
@request.session[:user_id] = 1
assert_difference 'IssueQuery.count' do
@ -251,14 +341,15 @@ class QueriesControllerTest < Redmine::ControllerTest
:gantt => 1,
:operators => {
"status_id" => "o"
},
},
:values => {
"status_id" => ["1"]
},
},
:query => {
:name => "test_create_from_gantt",
:draw_relations => '1',
:draw_progress_line => '1'
:draw_progress_line => '1',
:draw_selected_columns => '1'
}
}
assert_response 302
@ -267,6 +358,7 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_redirected_to "/issues/gantt?query_id=#{query.id}"
assert_equal true, query.draw_relations
assert_equal true, query.draw_progress_line
assert_equal true, query.draw_selected_columns
end
def test_create_project_query_from_gantt
@ -277,14 +369,15 @@ class QueriesControllerTest < Redmine::ControllerTest
:gantt => 1,
:operators => {
"status_id" => "o"
},
},
:values => {
"status_id" => ["1"]
},
},
:query => {
:name => "test_create_from_gantt",
:draw_relations => '0',
:draw_progress_line => '0'
:draw_progress_line => '0',
:draw_selected_columns => '0'
}
}
assert_response 302
@ -293,6 +386,7 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_redirected_to "/projects/ecookbook/issues/gantt?query_id=#{query.id}"
assert_equal false, query.draw_relations
assert_equal false, query.draw_progress_line
assert_equal false, query.draw_selected_columns
end
def test_create_project_public_query_should_force_private_without_manage_public_queries_permission
@ -384,10 +478,10 @@ class QueriesControllerTest < Redmine::ControllerTest
:f => ["spent_on"],
:op => {
"spent_on" => "="
},
},
:v => {
"spent_on" => ["2016-07-14"]
},
},
:query => {
"name" => "test_new_project_public_query", "visibility" => "2"
}
@ -400,6 +494,32 @@ class QueriesControllerTest < Redmine::ControllerTest
assert q.valid?
end
def test_create_public_project_query
@request.session[:user_id] = 1
q = new_record(ProjectQuery) do
post :create, :params => {
:type => 'ProjectQuery',
:default_columns => '1',
:f => ["status"],
:op => {
"status" => "="
},
:v => {
"status" => ['1']
},
:query => {
"name" => "test_new_project_public_query", "visibility" => "2"
}
}
end
assert_redirected_to :controller => 'projects', :action => 'index', :query_id => q.id
assert q.is_public?
assert q.valid?
end
def test_edit_global_public_query
@request.session[:user_id] = 1
get :edit, :params => {
@ -465,7 +585,7 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_response 404
end
def test_udpate_global_private_query
def test_update_global_private_query
@request.session[:user_id] = 3
put :update, :params => {
:id => 3,
@ -473,10 +593,10 @@ class QueriesControllerTest < Redmine::ControllerTest
: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", "visibility" => "2"
}
@ -497,10 +617,10 @@ class QueriesControllerTest < Redmine::ControllerTest
: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", "visibility" => "2"
}
@ -570,7 +690,10 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_include ["eCookbook - 2.0", "3", "open"], json
end
def test_filter_without_project_id_should_return_filter_values
def test_version_filter_without_project_id_should_return_all_visible_fixed_versions
# Remove "jsmith" user from "Private child of eCookbook" project
Project.find(5).memberships.find_by(:user_id => 2).destroy
@request.session[:user_id] = 2
get :filter, :params => {
:name => 'fixed_version_id'
@ -579,7 +702,14 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
# response includes visible version
assert_include ["eCookbook Subproject 1 - 2.0", "4", "open"], json
assert_include ["eCookbook - 0.1", "1", "closed"], json
# response includes systemwide visible version
assert_include ["OnlineStore - Systemwide visible version", "7", "open"], json
# response doesn't include non visible version
assert_not_include ["Private child of eCookbook - Private Version of public subproject", "6", "open"], json
end
def test_subproject_filter_time_entries_with_project_id_should_return_filter_values
@ -596,4 +726,96 @@ class QueriesControllerTest < Redmine::ControllerTest
assert_equal 4, json.count
assert_include ["Private child of eCookbook","5"], json
end
def test_assignee_filter_should_return_active_and_locked_users_grouped_by_status
@request.session[:user_id] = 1
get :filter, :params => {
:project_id => 1,
:type => 'IssueQuery',
:name => 'assigned_to_id'
}
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
assert_equal 6, json.count
# "me" value should not be grouped
assert_include ["<< me >>", "me"], json
assert_include ["Dave Lopper", "3", "active"], json
assert_include ["Dave2 Lopper2", "5", "locked"], json
end
def test_author_filter_should_return_active_and_locked_users_grouped_by_status
@request.session[:user_id] = 1
get :filter, :params => {
:project_id => 1,
:type => 'IssueQuery',
:name => 'author_id'
}
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
assert_equal 7, json.count
# "me" value should not be grouped
assert_include ["<< me >>", "me"], json
assert_include ["Dave Lopper", "3", "active"], json
assert_include ["Dave2 Lopper2", "5", "locked"], json
assert_include ["Anonymous", User.anonymous.id.to_s], json
end
def test_user_filter_should_return_active_and_locked_users_grouped_by_status
@request.session[:user_id] = 1
get :filter, :params => {
:project_id => 1,
:type => 'TimeEntryQuery',
:name => 'user_id'
}
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
assert_equal 7, json.count
# "me" value should not be grouped
assert_include ["<< me >>", "me"], json
assert_include ["Dave Lopper", "3", "active"], json
assert_include ["Dave2 Lopper2", "5", "locked"], json
end
def test_watcher_filter_without_permission_should_show_only_me
# This user does not have view_issue_watchers permission
@request.session[:user_id] = 7
get :filter, :params => {
:project_id => 1,
:type => 'IssueQuery',
:name => 'watcher_id'
}
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
assert_equal 1, json.count
assert_equal [["<< me >>", "me"]], json
end
def test_watcher_filter_with_permission_should_show_members
# This user has view_issue_watchers permission
@request.session[:user_id] = 1
get :filter, :params => {
:project_id => 1,
:type => 'IssueQuery',
:name => 'watcher_id'
}
assert_response :success
assert_equal 'application/json', response.content_type
json = ActiveSupport::JSON.decode(response.body)
assert_equal 6, json.count
# "me" value should not be grouped
assert_include ["<< me >>", "me"], json
assert_include ["Dave Lopper", "3", "active"], json
assert_include ["Dave2 Lopper2", "5", "locked"], json
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -25,7 +27,8 @@ class ReportsControllerTest < Redmine::ControllerTest
:member_roles,
:members,
:enabled_modules,
:versions
:versions,
:workflows
def test_get_issue_report
get :issue_report, :params => {
@ -34,6 +37,38 @@ class ReportsControllerTest < Redmine::ControllerTest
assert_response :success
end
def test_issue_report_with_subprojects_issues
Setting.stubs(:display_subprojects_issues?).returns(true)
get :issue_report, :params => {
:id => 1
}
assert_response :success
# Count subprojects issues
assert_select 'table.list tbody :nth-child(1):first' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '5' # open
assert_select ':nth-child(3)', :text => '3' # closed
assert_select ':nth-child(4)', :text => '8' # total
end
end
def test_issue_report_without_subprojects_issues
Setting.stubs(:display_subprojects_issues?).returns(false)
get :issue_report, :params => {
:id => 1
}
assert_response :success
# Do not count subprojects issues
assert_select 'table.list tbody :nth-child(1):first' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '3' # open
assert_select ':nth-child(3)', :text => '3' # closed
assert_select ':nth-child(4)', :text => '6' # total
end
end
def test_get_issue_report_details
%w(tracker version priority category assigned_to author subproject).each do |detail|
get :issue_report_details, :params => {
@ -44,6 +79,79 @@ class ReportsControllerTest < Redmine::ControllerTest
end
end
def test_get_issue_report_details_by_tracker_should_show_only_statuses_used_by_the_project
Setting.stubs(:display_subprojects_issues?).returns(false)
WorkflowTransition.delete_all
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 => 1, :new_status_id => 4)
WorkflowTransition.create(:role_id => 1, :tracker_id => 1, :old_status_id => 2, :new_status_id => 5)
WorkflowTransition.create(:role_id => 1, :tracker_id => 2, :old_status_id => 1, :new_status_id => 6)
get :issue_report_details, :params => {
:id => 1,
:detail => 'tracker'
}
assert_response :success
assert_select 'table.list tbody :nth-child(1)' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '3' # status:1
assert_select ':nth-child(3)', :text => '-' # status:2
assert_select ':nth-child(4)', :text => '-' # status:4
assert_select ':nth-child(5)', :text => '3' # status:5
assert_select ':nth-child(6)', :text => '-' # status:6
assert_select ':nth-child(7)', :text => '3' # open
assert_select ':nth-child(8)', :text => '3' # closed
assert_select ':nth-child(9)', :text => '6' # total
end
end
def test_get_issue_report_details_by_tracker_with_subprojects_issues
Setting.stubs(:display_subprojects_issues?).returns(true)
get :issue_report_details, :params => {
:id => 1,
:detail => 'tracker'
}
assert_response :success
# Count subprojects issues
assert_select 'table.list tbody :nth-child(1)' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '5' # status:1
assert_select ':nth-child(3)', :text => '-' # status:2
assert_select ':nth-child(4)', :text => '-' # status:3
assert_select ':nth-child(5)', :text => '-' # status:4
assert_select ':nth-child(6)', :text => '3' # status:5
assert_select ':nth-child(7)', :text => '-' # status:6
assert_select ':nth-child(8)', :text => '5' # open
assert_select ':nth-child(9)', :text => '3' # closed
assert_select ':nth-child(10)', :text => '8' # total
end
end
def test_get_issue_report_details_by_tracker_without_subprojects_issues
Setting.stubs(:display_subprojects_issues?).returns(false)
get :issue_report_details, :params => {
:id => 1,
:detail => 'tracker'
}
assert_response :success
# Do not count subprojects issues
assert_select 'table.list tbody :nth-child(1)' do
assert_select 'td', :text => 'Bug'
assert_select ':nth-child(2)', :text => '3' # status:1
assert_select ':nth-child(3)', :text => '-' # status:2
assert_select ':nth-child(4)', :text => '-' # status:3
assert_select ':nth-child(5)', :text => '-' # status:4
assert_select ':nth-child(6)', :text => '3' # status:5
assert_select ':nth-child(7)', :text => '-' # status:6
assert_select ':nth-child(8)', :text => '3' # open
assert_select ':nth-child(9)', :text => '3' # closed
assert_select ':nth-child(10)', :text => '6' # total
end
end
def test_get_issue_report_details_by_tracker_should_show_issue_count
Issue.delete_all
Issue.generate!(:tracker_id => 1)

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesBazaarControllerTest < Redmine::ControllerTest
class RepositoriesBazaarControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
@ -26,9 +28,9 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
REPOSITORY_PATH = Rails.root.join('tmp/test/bazaar_repository').to_s
REPOSITORY_PATH_TRUNK = File.join(REPOSITORY_PATH, "trunk")
PRJ_ID = 3
CHAR_1_UTF8_HEX = "\xc3\x9c".dup.force_encoding('UTF-8')
def setup
super
User.current = nil
@project = Project.find(PRJ_ID)
@repository = Repository::Bazaar.create(
@ -67,6 +69,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_browse_directory
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['directory'])[:param]
}
assert_response :success
@ -81,6 +84,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_browse_at_given_revision
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash([])[:param],
:rev => 3
}
@ -97,6 +101,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_changes
get :changes, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['doc-mkdir.txt'])[:param]
}
assert_response :success
@ -106,6 +111,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_entry_show
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['directory', 'doc-ls.txt'])[:param]
}
assert_response :success
@ -116,6 +122,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_entry_download
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['directory', 'doc-ls.txt'])[:param],
:format => 'raw'
}
@ -127,6 +134,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_directory_entry
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['directory'])[:param]
}
assert_response :success
@ -138,6 +146,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 3,
:type => dt
}
@ -150,6 +159,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
def test_annotate
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['doc-mkdir.txt'])[:param]
}
assert_response :success
@ -213,7 +223,7 @@ class RepositoriesBazaarControllerTest < Redmine::ControllerTest
assert_select "th.line-num", :text => '1' do
assert_select "+ td.revision" do
assert_select "a", :text => '2'
assert_select "+ td.author", :text => "test #{CHAR_1_UTF8_HEX}" do
assert_select "+ td.author", :text => "test Ü" do
assert_select "+ td",
:text => "author non ASCII test"
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,12 +19,13 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesControllerTest < Redmine::ControllerTest
class RepositoriesControllerTest < Redmine::RepositoryControllerTest
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, :enabled_modules,
:repositories, :issues, :issue_statuses, :changesets, :changes,
:issue_categories, :enumerations, :custom_fields, :custom_values, :trackers
def setup
super
User.current = nil
end
@ -53,7 +56,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
assert_select 'option[value=Git]:not([selected])'
end
end
def test_get_new_with_type
@request.session[:user_id] = 1
get :new, :params => {
@ -179,9 +182,31 @@ class RepositoriesControllerTest < Redmine::ControllerTest
end
end
if repository_configured?('subversion')
def test_show_should_show_diff_button_depending_on_browse_repository_permission
@request.session[:user_id] = 2
role = Role.find(1)
role.add_permission! :browse_repository
get :show, :params => {
:id => 1
}
assert_response :success
assert_select 'input[value="View differences"]'
role.remove_permission! :browse_repository
get :show, :params => {
:id => 1
}
assert_response :success
assert_select 'input[value="View differences"]', :count => 0
end
end
def test_revisions
get :revisions, :params => {
:id => 1
:id => 1,
:repository_id => 10
}
assert_response :success
assert_select 'table.changesets'
@ -209,6 +234,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
def test_revision
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 1
}
assert_response :success
@ -221,6 +247,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
with_settings :commit_logs_formatting => '0' do
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 1
}
assert_response :success
@ -234,11 +261,12 @@ class RepositoriesControllerTest < Redmine::ControllerTest
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 1
}
assert_response :success
assert_select 'form[action=?]', '/projects/ecookbook/repository/revisions/1/issues' do
assert_select 'form[action=?]', '/projects/ecookbook/repository/10/revisions/1/issues' do
assert_select 'input[name=?]', 'issue_id'
end
end
@ -246,6 +274,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
def test_revision_should_not_change_the_project_menu_link
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 1
}
assert_response :success
@ -256,13 +285,14 @@ class RepositoriesControllerTest < Redmine::ControllerTest
def test_revision_with_before_nil_and_afer_normal
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 1
}
assert_response :success
assert_select 'div.contextual' do
assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/0', 0
assert_select 'a[href=?]', '/projects/ecookbook/repository/revisions/2'
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/revisions/0', 0
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/revisions/2'
end
end
@ -271,6 +301,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
assert_difference 'Changeset.find(103).issues.size' do
post :add_related_issue, :params => {
:id => 1,
:repository_id => 10,
:rev => 4,
:issue_id => 2,
:format => 'js'
@ -289,6 +320,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
assert_difference 'Changeset.find(103).issues.size' do
post :add_related_issue, :params => {
:id => 1,
:repository_id => 10,
:rev => 4,
:issue_id => "#2",
:format => 'js'
@ -303,6 +335,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
assert_no_difference 'Changeset.find(103).issues.size' do
post :add_related_issue, :params => {
:id => 1,
:repository_id => 10,
:rev => 4,
:issue_id => 9999,
:format => 'js'
@ -322,6 +355,7 @@ class RepositoriesControllerTest < Redmine::ControllerTest
assert_difference 'Changeset.find(103).issues.size', -1 do
delete :remove_related_issue, :params => {
:id => 1,
:repository_id => 10,
:rev => 4,
:issue_id => 2,
:format => 'js'
@ -342,19 +376,29 @@ class RepositoriesControllerTest < Redmine::ControllerTest
get :graph, :params => {
:id => 1,
:repository_id => 10,
:graph => 'commits_per_month'
}
assert_response :success
assert_equal 'image/svg+xml', @response.content_type
assert_equal 'application/json', response.content_type
data = ActiveSupport::JSON.decode(response.body)
assert_not_nil data['labels']
assert_not_nil data['commits']
assert_not_nil data['changes']
end
def test_graph_commits_per_author
get :graph, :params => {
:id => 1,
:repository_id => 10,
:graph => 'commits_per_author'
}
assert_response :success
assert_equal 'image/svg+xml', @response.content_type
assert_equal 'application/json', response.content_type
data = ActiveSupport::JSON.decode(response.body)
assert_not_nil data['labels']
assert_not_nil data['commits']
assert_not_nil data['changes']
end
def test_get_committers

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesCvsControllerTest < Redmine::ControllerTest
class RepositoriesCvsControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
@ -31,6 +33,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
NUM_REV = 7
def setup
super
Setting.default_language = 'en'
User.current = nil
@ -85,6 +88,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param]
}
assert_response :success
@ -104,6 +108,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param],
:rev => 1
}
@ -123,6 +128,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success
@ -138,6 +144,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:rev => 2
}
@ -154,7 +161,8 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['sources', 'zzz.c'])[:param]
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'zzz.c'])[:param]
}
assert_select 'p#errorExplanation', :text => /The entry or revision was not found in the repository/
end
@ -166,6 +174,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:format => 'raw'
}
@ -179,6 +188,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources'])[:param]
}
assert_response :success
@ -193,6 +203,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 3,
:type => dt
}
@ -211,6 +222,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 1,
:type => dt
}
@ -231,6 +243,7 @@ class RepositoriesCvsControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success

View file

@ -1,178 +0,0 @@
# Redmine - project management software
# Copyright (C) 2006-2017 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 < Redmine::ControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :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, :params => {
:project_id => 'subproject1',
:repository_scm => 'Darcs'
}
assert_response :success
assert_select 'select[name=?]', 'repository_scm' do
assert_select 'option[value=?][selected=selected]', 'Darcs'
end
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, :params => {
:id => PRJ_ID
}
assert_select 'table.entries tbody' do
assert_select 'tr', 3
assert_select 'tr.dir td.filename a', :text => 'images'
assert_select 'tr.dir td.filename a', :text => 'sources'
assert_select 'tr.file td.filename a', :text => 'README'
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, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['images'])[:param]
}
assert_response :success
assert_select 'table.entries tbody' do
assert_select 'tr', 2
assert_select 'tr.file td.filename a', :text => 'delete.png'
assert_select 'tr.file td.filename a', :text => 'edit.png'
end
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, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['images'])[:param],
:rev => 1
}
assert_response :success
assert_select 'table.entries tbody' do
assert_select 'tr', 1
assert_select 'tr.file td.filename a', :text => 'delete.png'
end
end
def test_changes
assert_equal 0, @repository.changesets.count
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
get :changes, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['images', 'edit.png'])[:param]
}
assert_response :success
assert_select 'h2', :text => /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, :params => {
:id => PRJ_ID,
:rev => 5,
:type => dt
}
assert_response :success
# Line 22 removed
assert_select 'th.line-num:contains(22) ~ td.diff_out', :text => /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, :params => {
: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, :params => {
: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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
class RepositoriesFilesystemControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
@ -27,6 +29,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
PRJ_ID = 3
def setup
super
@ruby19_non_utf8_pass = Encoding.default_external.to_s != 'UTF-8'
User.current = nil
Setting.enabled_scm << 'Filesystem' unless Setting.enabled_scm.include?('Filesystem')
@ -78,6 +81,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
def test_show_no_extension
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['test'])[:param]
}
assert_response :success
@ -87,6 +91,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
def test_entry_download_no_extension
get :raw, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['test'])[:param]
}
assert_response :success
@ -97,6 +102,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
with_settings :repositories_encodings => 'UTF-8,EUC-JP' do
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['japanese', 'euc-jp.txt'])[:param]
}
assert_response :success
@ -106,8 +112,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
"when 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".force_encoding('UTF-8')
assert_select 'tr#L3 td.line-code', :text => /#{str_japanese}/
assert_select 'tr#L3 td.line-code', :text => /日本語/
end
end
end
@ -117,6 +122,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
with_settings :repositories_encodings => enc do
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['japanese', 'utf-16.txt'])[:param]
}
assert_response :success
@ -128,6 +134,7 @@ class RepositoriesFilesystemControllerTest < Redmine::ControllerTest
with_settings :file_max_size_displayed => 1 do
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['japanese', 'big-file.txt'])[:param]
}
assert_response :success

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesGitControllerTest < Redmine::ControllerTest
class RepositoriesGitControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles,
@ -26,20 +28,11 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
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".force_encoding('UTF-8')
FELIX_HEX = "Felix Sch\xC3\xA4fer".force_encoding('UTF-8')
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 = Encoding.default_external.to_s != 'UTF-8'
super
@not_utf8_external = Encoding.default_external.to_s != 'UTF-8'
User.current = nil
@project = Project.find(PRJ_ID)
@ -62,7 +55,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
:is_default => '0',
:identifier => 'test-create',
:report_last_commit => '1',
}
}
end
@ -76,7 +69,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
:id => repository.id,
:repository => {
:report_last_commit => '0'
}
}
assert_response 302
@ -144,6 +137,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 'test_branch'
}
assert_response :success
@ -166,12 +160,13 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
[
[
"tag00.lightweight",
"tag01.annotated",
].each do |t1|
].each do |t1|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => t1
}
assert_response :success
@ -188,6 +183,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param]
}
assert_response :success
@ -206,6 +202,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param],
:rev => '7234cb2750b63f47bff735edc50a1c0a433c2518'
}
@ -220,6 +217,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_changes
get :changes, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images', 'edit.png'])[:param]
}
assert_response :success
@ -229,6 +227,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_entry_show
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success
@ -236,23 +235,33 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_select 'tr#L11 td.line-code', :text => /WITHOUT ANY WARRANTY/
end
def test_entry_show_should_render_pagination
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['README'])[:param]
}
assert_response :success
assert_select 'ul.pages li.next', :text => /next/i
assert_select 'ul.pages li.previous', :text => /previous/i
end
def test_entry_show_latin_1
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
if @not_utf8_external
puts_pass_on_not_utf8
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, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{CHAR_1_HEX}.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
:rev => r1
}
assert_response :success
assert_select 'tr#L1 td.line-code', :text => /test-#{CHAR_1_HEX}.txt/
assert_select 'tr#L1 td.line-code', :text => /test-Ü.txt/
end
end
end
@ -261,6 +270,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_entry_download
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:format => 'raw'
}
@ -272,13 +282,13 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_directory_entry
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources'])[:param]
}
assert_response :success
assert_select 'h2 a', :text => 'sources'
assert_select 'table.entries tbody'
assert_select 'div.contextual > a.icon-download', false
end
def test_diff
@ -292,6 +302,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:type => dt
}
@ -312,6 +323,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:type => dt
@ -336,6 +348,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
with_settings :default_language => 'en' do
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
@ -345,6 +358,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
with_settings :default_language => 'fr' do
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:type => 'inline',
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
@ -364,13 +378,14 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '61b685fbe55ab05b5ac68402d5720c1a6ac973d1',
:rev_to => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:type => dt
}
assert_response :success
assert_select 'h2', :text => /2f9c0091:61b685fb/
assert_select 'form[action=?]', '/projects/subproject1/repository/revisions/61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff'
assert_select 'form[action=?]', "/projects/subproject1/repository/#{@repository.id}/revisions/61b685fbe55ab05b5ac68402d5720c1a6ac973d1/diff"
assert_select 'input#rev_to[type=hidden][name=rev_to][value=?]', '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
end
end
@ -398,21 +413,22 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
end
def test_diff_latin_1
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
if @not_utf8_external
puts_pass_on_not_utf8
else
with_settings :repositories_encodings => 'UTF-8,ISO-8859-1' do
['57ca437c', '57ca437c0acbbcb749821fdf3726a1367056d364'].each do |r1|
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r1,
:type => dt
}
assert_response :success
assert_select 'table' do
assert_select 'thead th.filename', :text => /latin-1-dir\/test-#{CHAR_1_HEX}.txt/
assert_select 'tbody td.diff_in', :text => /test-#{CHAR_1_HEX}.txt/
assert_select 'thead th.filename', :text => /latin-1-dir\/test-Ü.txt/
assert_select 'tbody td.diff_in', :text => /test-Ü.txt/
end
end
end
@ -423,6 +439,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_diff_should_show_filenames
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 'deff712f05a90d96edbd70facc47d944be5897e3',
:type => 'inline'
}
@ -443,6 +460,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
@request.session[:user_id] = 1 # admin
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7'
}
assert_response :success
@ -450,6 +468,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_equal "inline", user.pref[:diff_type]
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '2f9c0091c754a91af7a9c478e36556b4bde8dcf7',
:type => 'sbs'
}
@ -461,6 +480,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
def test_annotate
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success
@ -481,6 +501,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 'deff7',
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
@ -492,6 +513,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
with_settings :default_language => 'en' do
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images', 'edit.png'])[:param]
}
assert_response :success
@ -503,6 +525,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
with_settings :file_max_size_displayed => 1 do
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:rev => 'deff712f'
}
@ -511,6 +534,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['README'])[:param],
:rev => '7234cb2'
}
@ -519,18 +543,17 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
end
def test_annotate_latin_1
if @ruby19_non_utf8_pass
puts_ruby19_non_utf8_pass()
if @not_utf8_external
puts_pass_on_not_utf8
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, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{CHAR_1_HEX}.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
:rev => r1
}
assert_select "th.line-num", :text => '1' do
@ -538,7 +561,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
assert_select "a", :text => '57ca437c'
assert_select "+ td.author", :text => "jsmith" do
assert_select "+ td",
:text => "test-#{CHAR_1_HEX}.txt"
:text => "test-Ü.txt"
end
end
end
@ -551,13 +574,14 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['83ca5fd546063a3c7dc2e568ba3355661a9e2b2c', '83ca5fd546063a'].each do |r1|
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash([" filename with a leading space.txt "])[:param],
:rev => r1
}
assert_select "th.line-num", :text => '1' do
assert_select "+ td.revision" do
assert_select "a", :text => '83ca5fd5'
assert_select "+ td.author", :text => FELIX_HEX do
assert_select "+ td.author", :text => "Felix Schäfer" do
assert_select "+ td",
:text => "And this is a file with a leading and trailing space..."
end
@ -572,9 +596,10 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
@project.reload
assert_equal NUM_REV, @repository.changesets.count
get :revisions, :params => {
:id => PRJ_ID
:id => PRJ_ID,
:repository_id => @repository.id
}
assert_select 'form[method=get][action=?]', '/projects/subproject1/repository/revision'
assert_select 'form[method=get][action=?]', "/projects/subproject1/repository/#{@repository.id}/revision"
end
def test_revision
@ -585,6 +610,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['61b685fbe55ab05b5ac68402d5720c1a6ac973d1', '61b685f'].each do |r|
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r
}
assert_response :success
@ -599,6 +625,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
['', ' ', nil].each do |r|
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r
}
assert_response 404
@ -647,7 +674,7 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
private
def puts_ruby19_non_utf8_pass
def puts_pass_on_not_utf8
puts "TODO: This test fails " +
"when Encoding.default_external is not UTF-8. " +
"Current value is '#{Encoding.default_external.to_s}'"
@ -658,10 +685,11 @@ class RepositoriesGitControllerTest < Redmine::ControllerTest
end
private
def with_cache(&block)
before = ActionController::Base.perform_caching
ActionController::Base.perform_caching = true
block.call
yield
ActionController::Base.perform_caching = before
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,20 +19,18 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesMercurialControllerTest < Redmine::ControllerTest
class RepositoriesMercurialControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :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 = 34
ruby19_non_utf8_pass = Encoding.default_external.to_s != 'UTF-8'
def setup
super
User.current = nil
@project = Project.find(PRJ_ID)
@repository = Repository::Mercurial.create(
@ -40,13 +40,9 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
)
assert @repository
@diff_c_support = true
@char_1 = CHAR_1_HEX.dup.force_encoding('UTF-8')
@tag_char_1 = "tag-#{CHAR_1_HEX}-00".force_encoding('UTF-8')
@branch_char_0 = "branch-#{CHAR_1_HEX}-00".force_encoding('UTF-8')
@branch_char_1 = "branch-#{CHAR_1_HEX}-01".force_encoding('UTF-8')
end
if ruby19_non_utf8_pass
if Encoding.default_external.to_s != 'UTF-8'
puts "TODO: Mercurial functional test fails " +
"when Encoding.default_external is not UTF-8. " +
"Current value is '#{Encoding.default_external.to_s}'"
@ -96,6 +92,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param]
}
assert_response :success
@ -119,6 +116,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[0, '0', '0885933ad4f6'].each do |r1|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images'])[:param],
:rev => r1
}
@ -128,7 +126,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
assert_select 'tr', 1
assert_select 'tr.file td.filename a', :text => 'delete.png'
end
assert_select 'table.changesets tbody' do
assert_select 'tr'
end
@ -143,6 +141,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[13, '13', '3a330eb32958'].each do |r1|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sql_escape', 'percent%dir'])[:param],
:rev => r1
}
@ -153,7 +152,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
assert_select 'tr.file td.filename a', :text => 'percent%file1.txt'
assert_select 'tr.file td.filename a', :text => 'percentfile1.txt'
end
assert_select 'table.changesets tbody' do
assert_select 'tr td.id a', :text => /^13:/
assert_select 'tr td.id a', :text => /^11:/
@ -171,6 +170,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[21, '21', 'adf805632193'].each do |r1|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir'])[:param],
:rev => r1
}
@ -179,11 +179,11 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
assert_select 'table.entries tbody' do
assert_select 'tr', 4
assert_select 'tr.file td.filename a', :text => "make-latin-1-file.rb"
assert_select 'tr.file td.filename a', :text => "test-#{@char_1}-1.txt"
assert_select 'tr.file td.filename a', :text => "test-#{@char_1}-2.txt"
assert_select 'tr.file td.filename a', :text => "test-#{@char_1}.txt"
assert_select 'tr.file td.filename a', :text => "test-Ü-1.txt"
assert_select 'tr.file td.filename a', :text => "test-Ü-2.txt"
assert_select 'tr.file td.filename a', :text => "test-Ü.txt"
end
assert_select 'table.changesets tbody' do
assert_select 'tr td.id a', :text => /^21:/
assert_select 'tr td.id a', :text => /^20:/
@ -212,16 +212,17 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
[
[
'default',
@branch_char_1,
'branch-Ü-01',
'branch (1)[2]&,%.-3_4',
@branch_char_0,
'branch-Ü-00',
'test_branch.latin-1',
'test-branch-00',
].each do |bra|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => bra
}
assert_response :success
@ -236,13 +237,14 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
@repository.fetch_changesets
@project.reload
assert_equal NUM_REV, @repository.changesets.count
[
@tag_char_1,
[
'tag-Ü-00',
'tag_test.00',
'tag-init-revision'
].each do |tag|
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => tag
}
assert_response :success
@ -255,6 +257,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_changes
get :changes, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['images', 'edit.png'])[:param]
}
assert_response :success
@ -264,6 +267,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_entry_show
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success
@ -275,7 +279,8 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[21, '21', 'adf805632193'].each do |r1|
get :entry, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü-2.txt"])[:param],
:rev => r1
}
assert_response :success
@ -288,11 +293,12 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[27, '27', '7bbf4c738e71'].each do |r1|
get :entry, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
:rev => r1
}
assert_response :success
assert_select 'tr#L1 td.line-code', :text => /test-#{@char_1}.txt/
assert_select 'tr#L1 td.line-code', :text => /test-Ü.txt/
end
end
end
@ -300,6 +306,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_entry_download
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param],
:format => 'raw'
}
@ -315,6 +322,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_directory_entry
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources'])[:param]
}
assert_response :success
@ -332,6 +340,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r1,
:type => dt
}
@ -355,6 +364,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r1,
:rev_to => r2,
:type => dt
@ -372,12 +382,13 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r1,
:type => dt
}
assert_response :success
assert_select 'table' do
assert_select 'thead th.filename', :text => /latin-1-dir\/test-#{@char_1}-2.txt/
assert_select 'thead th.filename', :text => /latin-1-dir\/test-Ü-2.txt/
assert_select 'tbody td.diff_in', :text => /It is written in Python/
end
end
@ -388,6 +399,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_diff_should_show_modified_filenames
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '400bb8672109',
:type => 'inline'
}
@ -398,6 +410,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_diff_should_show_deleted_filenames
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 'b3a615152df8',
:type => 'inline'
}
@ -408,6 +421,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
def test_annotate
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
assert_response :success
@ -428,6 +442,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['sources', 'welcome_controller.rb'])[:param]
}
assert_response 404
@ -442,6 +457,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[2, '400bb8672109', '400', 400].each do |r1|
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r1,
:path => repository_path_hash(['sources', 'watchers_controller.rb'])[:param]
}
@ -454,7 +470,8 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[21, '21', 'adf805632193'].each do |r1|
get :annotate, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{@char_1}-2.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü-2.txt"])[:param],
:rev => r1
}
assert_response :success
@ -475,10 +492,11 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
[27, '7bbf4c738e71'].each do |r1|
get :annotate, :params => {
:id => PRJ_ID,
:path => repository_path_hash(['latin-1-dir', "test-#{@char_1}.txt"])[:param],
:repository_id => @repository.id,
:path => repository_path_hash(['latin-1-dir', "test-Ü.txt"])[:param],
:rev => r1
}
assert_select 'tr#L1 td.line-code', :text => /test-#{@char_1}.txt/
assert_select 'tr#L1 td.line-code', :text => /test-Ü.txt/
end
end
end
@ -492,12 +510,13 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
with_settings :default_language => "en" do
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r
}
assert_response :success
assert_select 'title',
:text => 'Revision 1:9d5b5b004199 - Added 2 files and modified one. - eCookbook Subproject 1 - Redmine'
end
end
end
end
@ -509,6 +528,7 @@ class RepositoriesMercurialControllerTest < Redmine::ControllerTest
['', ' ', nil].each do |r|
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r
}
assert_response 404

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -17,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class RepositoriesSubversionControllerTest < Redmine::ControllerTest
class RepositoriesSubversionControllerTest < Redmine::RepositoryControllerTest
tests RepositoriesController
fixtures :projects, :users, :email_addresses, :roles, :members, :member_roles, :enabled_modules,
@ -28,6 +30,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
NUM_REV = 11
def setup
super
Setting.default_language = 'en'
User.current = nil
@ -64,7 +67,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_select 'table.entries tbody' do
assert_select 'tr', 1
assert_select 'tr.dir td.filename a', :text => 'subversion_test'
assert_select 'tr.dir td.filename a[href=?]', '/projects/subproject1/repository/show/subversion_test'
assert_select 'tr.dir td.filename a[href=?]', "/projects/subproject1/repository/#{@repository.id}/show/subversion_test"
end
assert_select 'table.changesets tbody' do
@ -75,7 +78,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_select 'input[name=rev]'
assert_select 'a', :text => 'Statistics'
assert_select 'a', :text => 'Atom'
assert_select 'a[href=?]', '/projects/subproject1/repository', :text => 'root'
assert_select 'a[href=?]', "/projects/subproject1/repository/#{@repository.id}", :text => 'root'
end
def test_show_non_default
@ -101,6 +104,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test'])[:param]
}
assert_response :success
@ -124,6 +128,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :show, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test'])[:param],
:rev => 4
}
@ -146,6 +151,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :changes, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'folder', 'helloworld.rb'])[:param]
}
assert_response :success
@ -173,6 +179,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :changes, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'folder'])[:param]
}
assert_response :success
@ -195,6 +202,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
}
assert_response :success
@ -211,6 +219,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
with_settings :file_max_size_displayed => 0 do
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
}
assert_response :success
@ -222,10 +231,11 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
def test_entry_should_display_images
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'folder', 'subfolder', 'rubylogo.gif'])[:param]
}
assert_response :success
assert_select 'img[src=?]', '/projects/subproject1/repository/raw/subversion_test/folder/subfolder/rubylogo.gif'
assert_select 'img[src=?]', "/projects/subproject1/repository/#{@repository.id}/raw/subversion_test/folder/subfolder/rubylogo.gif"
end
def test_entry_at_given_revision
@ -235,6 +245,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'helloworld.rb'])[:param],
:rev => 2
}
@ -250,6 +261,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'zzz.c'])[:param]
}
assert_select 'p#errorExplanation', :text => /The entry or revision was not found in the repository/
@ -262,6 +274,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :raw, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
}
assert_response :success
@ -275,6 +288,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :entry, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'folder'])[:param]
}
assert_response :success
@ -286,6 +300,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
def test_revision
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 2
}
assert_response :success
@ -293,9 +308,9 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
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'
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/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'
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/revisions/2/diff/test/some/path/in/the/repo'
end
end
end
@ -307,6 +322,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 'something_weird'
}
assert_response 404
@ -316,6 +332,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
def test_invalid_revision_diff
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => '1',
:rev_to => 'something_weird'
}
@ -331,6 +348,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
['', ' ', nil].each do |r|
get :revision, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => r
}
assert_response 404
@ -346,6 +364,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
get :revision, :params => {
:id => 1,
:repository_id => 10,
:rev => 2
}
assert_response :success
@ -353,9 +372,9 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
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'
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/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'
assert_select 'a[href=?]', '/projects/ecookbook/repository/10/revisions/2/diff/path/in/the/repo'
end
end
end
@ -368,6 +387,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 3,
:type => dt
}
@ -385,6 +405,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 5,
:format => 'diff'
}
@ -401,6 +422,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
['inline', 'sbs'].each do |dt|
get :diff, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 6,
:rev_to => 2,
:path => repository_path_hash(['subversion_test', 'folder'])[:param],
@ -423,6 +445,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
}
assert_response :success
@ -448,6 +471,7 @@ class RepositoriesSubversionControllerTest < Redmine::ControllerTest
assert_equal NUM_REV, @repository.changesets.count
get :annotate, :params => {
:id => PRJ_ID,
:repository_id => @repository.id,
:rev => 8,
:path => repository_path_hash(['subversion_test', 'helloworld.c'])[:param]
}

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -35,6 +37,24 @@ class RolesControllerTest < Redmine::ControllerTest
end
end
def test_index_should_show_warning_when_no_workflow_is_defined
Role.find_by_name('Developer').workflow_rules.destroy_all
Role.find_by_name('Anonymous').workflow_rules.destroy_all
get :index
assert_response :success
assert_select 'table.roles' do
# Manager
assert_select 'tr.givable:nth-of-type(1) span.icon-warning', :count => 0
# Developer
assert_select 'tr.givable:nth-of-type(2) span.icon-warning', :text => /#{I18n.t(:text_role_no_workflow)}/
# Reporter
assert_select 'tr.givable:nth-of-type(3) span.icon-warning', :count => 0
# No warnings for built-in roles such as Anonymous and Non-member
assert_select 'tr.builtin span.icon-warning', :count => 0
end
end
def test_new
get :new
assert_response :success
@ -138,6 +158,7 @@ class RolesControllerTest < Redmine::ControllerTest
assert_select 'input[name=?][value=?]', 'role[name]', 'Manager'
assert_select 'select[name=?]', 'role[issues_visibility]'
assert_select '#role-permissions-trackers table .delete_issues_shown'
end
def test_edit_anonymous
@ -146,6 +167,7 @@ class RolesControllerTest < Redmine::ControllerTest
assert_select 'input[name=?]', 'role[name]', 0
assert_select 'select[name=?]', 'role[issues_visibility]', 0
assert_select '#role-permissions-trackers table .delete_issues_shown', 0
end
def test_edit_invalid_should_respond_with_404
@ -202,11 +224,11 @@ class RolesControllerTest < Redmine::ControllerTest
def test_destroy_role_in_use
delete :destroy, :params => {:id => 1}
assert_redirected_to '/roles'
assert_equal 'This role is in use and cannot be deleted.', flash[:error]
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
def test_permissions
get :permissions
assert_response :success
@ -214,10 +236,20 @@ class RolesControllerTest < Redmine::ControllerTest
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]'
end
def test_post_permissions
post :permissions, :params => {
def test_permissions_with_filter
get :permissions, :params => {
:ids => ['2', '3']
}
assert_response :success
assert_select 'table.permissions thead th', 3
assert_select 'input[name=?][type=checkbox][value=add_issues][checked=checked]', 'permissions[3][]'
assert_select 'input[name=?][type=checkbox][value=delete_issues]:not([checked])', 'permissions[3][]'
end
def test_update_permissions
post :update_permissions, :params => {
:permissions => {
'0' => '',
'1' => ['edit_issues'],
'3' => ['add_issues', 'delete_issues']
}
@ -226,13 +258,18 @@ class RolesControllerTest < Redmine::ControllerTest
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, :params => {:permissions => { '0' => '' }}
assert_redirected_to '/roles'
assert Role.find(1).permissions.empty?
def test_update_permissions_should_not_update_other_roles
assert_no_changes -> { Role.find(2).permissions } do
assert_changes -> { Role.find(1).permissions } do
post :update_permissions, :params => {
:permissions => {
'1' => ['edit_issues']
}
}
end
end
end
def test_move_highest

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -42,10 +44,10 @@ class SearchControllerTest < Redmine::ControllerTest
assert_select '#search-results dt.project a', :text => /eCookbook/
end
def test_search_on_archived_project_should_return_404
def test_search_on_archived_project_should_return_403
Project.find(3).archive
get :index, :params => {:id => 3}
assert_response 404
assert_response 403
end
def test_search_on_invisible_project_by_user_should_be_denied
@ -408,7 +410,7 @@ class SearchControllerTest < Redmine::ControllerTest
end
def test_results_should_be_escaped_once
assert Issue.find(1).update_attributes(:subject => '<subject> escaped_once', :description => '<description> escaped_once')
assert Issue.find(1).update(:subject => '<subject> escaped_once', :description => '<description> escaped_once')
get :index, :params => {:q => 'escaped_once'}
assert_response :success
assert_select '#search-results' do
@ -418,7 +420,7 @@ class SearchControllerTest < Redmine::ControllerTest
end
def test_keywords_should_be_highlighted
assert Issue.find(1).update_attributes(:subject => 'subject highlighted', :description => 'description highlighted')
assert Issue.find(1).update(:subject => 'subject highlighted', :description => 'description highlighted')
get :index, :params => {:q => 'highlighted'}
assert_response :success
assert_select '#search-results' do

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -29,7 +31,8 @@ class SearchCustomFieldsVisibilityTest < Redmine::ControllerTest
:projects_trackers,
:enabled_modules,
:enumerations,
:workflows
:workflows,
:custom_fields, :custom_fields_trackers
def setup
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :searchable => true, :trackers => Tracker.all}
@ -56,7 +59,7 @@ class SearchCustomFieldsVisibilityTest < Redmine::ControllerTest
}
Member.where(:project_id => 1).each do |member|
member.destroy unless @users_to_test.keys.include?(member.principal)
member.destroy unless @users_to_test.key?(member.principal)
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -19,7 +21,7 @@ require File.expand_path('../../test_helper', __FILE__)
class SettingsControllerTest < Redmine::ControllerTest
fixtures :projects, :trackers, :issue_statuses, :issues,
:users
:users, :email_addresses
def setup
User.current = nil
@ -194,11 +196,11 @@ class SettingsControllerTest < Redmine::ControllerTest
assert_nil (mail = ActionMailer::Base.deliveries.last)
end
def test_get_plugin_settings
ActionController::Base.append_view_path(File.join(Rails.root, "test/fixtures/plugins"))
Redmine::Plugin.register :foo do
settings :partial => "foo_plugin/foo_plugin_settings"
directory 'test/fixtures/plugins/foo_plugin'
end
Setting.plugin_foo = {'sample_setting' => 'Plugin setting value'}
@ -218,7 +220,9 @@ class SettingsControllerTest < Redmine::ControllerTest
end
def test_get_non_configurable_plugin_settings
Redmine::Plugin.register(:foo) {}
Redmine::Plugin.register(:foo) do
directory 'test/fixtures/plugins/foo_plugin'
end
get :plugin, :params => {:id => 'foo'}
assert_response 404
@ -231,6 +235,7 @@ class SettingsControllerTest < Redmine::ControllerTest
Redmine::Plugin.register(:foo) do
settings :partial => 'not blank', # so that configurable? is true
:default => {'sample_setting' => 'Plugin setting value'}
directory 'test/fixtures/plugins/foo_plugin'
end
post :plugin, :params => {
@ -246,6 +251,7 @@ class SettingsControllerTest < Redmine::ControllerTest
Redmine::Plugin.register(:foo) do
settings :partial => 'not blank', # so that configurable? is true
:default => {'sample_setting' => 'Plugin setting value'}
directory 'test/fixtures/plugins/foo_plugin'
end
post :plugin, :params => {
@ -257,7 +263,9 @@ class SettingsControllerTest < Redmine::ControllerTest
end
def test_post_non_configurable_plugin_settings
Redmine::Plugin.register(:foo) {}
Redmine::Plugin.register(:foo) do
directory 'test/fixtures/plugins/foo_plugin'
end
post :plugin, :params => {
:id => 'foo',

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -24,10 +25,15 @@ class TimelogControllerTest < Redmine::ControllerTest
:trackers, :enumerations, :issue_statuses,
:custom_fields, :custom_values,
:projects_trackers, :custom_fields_trackers,
:custom_fields_projects
:custom_fields_projects, :issue_categories, :versions
include Redmine::I18n
def setup
super
Setting.default_language = 'en'
end
def test_new
@request.session[:user_id] = 3
get :new
@ -40,6 +46,8 @@ class TimelogControllerTest < Redmine::ControllerTest
# blank option for project
assert_select 'option[value=""]'
end
assert_select 'label[for=?]', 'time_entry_user_id', 0
assert_select 'select[name=?]', 'time_entry[user_id]', 0
end
def test_new_with_project_id
@ -97,6 +105,40 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select 'option', :text => 'Inactive Activity', :count => 0
end
def test_new_should_show_user_select_if_user_has_permission
Role.find_by_name('Manager').add_permission! :log_time_for_other_users
@request.session[:user_id] = 2
get :new, :params => {:project_id => 1}
assert_response :success
assert_select 'select[name=?]', 'time_entry[user_id]' do
assert_select 'option', 3
assert_select 'option[value=?]', '2', 2
assert_select 'option[value=?]', '3', 1
# locked members should not be available
assert_select 'option[value=?]', '4', 0
end
end
def test_new_user_select_should_include_current_user_if_is_logged
@request.session[:user_id] = 1
get :new, :params => {:project_id => 1}
assert_response :success
assert_select 'select[name=?]', 'time_entry[user_id]' do
assert_select 'option[value=?]', '1', :text => '<< me >>'
assert_select 'option[value=?]', '1', :text => 'Redmine Admin'
end
end
def test_new_should_not_show_user_select_if_user_does_not_have_permission
@request.session[:user_id] = 2
get :new, :params => {:project_id => 1}
assert_response :success
assert_select 'select[name=?]', 'time_entry[user_id]', 0
end
def test_post_new_as_js_should_update_activity_options
@request.session[:user_id] = 3
post :new, :params => {:time_entry => {:project_id => 1}, :format => 'js'}
@ -110,6 +152,11 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_response :success
assert_select 'form[action=?]', '/time_entries/2'
# Time entry user should be shown as text
# for user without permission to log time for other users
assert_select 'label[for=?]', 'time_entry_user_id', 1
assert_select 'a.user.active', :text => 'Redmine Admin'
end
def test_get_edit_with_an_existing_time_entry_with_inactive_activity
@ -133,6 +180,56 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select 'select[name=?]', 'time_entry[project_id]'
end
def test_get_edit_should_validate_back_url
@request.session[:user_id] = 2
get :edit, :params => {:id => 2, :project_id => nil, :back_url => '/valid'}
assert_response :success
assert_select 'a[href=?]', '/valid', {:text => 'Cancel'}
get :edit, :params => {:id => 2, :project_id => nil, :back_url => 'invalid'}
assert_response :success
assert_select 'a[href=?]', 'invalid', {:text => 'Cancel', :count => 0}
assert_select 'a[href=?]', '/projects/ecookbook/time_entries', {:text => 'Cancel'}
end
def test_get_edit_with_an_existing_time_entry_with_locked_user
user = User.find(3)
entry = TimeEntry.generate!(:user_id => user.id, :comments => "Time entry on a future locked user")
entry.save!
user.status = User::STATUS_LOCKED
user.save!
Role.find_by_name('Manager').add_permission! :log_time_for_other_users
@request.session[:user_id] = 2
get :edit, :params => {
:id => entry.id
}
assert_response :success
assert_select 'select[name=?]', 'time_entry[user_id]' do
# User with id 3 should be selected even if it's locked
assert_select 'option[value="3"][selected=selected]'
end
end
def test_get_edit_for_other_user
Role.find_by_name('Manager').add_permission! :log_time_for_other_users
@request.session[:user_id] = 2
get :edit, :params => {
:id => 1
}
assert_response :success
assert_select 'select[name=?]', 'time_entry[user_id]' do
assert_select 'option[value="2"][selected=selected]'
end
end
def test_post_create
@request.session[:user_id] = 3
assert_difference 'TimeEntry.count' do
@ -263,6 +360,49 @@ class TimelogControllerTest < Redmine::ControllerTest
assert !response.body.include?('issue_that_is_not_visible')
end
def test_create_for_other_user
Role.find_by_name('Manager').add_permission! :log_time_for_other_users
@request.session[:user_id] = 2
post :create, :params => {
: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',
:user_id => '3'
}
}
assert_redirected_to '/projects/ecookbook/time_entries'
t = TimeEntry.last
assert_equal 3, t.user_id
assert_equal 2, t.author_id
end
def test_create_for_other_user_should_fail_without_permission
Role.find_by_name('Manager').remove_permission! :log_time_for_other_users
@request.session[:user_id] = 2
post :create, :params => {
: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',
:user_id => '3'
}
}
assert_response :success
assert_select_error /User is invalid/
end
def test_create_and_continue_at_project_level
@request.session[:user_id] = 2
assert_difference 'TimeEntry.count' do
@ -528,6 +668,41 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select_error /Issue is invalid/
end
def test_update_should_fail_when_changing_user_without_permission
Role.find_by_name('Manager').remove_permission! :log_time_for_other_users
@request.session[:user_id] = 2
put :update, :params => {
:id => 3,
:time_entry => {
:user_id => '3'
}
}
assert_response :success
assert_select_error /User is invalid/
end
def test_update_should_allow_updating_existing_entry_logged_on_a_locked_user
entry = TimeEntry.generate!(:user_id => 2, :hours => 4, :comments => "Time entry on a future locked user")
Role.find_by_name('Manager').add_permission! :log_time_for_other_users
@request.session[:user_id] = 2
put :update, :params => {
:id => entry.id,
:time_entry => {
:hours => '6'
}
}
assert_response :redirect
entry.reload
# Ensure user didn't change
assert_equal 2, entry.user_id
assert_equal 6.0, entry.hours
end
def test_get_bulk_edit
@request.session[:user_id] = 2
@ -536,10 +711,15 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select 'ul#bulk-selection' do
assert_select 'li', 2
assert_select 'li a', :text => '03/23/2007 - eCookbook: 4.25 hours'
assert_select 'li a', :text => '03/23/2007 - eCookbook: 4.25 hours (John Smith)'
end
assert_select 'form#bulk_edit_form[action=?]', '/time_entries/bulk_update' do
assert_select 'select[name=?]', 'time_entry[project_id]'
# Clear issue checkbox
assert_select 'input[name=?][value=?]', 'time_entry[issue_id]', 'none'
# System wide custom field
assert_select 'select[name=?]', 'time_entry[custom_field_values][10]'
@ -558,6 +738,34 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_response :success
end
def test_get_bulk_edit_on_different_projects_should_propose_only_common_activites
project = Project.find(3)
TimeEntryActivity.create!(:name => 'QA', :project => project, :parent => TimeEntryActivity.find_by_name('QA'), :active => false)
@request.session[:user_id] = 1
get :bulk_edit, :params => {:ids => [1, 2, 4]}
assert_response :success
assert_select 'select[id=?]', 'time_entry_activity_id' do
assert_select 'option', 3
assert_select 'option[value=?]', '11', 0, :text => 'QA'
end
end
def test_get_bulk_edit_on_same_project_should_propose_project_activities
project = Project.find(1)
override_activity = TimeEntryActivity.create!({:name => "QA override", :parent => TimeEntryActivity.find_by_name("QA"), :project => project})
@request.session[:user_id] = 1
get :bulk_edit, :params => {:ids => [1, 2]}
assert_response :success
assert_select 'select[id=?]', 'time_entry_activity_id' do
assert_select 'option', 4
assert_select 'option[value=?]', override_activity.id.to_s, :text => 'QA override'
end
end
def test_bulk_edit_with_edit_own_time_entries_permission
@request.session[:user_id] = 2
Role.find_by_name('Manager').remove_permission! :edit_time_entries
@ -705,6 +913,50 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_select '.total-for-hours', :text => 'Hours: 162.90'
assert_select 'form#query_form[action=?]', '/time_entries'
assert_equal ['Project', 'Date', 'User', 'Activity', 'Issue', 'Comment', 'Hours'], columns_in_list
assert_select '.query-totals>span', 1
end
def test_index_with_default_query_setting
with_settings :time_entry_list_defaults => {'column_names' => %w(spent_on issue user hours), 'totalable_names' => []} do
get :index
assert_response :success
end
assert_select 'table.time-entries thead' do
assert_select 'th.project'
assert_select 'th.spent_on'
assert_select 'th.issue'
assert_select 'th.user'
assert_select 'th.hours'
end
assert_select 'table.time-entries tbody' do
assert_select 'td.project'
assert_select 'td.spent_on'
assert_select 'td.issue'
assert_select 'td.user'
assert_select 'td.hours'
end
assert_equal ['Project', 'Date', 'Issue', 'User', 'Hours'], columns_in_list
end
def test_index_with_default_query_setting_using_custom_field
field = TimeEntryCustomField.create!(:name => 'Foo', :field_format => 'int')
with_settings :time_entry_list_defaults => {
'column_names' => ["spent_on", "user", "hours", "cf_#{field.id}"],
'totalable_names' => ["hours", "cf_#{field.id}"]
} do
get :index
assert_response :success
end
assert_equal ['Project', 'Date', 'User', 'Hours', 'Foo'], columns_in_list
assert_select '.total-for-hours'
assert_select ".total-for-cf-#{field.id}"
assert_select '.query-totals>span', 2
end
def test_index_all_projects_should_show_log_time_link
@ -852,9 +1104,9 @@ class TimelogControllerTest < Redmine::ControllerTest
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)
t1 = TimeEntry.create!(:author => User.find(1), :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!(:author => User.find(1), :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!(:author => User.find(1), :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, :params => {
:project_id => 1,
@ -904,6 +1156,25 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_equal [entry].map(&:id).map(&:to_s), css_select('input[name="ids[]"]').map {|e| e.attr('value')}
end
def test_index_with_project_status_filter
project = Project.find(3)
project.close
project.save
get :index, :params => {
:set_filter => 1,
:f => ['project.status'],
:op => {'project.status' => '='},
:v => {'project.status' => ['1']}
}
assert_response :success
time_entries = css_select('input[name="ids[]"]').map {|e| e.attr('value')}
assert_include '1', time_entries
assert_not_include '4', time_entries
end
def test_index_with_issue_status_column
issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :status_id => 4)
entry = TimeEntry.generate!(:issue => issue)
@ -912,6 +1183,8 @@ class TimelogControllerTest < Redmine::ControllerTest
:c => %w(project spent_on issue comments hours issue.status)
}
assert_response :success
assert_select 'th.issue-status'
assert_select 'td.issue-status', :text => issue.status.name
end
@ -976,6 +1249,97 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_equal Tracker.where(:id => [1, 2, 3]).sorted.pluck(:name), values
end
def test_index_with_issue_category_filter
get :index, :params => {
:project_id => 'ecookbook',
:f => ['issue.category_id'],
:op => {'issue.category_id' => '='},
:v => {'issue.category_id' => ['1']}
}
assert_response :success
assert_equal ['1', '2'], css_select('input[name="ids[]"]').map {|e| e.attr('value')}
end
def test_index_with_issue_category_column
get :index, :params => {
:project_id => 'ecookbook',
:c => %w(project spent_on issue comments hours issue.category)
}
assert_response :success
assert_select 'td.issue-category', :text => 'Printing'
end
def test_index_with_issue_fixed_version_column
issue = Issue.find(1)
issue.fixed_version = Version.find(3)
issue.save!
get :index, :params => {
:project_id => 'ecookbook',
:c => %w(project spent_on issue comments hours issue.fixed_version)
}
assert_response :success
assert_select 'td.issue-fixed_version', :text => '2.0'
end
def test_index_with_author_filter
get :index, :params => {
:project_id => 'ecookbook',
:f => ['author_id'],
:op => {'author_id' => '='},
:v => {'author_id' => ['2']}
}
assert_response :success
assert_equal ['1'], css_select('input[name="ids[]"]').map {|e| e.attr('value')}
end
def test_index_with_author_column
get :index, :params => {
:project_id => 'ecookbook',
:c => %w(project spent_on issue comments hours author)
}
assert_response :success
assert_select 'td.author', :text => 'Redmine Admin'
end
def test_index_with_issue_category_sort
issue = Issue.find(3)
issue.category_id = 2
issue.save!
get :index, :params => {
:c => ["hours", 'issue.category'],
:sort => 'issue.category'
}
assert_response :success
# Make sure that values are properly sorted
values = css_select("td.issue-category").map(&:text).reject(&:blank?)
assert_equal ['Printing', 'Printing', 'Recipes'], values
end
def test_index_with_issue_fixed_version_sort
issue = Issue.find(1)
issue.fixed_version = Version.find(3)
issue.save!
TimeEntry.generate!(:issue => Issue.find(12))
get :index, :params => {
:project_id => 'ecookbook',
:c => ["hours", 'issue.fixed_version'],
:sort => 'issue.fixed_version'
}
assert_response :success
# Make sure that values are properly sorted
values = css_select("td.issue-fixed_version").map(&:text).reject(&:blank?)
assert_equal ['1.0', '2.0', '2.0'], values
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)
@ -1024,7 +1388,7 @@ class TimelogControllerTest < Redmine::ControllerTest
:sort => field_name
}
assert_response :success
assert_select "th a.sort", :text => 'String Field'
assert_select "th.cf_#{field.id} a.sort", :text => 'String Field'
# Make sure that values are properly sorted
values = css_select("td.#{field_name}").map(&:text).reject(&:blank?)
@ -1096,7 +1460,7 @@ class TimelogControllerTest < Redmine::ControllerTest
with_settings :date_format => '%m/%d/%Y' do
get :index, :params => {:format => 'csv'}
assert_response :success
assert_equal 'text/csv; header=present', response.content_type
assert_equal 'text/csv', response.media_type
end
end
@ -1104,7 +1468,7 @@ class TimelogControllerTest < Redmine::ControllerTest
with_settings :date_format => '%m/%d/%Y' do
get :index, :params => {:project_id => 1, :format => 'csv'}
assert_response :success
assert_equal 'text/csv; header=present', response.content_type
assert_equal 'text/csv', response.media_type
end
end
@ -1117,4 +1481,46 @@ class TimelogControllerTest < Redmine::ControllerTest
assert_not_nil line
assert_include "#{issue.tracker} #1: #{issue.subject}", line
end
def test_index_csv_should_fill_issue_column_with_issue_id_if_issue_that_is_not_visible
@request.session[:user_id] = 3
issue = Issue.generate!(:author_id => 1, :is_private => true)
entry = TimeEntry.generate!(:issue => issue, :comments => "Issue column content test")
get :index, :params => {:format => 'csv'}
assert_not issue.visible?
line = response.body.split("\n").detect {|l| l.include?(entry.comments)}
assert_not_nil line
assert_not_include "#{issue.tracker} ##{issue.id}: #{issue.subject}", line
assert_include "##{issue.id}", line
end
def test_index_grouped_by_created_on
skip unless TimeEntryQuery.new.groupable_columns.detect {|c| c.name == :created_on}
get :index, :params => {
:set_filter => 1,
:group_by => 'created_on'
}
assert_response :success
assert_select 'tr.group span.name', :text => '03/23/2007' do
assert_select '+ span.count', :text => '2'
end
end
def test_index_with_inline_issue_long_text_custom_field_column
field = IssueCustomField.create!(:name => 'Long text', :field_format => 'text', :full_width_layout => '1',
:tracker_ids => [1], :is_for_all => true)
issue = Issue.find(1)
issue.custom_field_values = {field.id => 'This is a long text'}
issue.save!
get :index, :params => {
:set_filter => 1,
:c => ['subject', 'description', "issue.cf_#{field.id}"]
}
assert_response :success
assert_select "td.issue_cf_#{field.id}", :text => 'This is a long text'
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -20,48 +22,21 @@ require File.expand_path('../../test_helper', __FILE__)
class TimelogCustomFieldsVisibilityTest < Redmine::ControllerTest
tests TimelogController
fixtures :projects,
:users,
:users, :email_addresses,
:roles,
:members,
:member_roles,
:issue_statuses,
:issues, :issue_statuses,
:trackers,
:projects_trackers,
:enabled_modules,
:enumerations,
:workflows
def setup
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all}
@fields = []
@fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true)))
@fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2])))
@fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3])))
@issue = Issue.generate!(
:author_id => 1,
:project_id => 1,
:tracker_id => 1,
:custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'}
)
TimeEntry.generate!(:issue => @issue)
@user_with_role_on_other_project = User.generate!
User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3))
@users_to_test = {
User.find(1) => [@field1, @field2, @field3],
User.find(3) => [@field1, @field2],
@user_with_role_on_other_project => [@field1], # should see field1 only on Project 1
User.generate! => [@field1],
User.anonymous => [@field1]
}
Member.where(:project_id => 1).each do |member|
member.destroy unless @users_to_test.keys.include?(member.principal)
end
end
:time_entries, :enumerations,
:workflows,
:custom_fields, :custom_values, :custom_fields_trackers
def test_index_should_show_visible_custom_fields_only
prepare_test_data
@users_to_test.each do |user, fields|
@request.session[:user_id] = user.id
get :index, :params => {
@ -80,6 +55,8 @@ class TimelogCustomFieldsVisibilityTest < Redmine::ControllerTest
end
def test_index_as_csv_should_show_visible_custom_fields_only
prepare_test_data
@users_to_test.each do |user, fields|
@request.session[:user_id] = user.id
get :index, :params => {
@ -99,8 +76,11 @@ class TimelogCustomFieldsVisibilityTest < Redmine::ControllerTest
end
def test_index_with_partial_custom_field_visibility_should_show_visible_custom_fields_only
prepare_test_data
Issue.delete_all
TimeEntry.delete_all
CustomValue.delete_all
p1 = Project.generate!
p2 = Project.generate!
user = User.generate!
@ -127,4 +107,53 @@ class TimelogCustomFieldsVisibilityTest < Redmine::ControllerTest
assert_select 'td', :text => "ValueC"
assert_select 'td', :text => "ValueB", :count => 0
end
def test_edit_should_not_show_custom_fields_not_visible_for_user
time_entry_cf = TimeEntryCustomField.find(10)
time_entry_cf.visible = false
time_entry_cf.role_ids = [2]
time_entry_cf.save!
@request.session[:user_id] = 2
get :edit, :params => {
:id => 3,
:project_id => 1
}
assert_response :success
assert_select 'select#time_entry_custom_field_values_10', 0
end
private
def prepare_test_data
field_attributes = {:field_format => 'string', :is_for_all => true, :is_filter => true, :trackers => Tracker.all}
@fields = []
@fields << (@field1 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 1', :visible => true)))
@fields << (@field2 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 2', :visible => false, :role_ids => [1, 2])))
@fields << (@field3 = IssueCustomField.create!(field_attributes.merge(:name => 'Field 3', :visible => false, :role_ids => [1, 3])))
@issue = Issue.generate!(
:author_id => 1,
:project_id => 1,
:tracker_id => 1,
:custom_field_values => {@field1.id => 'Value0', @field2.id => 'Value1', @field3.id => 'Value2'}
)
TimeEntry.generate!(:issue => @issue)
@user_with_role_on_other_project = User.generate!
User.add_to_project(@user_with_role_on_other_project, Project.find(2), Role.find(3))
@users_to_test = {
User.find(1) => [@field1, @field2, @field3],
User.find(3) => [@field1, @field2],
@user_with_role_on_other_project => [@field1], # should see field1 only on Project 1
User.generate! => [@field1],
User.anonymous => [@field1]
}
Member.where(:project_id => 1).each do |member|
member.destroy unless @users_to_test.key?(member.principal)
end
end
end

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -18,7 +19,7 @@
require File.expand_path('../../test_helper', __FILE__)
class TimeEntryReportsControllerTest < Redmine::ControllerTest
class TimelogReportTest < Redmine::ControllerTest
tests TimelogController
fixtures :projects, :enabled_modules, :roles, :members, :member_roles,
@ -37,6 +38,18 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
def test_report_at_project_level
get :report, :params => {:project_id => 'ecookbook'}
assert_response :success
# query form
assert_select 'form#query_form' do
assert_select 'div#query_form_with_buttons.hide-when-print' do
assert_select 'div#query_form_content' do
assert_select 'fieldset#filters.collapsible'
assert_select 'fieldset#options'
end
assert_select 'p.buttons'
end
end
assert_select 'form#query_form[action=?]', '/projects/ecookbook/time_entries/report'
end
@ -59,6 +72,7 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
get :report, :params => {:columns => 'week', :from => "2007-04-01", :to => "2007-04-30", :criteria => ['project']}
assert_response :success
assert_select 'tr.total td:last', :text => '8.65'
assert_select 'tr td.name a[href=?]', '/projects/ecookbook', :text => 'eCookbook'
end
def test_report_all_time
@ -86,6 +100,20 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
assert_select 'tr.total td:last', :text => '162.90'
end
def test_report_should_show_locked_users
@request.session[:user_id] = 1
user = User.find(2)
user.status = User::STATUS_LOCKED
user.save
get :report, :params => {:project_id => 1, :columns => 'month', :criteria => ["user", "activity"]}
assert_response :success
assert_select 'td.name a.user.active[href=?]', '/users/1', 1, :text => 'Redmine Admin'
assert_select 'td.name a.user.locked[href=?]', '/users/2', 1, :text => 'John Smith'
end
def test_report_custom_field_criteria_with_multiple_values_on_single_value_custom_field_should_not_fail
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)
@ -108,6 +136,18 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
end
end
def test_hidden_custom_fields_should_not_be_proposed
TimeEntryCustomField.create!(name: 'shown', field_format: 'list', possible_values: ['value1', 'value2'], visible: true)
TimeEntryCustomField.create!(name: 'Hidden', field_format: 'list', possible_values: ['value1', 'value2'], visible: false, role_ids: [3])
get :report, :params => {:project_id => 1}
assert_response :success
assert_select 'select[name=?]', 'criteria[]' do
assert_select 'option', :text => 'Shown'
assert_select 'option', :text => 'Hidden', :count => 0
end
end
def test_report_one_day
get :report, :params => {:project_id => 1, :columns => 'day', :from => "2007-03-23", :to => "2007-03-23", :criteria => ["user", "activity"]}
assert_response :success
@ -193,7 +233,7 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
:format => "csv"
}
assert_response :success
assert_equal 'text/csv; header=present', @response.content_type
assert_equal 'text/csv', @response.media_type
lines = @response.body.chomp.split("\n")
# Headers
assert_equal 'Project,User,Activity,2007-3,2007-4,Total time', lines.first
@ -207,23 +247,37 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
:columns => 'month',
:from => "2007-01-01",
:to => "2007-06-30",
:criteria => ["project", "user", "activity"],
:criteria => ["project", "user", "cf_10"],
:format => "csv"
}
assert_response :success
assert_equal 'text/csv; header=present', @response.content_type
assert_equal 'text/csv', @response.media_type
lines = @response.body.chomp.split("\n")
# Headers
assert_equal 'Project,User,Activity,2007-3,2007-4,Total time', lines.first
assert_equal 'Project,User,Overtime,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_should_fill_issue_criteria_with_tracker_id_and_subject
get :report, :params => {
:project_id => 1,
:columns => 'month',
:from => "2007-01-01",
:to => "2007-06-30",
:criteria => ["issue"],
:format => "csv"
}
assert_response :success
lines = @response.body.chomp.split("\n")
assert lines.detect {|line| line.include?('Bug #1: Cannot print recipes')}
end
def test_csv_big_5
str_utf8 = "\xe4\xb8\x80\xe6\x9c\x88".force_encoding('UTF-8')
str_big5 = "\xa4@\xa4\xeb".force_encoding('Big5')
str_big5 = (+"\xa4@\xa4\xeb").force_encoding('Big5')
user = User.find_by_id(3)
user.firstname = str_utf8
user.firstname = "一月"
user.lastname = "test-lastname"
assert user.save
comments = "test_csv_big_5"
@ -250,27 +304,25 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
}
end
assert_response :success
assert_equal 'text/csv; header=present', @response.content_type
lines = @response.body.chomp.split("\n")
assert_equal 'text/csv', @response.media_type
lines = @response.body.chomp.split("\n")
# Headers
s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp".force_encoding('Big5')
s2 = "\xa4u\xae\xc9\xc1`\xadp".force_encoding('Big5')
s1 = (+"\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp").force_encoding('Big5')
s2 = (+"\xa4u\xae\xc9\xc1`\xadp").force_encoding('Big5')
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)".force_encoding('UTF-8')
assert_equal str_tw, l(:general_lang_name)
assert_equal 'Chinese/Traditional (繁體中文)', 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
str_utf8 = "\xe4\xbb\xa5\xe5\x86\x85".force_encoding('UTF-8')
user = User.find_by_id(3)
user.firstname = str_utf8
user.firstname = "以内"
user.lastname = "test-lastname"
assert user.save
comments = "test_replaced"
@ -297,13 +349,13 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
}
end
assert_response :success
assert_equal 'text/csv; header=present', @response.content_type
lines = @response.body.chomp.split("\n")
assert_equal 'text/csv', @response.media_type
lines = @response.body.chomp.split("\n")
# Headers
s1 = "\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp".force_encoding('Big5')
s1 = (+"\xa5\xce\xa4\xe1,2011-11-11,\xa4u\xae\xc9\xc1`\xadp").force_encoding('Big5')
assert_equal s1, lines.first
# Total row
s2 = "\xa5H?".force_encoding('Big5')
s2 = (+"\xa5H?").force_encoding('Big5')
assert_equal "#{s2} #{user.lastname},7.30,7.30", lines[1]
end
@ -332,18 +384,17 @@ class TimeEntryReportsControllerTest < Redmine::ControllerTest
:format => "csv"
}
assert_response :success
assert_equal 'text/csv; header=present', @response.content_type
lines = @response.body.chomp.split("\n")
assert_equal 'text/csv', @response.media_type
lines = @response.body.chomp.split("\n")
# Headers
s1 = "Utilisateur;2011-11-11;Temps total".force_encoding('ISO-8859-1')
s2 = "Temps total".force_encoding('ISO-8859-1')
s1 = (+"Utilisateur;2011-11-11;Temps total").force_encoding('ISO-8859-1')
s2 = (+"Temps total").force_encoding('ISO-8859-1')
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 = "French (Fran\xc3\xa7ais)".force_encoding('UTF-8')
assert_equal str_fr, l(:general_lang_name)
assert_equal 'French (Français)', 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)

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -47,6 +49,9 @@ class TrackersControllerTest < Redmine::ControllerTest
get :new
assert_response :success
assert_select 'input[name=?]', 'tracker[name]'
assert_select 'select[name=?]', 'tracker[default_status_id]' do
assert_select 'option[value=?][selected=selected]', IssueStatus.sorted.first.id.to_s
end
end
def test_create

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -64,11 +66,55 @@ class UsersControllerTest < Redmine::ControllerTest
end
end
def test_index_csv
with_settings :default_language => 'en' do
get :index, :params => { :format => 'csv' }
assert_response :success
assert_equal User.logged.status(1).count, response.body.chomp.split("\n").size - 1
assert_include 'active', response.body
assert_not_include 'locked', response.body
assert_equal 'text/csv', @response.media_type
end
end
def test_index_csv_with_status_filter
with_settings :default_language => 'en' do
get :index, :params => { :status => 3, :format => 'csv' }
assert_response :success
assert_equal User.logged.status(3).count, response.body.chomp.split("\n").size - 1
assert_include 'locked', response.body
assert_not_include 'active', response.body
assert_equal 'text/csv', @response.media_type
end
end
def test_index_csv_with_name_filter
get :index, :params => {:name => 'John', :format => 'csv'}
assert_response :success
assert_equal User.logged.like('John').count, response.body.chomp.split("\n").size - 1
assert_include 'John', response.body
assert_equal 'text/csv', @response.media_type
end
def test_index_csv_with_group_filter
get :index, :params => {:group_id => '10', :format => 'csv'}
assert_response :success
assert_equal Group.find(10).users.count, response.body.chomp.split("\n").size - 1
assert_equal 'text/csv', @response.media_type
end
def test_show
@request.session[:user_id] = nil
get :show, :params => {:id => 2}
assert_response :success
assert_select 'h2', :text => /John Smith/
# groups block should not be rendeder for users which are not part of any group
assert_select 'div#groups', 0
end
def test_show_should_display_visible_custom_fields
@ -77,7 +123,7 @@ class UsersControllerTest < Redmine::ControllerTest
get :show, :params => {:id => 2}
assert_response :success
assert_select 'li', :text => /Phone number/
assert_select 'li[class=?]', 'cf_4', :text => /Phone number/
end
def test_show_should_not_display_hidden_custom_fields
@ -127,8 +173,20 @@ class UsersControllerTest < Redmine::ControllerTest
get :show, :params => {:id => 2}
assert_response :success
# membership of private project admin can see
assert_select 'li a', :text => "OnlineStore"
assert_select 'table.list.projects>tbody' do
assert_select 'tr:nth-of-type(1)' do
assert_select 'td:nth-of-type(1)>span>a', :text => 'eCookbook'
assert_select 'td:nth-of-type(2)', :text => 'Manager'
end
assert_select 'tr:nth-of-type(2)' do
assert_select 'td:nth-of-type(1)>span>a', :text => 'Private child of eCookbook'
assert_select 'td:nth-of-type(2)', :text => 'Manager'
end
assert_select 'tr:nth-of-type(3)' do
assert_select 'td:nth-of-type(1)>span>a', :text => 'OnlineStore'
assert_select 'td:nth-of-type(2)', :text => 'Developer'
end
end
end
def test_show_current_should_require_authentication
@ -144,6 +202,37 @@ class UsersControllerTest < Redmine::ControllerTest
assert_select 'h2', :text => /John Smith/
end
def test_show_issues_counts
@request.session[:user_id] = 2
get :show, :params => {:id => 2}
assert_select 'table.list.issue-report>tbody' do
assert_select 'tr:nth-of-type(1)' do
assert_select 'td:nth-of-type(1)>a', :text => 'Assigned issues'
assert_select 'td:nth-of-type(2)>a', :text => '1' # open
assert_select 'td:nth-of-type(3)>a', :text => '0' # closed
assert_select 'td:nth-of-type(4)>a', :text => '1' # total
end
assert_select 'tr:nth-of-type(2)' do
assert_select 'td:nth-of-type(1)>a', :text => 'Reported issues'
assert_select 'td:nth-of-type(2)>a', :text => '11' # open
assert_select 'td:nth-of-type(3)>a', :text => '2' # closed
assert_select 'td:nth-of-type(4)>a', :text => '13' # total
end
end
end
def test_show_user_should_list_user_groups
@request.session[:user_id] = 1
get :show, :params => {:id => 8}
assert_select 'div#groups', 1 do
assert_select 'h3', :text => 'Groups'
assert_select 'li', 2
assert_select 'a[href=?]', '/groups/10/edit', :text => 'A Team'
assert_select 'a[href=?]', '/groups/11/edit', :text => 'B Team'
end
end
def test_new
get :new
assert_response :success
@ -203,7 +292,8 @@ class UsersControllerTest < Redmine::ControllerTest
'time_zone' => 'Paris',
'comments_sorting' => 'desc',
'warn_on_leaving_unsaved' => '0',
'textarea_font' => 'proportional'
'textarea_font' => 'proportional',
'history_default_tab' => 'history'
}
}
end
@ -214,6 +304,7 @@ class UsersControllerTest < Redmine::ControllerTest
assert_equal 'desc', user.pref[:comments_sorting]
assert_equal '0', user.pref[:warn_on_leaving_unsaved]
assert_equal 'proportional', user.pref[:textarea_font]
assert_equal 'history', user.pref[:history_default_tab]
end
def test_create_with_generate_password_should_email_the_password
@ -259,7 +350,7 @@ class UsersControllerTest < Redmine::ControllerTest
def test_create_with_failure
assert_no_difference 'User.count' do
post :create, :params => {:user => {}}
post :create, :params => {:user => {:login => 'foo'}}
end
assert_response :success
assert_select_error /Email cannot be blank/
@ -268,7 +359,9 @@ class UsersControllerTest < Redmine::ControllerTest
def test_create_with_failure_sould_preserve_preference
assert_no_difference 'User.count' do
post :create, :params => {
:user => {},
:user => {
:login => 'foo'
},
:pref => {
'no_self_notified' => '1',
'hide_mail' => '1',
@ -327,10 +420,12 @@ class UsersControllerTest < Redmine::ControllerTest
assert_nil ActionMailer::Base.deliveries.last
end
def test_edit
get :edit, :params => {:id => 2}
with_settings :gravatar_enabled => '1' do
get :edit, :params => {:id => 2}
end
assert_response :success
assert_select 'h2>a+img.gravatar'
assert_select 'input[name=?][value=?]', 'user[login]', 'jsmith'
end
@ -348,6 +443,14 @@ class UsersControllerTest < Redmine::ControllerTest
assert_response 404
end
def test_edit_user_with_full_text_formatting_custom_field_should_not_fail
field = UserCustomField.find(4)
field.update_attribute :text_formatting, 'full'
get :edit, :params => {:id => 2}
assert_response :success
end
def test_update
ActionMailer::Base.deliveries.clear
put :update, :params => {

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -34,7 +36,9 @@ class VersionsControllerTest < Redmine::ControllerTest
assert_response :success
# Version with no date set appears
assert_select 'h3', :text => Version.find(3).name
assert_select 'h3', :text => "#{Version.find(3).name}"
assert_select 'span[class=?]', 'badge badge-status-open', :text => 'open'
# Completed version doesn't appear
assert_select 'h3', :text => Version.find(1).name, :count => 0
@ -94,11 +98,70 @@ class VersionsControllerTest < Redmine::ControllerTest
end
end
def test_index_should_show_issue_assignee
with_settings :gravatar_enabled => '1' do
Issue.generate!(:project_id => 3, :fixed_version_id => 4, :assigned_to => User.find_by_login('jsmith'))
Issue.generate!(:project_id => 3, :fixed_version_id => 4)
get :index, :params => {:project_id => 3}
assert_response :success
assert_select 'table.related-issues' do
assert_select 'tr.issue', :count => 2 do
assert_select 'img.gravatar[title=?]', 'Assignee: John Smith', :count => 1
end
end
end
end
def test_show
get :show, :params => {:id => 2}
with_settings :gravatar_enabled => '0' do
get :show, :params => {:id => 2}
assert_response :success
assert_select 'h2', :text => /1.0/
assert_select 'span[class=?]', 'badge badge-status-locked', :text => 'locked'
# no issue avatar when gravatar is disabled
assert_select 'img.gravatar', :count => 0
end
end
def test_show_should_show_issue_assignee
with_settings :gravatar_enabled => '1' do
get :show, :params => {:id => 2}
assert_response :success
assert_select 'table.related-issues' do
assert_select 'tr.issue td.assigned_to', :count => 2 do
assert_select 'img.gravatar[title=?]', 'Assignee: Dave Lopper', :count => 1
end
end
end
end
def test_show_issue_calculations_should_take_into_account_only_visible_issues
issue_9 = Issue.find(9)
issue_9.fixed_version_id = 4
issue_9.estimated_hours = 3
issue_9.save!
issue_13 = Issue.find(13)
issue_13.fixed_version_id = 4
issue_13.estimated_hours = 2
issue_13.save!
@request.session[:user_id] = 7
get :show, :params => {:id => 4}
assert_response :success
assert_select 'h2', :text => /1.0/
assert_select 'p.progress-info' do
assert_select 'a', :text => '1 issue'
assert_select 'a', :text => '1 open'
end
assert_select '.time-tracking td.total-hours a:first-child', :text => '2.00 hours'
end
def test_show_should_link_to_spent_time_on_version
@ -126,6 +189,33 @@ class VersionsControllerTest < Redmine::ControllerTest
end
end
def test_show_should_round_down_progress_percentages
issue = Issue.find(12)
issue.estimated_hours = 40
issue.save!
with_settings :default_language => 'en' do
get :show, :params => {:id => 2}
assert_response :success
assert_select 'div.version-overview' do
assert_select 'table.progress-98' do
assert_select 'td[class=closed][title=?]', 'closed: 98%'
assert_select 'td[class=done][title=?]', '% Done: 99%'
end
assert_select 'p[class=percent]', :text => '99%'
end
end
end
def test_show_should_display_link_to_new_issue
@request.session[:user_id] = 1
get :show, :params => {:id => 3}
assert_response :success
assert_select 'a.icon.icon-add', :text => 'New issue'
end
def test_new
@request.session[:user_id] = 2
get :new, :params => {:project_id => '1'}

View file

@ -0,0 +1,79 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2019 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 VersionsCustomFieldsVisibilityTest < Redmine::ControllerTest
tests VersionsController
fixtures :projects,
:users, :email_addresses,
:roles,
:members,
:member_roles,
:issue_statuses,
:trackers,
:projects_trackers,
:enabled_modules,
:versions,
:custom_fields, :custom_values, :custom_fields_trackers
def test_show_should_display_only_custom_fields_visible_to_user
cf1 = VersionCustomField.create!(:name => 'cf1', :field_format => 'string')
cf2 = VersionCustomField.create!(:name => 'cf2', :field_format => 'string', :visible => false, :role_ids => [1])
cf3 = VersionCustomField.create!(:name => 'cf3', :field_format => 'string', :visible => false, :role_ids => [3])
version = Version.find(2)
version.custom_field_values = {cf1.id => 'Value1', cf2.id => 'Value2', cf3.id => 'Value3'}
version.save!
@request.session[:user_id] = 2
get :show, :params => {
:id => 2
}
assert_response :success
assert_select '#roadmap' do
assert_select 'span.label', :text => 'cf1:'
assert_select 'span.label', :text => 'cf2:'
assert_select 'span.label', {count: 0, text: 'cf3:'}
end
end
def test_edit_should_display_only_custom_fields_visible_to_user
cf1 = VersionCustomField.create!(:name => 'cf1', :field_format => 'string')
cf2 = VersionCustomField.create!(:name => 'cf2', :field_format => 'string', :visible => false, :role_ids => [1])
cf3 = VersionCustomField.create!(:name => 'cf3', :field_format => 'string', :visible => false, :role_ids => [3])
version = Version.find(2)
version.custom_field_values = {cf1.id => 'Value1', cf2.id => 'Value2', cf3.id => 'Value3'}
version.save!
@request.session[:user_id] = 2
get :edit, :params => {
:id => 2
}
assert_response :success
assert_select 'form.edit_version' do
assert_select 'input[id=?]', "version_custom_field_values_#{cf1.id}"
assert_select 'input[id=?]', "version_custom_field_values_#{cf2.id}"
assert_select 'input[id=?]', "version_custom_field_values_#{cf3.id}", 0
end
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -18,7 +20,7 @@
require File.expand_path('../../test_helper', __FILE__)
class WelcomeControllerTest < Redmine::ControllerTest
fixtures :projects, :news, :users, :members
fixtures :projects, :news, :users, :members, :roles, :member_roles, :enabled_modules
def setup
Setting.default_language = 'en'
@ -77,13 +79,6 @@ class WelcomeControllerTest < Redmine::ControllerTest
end
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'

View file

@ -1,7 +1,7 @@
# encoding: utf-8
#
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -36,7 +36,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_select 'h1', :text => /CookBook documentation/
# child_pages macro
assert_select 'ul.pages-hierarchy>li>a[href=?]', '/projects/ecookbook/wiki/Page_with_an_inline_image',
:text => 'Page with an inline image'
:text => 'Page with an inline image'
end
def test_export_link
@ -65,7 +65,6 @@ class WikiControllerTest < Redmine::ControllerTest
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
@ -77,7 +76,6 @@ class WikiControllerTest < Redmine::ControllerTest
get :show, :params => {:project_id => 'ecookbook', :id => page.title, :version => '1'}
assert_response :success
assert_select 'a[href=?]', '/projects/ecookbook/wiki/Page_with_an_inline_image', :text => /Current version/
end
def test_show_old_version_without_permission_should_be_denied
@ -96,7 +94,6 @@ class WikiControllerTest < Redmine::ControllerTest
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
@ -179,6 +176,16 @@ class WikiControllerTest < Redmine::ControllerTest
assert_select 'textarea[name=?]', 'content[text]'
end
def test_show_protected_page_shoud_show_locked_badge
@request.session[:user_id] = 2
get :show, :params => {:project_id => 1, :id => 'CookBook_documentation'}
assert_select 'p.wiki-update-info' do
assert_select 'span.badge.badge-status-locked'
end
end
def test_get_new
@request.session[:user_id] = 2
@ -210,6 +217,13 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'window.location = "/projects/ecookbook/wiki/New_Page"', response.body
end
def test_post_new_should_redirect_to_edit_with_parent
@request.session[:user_id] = 2
post :new, :params => {:project_id => 'ecookbook', :title => 'New_Page', :parent => 'Child_1'}
assert_redirected_to '/projects/ecookbook/wiki/New_Page?parent=Child_1'
end
def test_post_new_with_invalid_title_should_display_errors
@request.session[:user_id] = 2
@ -259,6 +273,7 @@ class WikiControllerTest < Redmine::ControllerTest
end
def test_create_page_with_attachments
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'WikiPage.count' do
assert_difference 'Attachment.count' do
@ -299,11 +314,9 @@ class WikiControllerTest < Redmine::ControllerTest
def test_edit_page
@request.session[:user_id] = 2
get :edit, :params => {:project_id => 'ecookbook', :id => 'Another_page'}
assert_response :success
assert_select 'textarea[name=?]', 'content[text]',
:text => WikiPage.find_by_title('Another_page').content.text
:text => WikiPage.find_by_title('Another_page').content.text
end
def test_edit_section
@ -331,7 +344,7 @@ class WikiControllerTest < Redmine::ControllerTest
@request.session[:user_id] = 2
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_difference 'WikiContent::Version.count' do
assert_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Another_page',
@ -356,7 +369,7 @@ class WikiControllerTest < Redmine::ControllerTest
@request.session[:user_id] = 2
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_difference 'WikiContent::Version.count' do
assert_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Another_page',
@ -383,7 +396,7 @@ class WikiControllerTest < Redmine::ControllerTest
@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_no_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Another_page',
@ -409,7 +422,7 @@ class WikiControllerTest < Redmine::ControllerTest
@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_no_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Another_page',
@ -429,10 +442,11 @@ class WikiControllerTest < Redmine::ControllerTest
end
def test_update_page_with_attachments_only_should_not_create_content_version
set_tmp_attachments_directory
@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_no_difference 'WikiContentVersion.count' do
assert_difference 'Attachment.count' do
put :update, :params => {
:project_id => 1,
@ -452,6 +466,44 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 1, page.content.version
end
def test_update_with_deleted_attachment_ids
@request.session[:user_id] = 2
page = WikiPage.find(4)
attachment = page.attachments.first
assert_difference 'Attachment.count', -1 do
put :update, :params => {
:project_id => page.wiki.project.id,
:id => page.title,
:content => {
:comments => 'delete file',
:text => 'edited'
},
:wiki_page => {:deleted_attachment_ids => [attachment.id]}
}
end
page.reload
refute_includes page.attachments, attachment
end
def test_update_with_deleted_attachment_ids_and_failure_should_preserve_selected_attachments
@request.session[:user_id] = 2
page = WikiPage.find(4)
attachment = page.attachments.first
assert_no_difference 'Attachment.count' do
put :update, :params => {
:project_id => page.wiki.project.id,
:id => page.title,
:content => {
:comments => 'a' * 1300, # failure here, comment is too long
:text => 'edited'
},
:wiki_page => {:deleted_attachment_ids => [attachment.id]}
}
end
page.reload
assert_includes page.attachments, attachment
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
@ -461,7 +513,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_no_difference 'WikiContent::Version.count' do
assert_no_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Another_page',
@ -509,7 +561,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_difference 'WikiContent::Version.count' do
assert_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Page_with_sections',
@ -535,7 +587,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_difference 'WikiContent::Version.count' do
assert_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Page_with_sections',
@ -560,7 +612,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_no_difference 'WikiPage.count' do
assert_no_difference 'WikiContent.count' do
assert_no_difference 'WikiContent::Version.count' do
assert_no_difference 'WikiContentVersion.count' do
put :update, :params => {
:project_id => 1,
:id => 'Page_with_sections',
@ -647,7 +699,7 @@ class WikiControllerTest < Redmine::ControllerTest
def test_diff
content = WikiPage.find(1).content
assert_difference 'WikiContent::Version.count', 2 do
assert_difference 'WikiContentVersion.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"
@ -695,11 +747,10 @@ class WikiControllerTest < Redmine::ControllerTest
assert_select 'td', :text => /h1\. CookBook documentation v2/
end
# Line 4
assert_select 'table.annotate tr:nth-child(4)' do
assert_select 'th.line-num', :text => '4'
# Line 2
assert_select 'table.annotate tr:nth-child(2)' do
assert_select 'th.line-num', :text => '2'
assert_select 'td.author', :text => /John Smith/
assert_select 'td', :text => /Line from v1/
end
# Line 5
@ -838,6 +889,25 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal project.wiki.id, page.wiki_id
end
def test_rename_as_start_page
@request.session[:user_id] = 2
post :rename, :params => {
:project_id => 'ecookbook',
:id => 'Another_page',
:wiki_page => {
:wiki_id => '1',
:title => 'Another_page',
:redirect_existing_links => '1',
:is_start_page => '1'
}
}
assert_redirected_to '/projects/ecookbook/wiki/Another_page'
wiki = Wiki.find(1)
assert_equal 'Another_page', wiki.start_page
end
def test_destroy_a_page_without_children_should_not_ask_confirmation
@request.session[:user_id] = 2
delete :destroy, :params => {:project_id => 1, :id => 'Child_2'}
@ -888,7 +958,7 @@ class WikiControllerTest < Redmine::ControllerTest
def test_destroy_version
@request.session[:user_id] = 2
assert_difference 'WikiContent::Version.count', -1 do
assert_difference 'WikiContentVersion.count', -1 do
assert_no_difference 'WikiContent.count' do
assert_no_difference 'WikiPage.count' do
delete :destroy_version, :params => {:project_id => 'ecookbook', :id => 'CookBook_documentation', :version => 2}
@ -900,7 +970,7 @@ class WikiControllerTest < Redmine::ControllerTest
def test_destroy_invalid_version_should_respond_with_404
@request.session[:user_id] = 2
assert_no_difference 'WikiContent::Version.count' do
assert_no_difference 'WikiContentVersion.count' do
assert_no_difference 'WikiContent.count' do
assert_no_difference 'WikiPage.count' do
delete :destroy_version, :params => {:project_id => 'ecookbook', :id => 'CookBook_documentation', :version => 99}
@ -1016,7 +1086,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'application/pdf', @response.content_type
assert_equal 'attachment; filename="CookBook_documentation.pdf"',
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
end
def test_show_html
@ -1026,7 +1096,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'text/html', @response.content_type
assert_equal 'attachment; filename="CookBook_documentation.html"',
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
assert_select 'h1', :text => /CookBook documentation/
end
@ -1037,7 +1107,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'text/html', @response.content_type
assert_equal 'attachment; filename="CookBook_documentation.html"',
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
assert_select 'h1', :text => /CookBook documentation v2/
end
@ -1048,7 +1118,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'text/plain', @response.content_type
assert_equal 'attachment; filename="CookBook_documentation.txt"',
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
assert_include 'h1. CookBook documentation', @response.body
end
@ -1059,7 +1129,7 @@ class WikiControllerTest < Redmine::ControllerTest
assert_equal 'text/plain', @response.content_type
assert_equal 'attachment; filename="CookBook_documentation.txt"',
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
assert_include 'h1. CookBook documentation v2', @response.body
end
@ -1069,17 +1139,17 @@ class WikiControllerTest < Redmine::ControllerTest
%w|pdf html txt|.each do |format|
# Non-MS browsers
@request.user_agent = ""
get :show, :project_id => 1, :id => title, :format => format
get :show, :params => {:project_id => 1, :id => title, :format => format}
assert_response :success
assert_equal "attachment; filename=\"#{title}.#{format}\"",
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
# Microsoft's browsers: filename should be URI encoded
@request.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063'
get :show, :project_id => 1, :id => title, :format => format
get :show, :params => {:project_id => 1, :id => title, :format => format}
assert_response :success
filename = URI.encode("#{title}.#{format}")
assert_equal "attachment; filename=\"#{filename}\"",
@response.headers['Content-Disposition']
@response.headers['Content-Disposition']
end
end
@ -1109,6 +1179,7 @@ class WikiControllerTest < Redmine::ControllerTest
end
def test_add_attachment
set_tmp_attachments_directory
@request.session[:user_id] = 2
assert_difference 'Attachment.count' do
post :add_attachment, :params => {
@ -1122,4 +1193,17 @@ class WikiControllerTest < Redmine::ControllerTest
attachment = Attachment.order('id DESC').first
assert_equal Wiki.find(1).find_page('CookBook_documentation'), attachment.container
end
def test_old_version_should_have_robot_exclusion_tag
@request.session[:user_id] = 2
# Discourage search engines from indexing old versions
get :show, :params => {:project_id => 'ecookbook', :id => 'CookBook_documentation', :version => '2'}
assert_response :success
assert_select 'head>meta[name="robots"][content=?]', 'noindex,follow,noarchive'
# No robots meta tag in the current version
get :show, :params => {:project_id => 'ecookbook', :id => 'CookBook_documentation'}
assert_response :success
assert_select 'head>meta[name="robots"]', false
end
end

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -24,48 +26,8 @@ class WikisControllerTest < Redmine::ControllerTest
User.current = nil
end
def test_create
@request.session[:user_id] = 1
assert_nil Project.find(3).wiki
assert_difference 'Wiki.count' do
post :edit, :params => {:id => 3, :wiki => { :start_page => 'Start page' }}, :xhr => true
assert_response :success
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
post :edit, :params => {:id => 3, :wiki => { :start_page => '' }}, :xhr => true
assert_response :success
assert_equal 'text/javascript', response.content_type
end
assert_include 'errorExplanation', response.body
assert_include "Start page cannot be blank", response.body
end
def test_update
@request.session[:user_id] = 1
assert_no_difference 'Wiki.count' do
post :edit, :params => {:id => 1, :wiki => { :start_page => 'Other start page' }}, :xhr => true
assert_response :success
assert_equal 'text/javascript', response.content_type
end
wiki = Project.find(1).wiki
assert_equal 'Other start page', wiki.start_page
end
def test_get_destroy_should_ask_confirmation
set_tmp_attachments_directory
@request.session[:user_id] = 1
assert_no_difference 'Wiki.count' do
get :destroy, :params => {:id => 1}
@ -74,6 +36,7 @@ class WikisControllerTest < Redmine::ControllerTest
end
def test_post_destroy_should_delete_wiki
set_tmp_attachments_directory
@request.session[:user_id] = 1
post :destroy, :params => {:id => 1, :confirm => 1}
assert_redirected_to :controller => 'projects',

View file

@ -1,5 +1,7 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2006-2019 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
@ -18,7 +20,7 @@
require File.expand_path('../../test_helper', __FILE__)
class WorkflowsControllerTest < Redmine::ControllerTest
fixtures :roles, :trackers, :workflows, :users, :issue_statuses
fixtures :roles, :trackers, :workflows, :users, :issue_statuses, :custom_fields
def setup
User.current = nil
@ -48,9 +50,10 @@ class WorkflowsControllerTest < Redmine::ControllerTest
# used status only
statuses = IssueStatus.where(:id => [2, 3, 5]).sorted.pluck(:name)
assert_equal ["New issue"] + statuses,
assert_equal(
["New issue"] + statuses,
css_select('table.workflows.transitions-always tbody tr td:first').map(&:text).map(&:strip)
)
# allowed transitions
assert_select 'input[type=checkbox][name=?][value="1"][checked=checked]', 'transitions[3][5][always]'
# not allowed
@ -74,8 +77,10 @@ class WorkflowsControllerTest < Redmine::ControllerTest
# statuses 1 and 5 not displayed
statuses = IssueStatus.where(:id => [2, 3]).sorted.pluck(:name)
assert_equal ["New issue"] + statuses,
assert_equal(
["New issue"] + statuses,
css_select('table.workflows.transitions-always tbody tr td:first').map(&:text).map(&:strip)
)
end
def test_get_edit_should_include_allowed_statuses_for_new_issues
@ -92,8 +97,8 @@ class WorkflowsControllerTest < Redmine::ControllerTest
get :edit, :params => {:role_id => 'all', :tracker_id => 'all'}
assert_response :success
assert_select 'select[name=?][multiple=multiple]', 'role_id[]' do
assert_select 'option[selected=selected]', Role.all.select(&:consider_workflow?).count
assert_select 'select[name=?]', 'role_id[]' do
assert_select 'option[selected=selected][value=all]'
end
assert_select 'select[name=?]', 'tracker_id[]' do
assert_select 'option[selected=selected][value=all]'
@ -107,10 +112,23 @@ class WorkflowsControllerTest < Redmine::ControllerTest
assert_response :success
statuses = IssueStatus.all.sorted.pluck(:name)
assert_equal ["New issue"] + statuses,
assert_equal(
["New issue"] + statuses,
css_select('table.workflows.transitions-always tbody tr td:first').map(&:text).map(&:strip)
)
assert_select 'input[type=checkbox][name=?]', 'transitions[0][1][always]'
end
assert_select 'input[type=checkbox][name=?]', 'transitions[1][1][always]'
def test_get_edit_should_show_checked_disabled_transition_checkbox_between_same_statuses
get :edit, :params => {:role_id => 2, :tracker_id => 1}
assert_response :success
assert_select 'table.workflows.transitions-always tbody tr:nth-child(2)' do
assert_select 'td.name', :text => 'New'
# assert that the td is enabled
assert_select "td[title='New » New'][class=?]", 'enabled'
# assert that the checkbox is disabled and checked
assert_select "input[name='transitions[1][1][always]'][checked=?][disabled=?]", 'checked', 'disabled', 1
end
end
def test_post_edit
@ -307,8 +325,10 @@ class WorkflowsControllerTest < Redmine::ControllerTest
assert_response :success
statuses = IssueStatus.all.sorted.pluck(:name)
assert_equal statuses,
assert_equal(
statuses,
css_select('table.workflows.fields_permissions thead tr:nth-child(2) td:not(:first-child)').map(&:text).map(&:strip)
)
end
def test_get_permissions_should_set_css_class