mirror of
https://github.com/redmine/redmine.git
synced 2025-11-06 13:25:44 +01:00
Patch by Katsuya HIDAKA (user:hidakatsuya). git-svn-id: https://svn.redmine.org/redmine/trunk@23915 e93f8b46-1217-0410-a6f0-8f06a7374b81
186 lines
6.0 KiB
Ruby
186 lines
6.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Redmine - project management software
|
|
# Copyright (C) 2006- 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_relative '../../../test_helper'
|
|
|
|
class Redmine::ReactionTest < ActiveSupport::TestCase
|
|
setup do
|
|
@user = users(:users_002)
|
|
@issue = issues(:issues_007)
|
|
Setting.reactions_enabled = '1'
|
|
end
|
|
|
|
test 'preload_reaction_details preloads ReactionDetail for all objects in the collection' do
|
|
User.current = users(:users_002)
|
|
|
|
issue1 = issues(:issues_001)
|
|
issue2 = issues(:issues_002)
|
|
|
|
assert_nil issue1.instance_variable_get(:@reaction_detail)
|
|
assert_nil issue2.instance_variable_get(:@reaction_detail)
|
|
|
|
Issue.preload_reaction_details([issue1, issue2])
|
|
|
|
expected_issue1_reaction_detail = Reaction::Detail.new(
|
|
visible_users: [users(:users_003), users(:users_002), users(:users_001)],
|
|
user_reaction: reactions(:reaction_002)
|
|
)
|
|
|
|
# ReactionDetail is already preloaded, so calling reaction_detail does not execute any query.
|
|
assert_no_queries do
|
|
assert_equal expected_issue1_reaction_detail, issue1.reaction_detail
|
|
|
|
# Even when an object has no reactions, an empty ReactionDetail is set.
|
|
assert_equal Reaction::Detail.new(
|
|
visible_users: [],
|
|
user_reaction: nil
|
|
), issue2.reaction_detail
|
|
end
|
|
end
|
|
|
|
test 'visible_users in ReactionDetail preloaded by preload_reaction_details does not include non-visible users' do
|
|
current_user = User.current = User.generate!
|
|
visible_user = users(:users_002)
|
|
non_visible_user = User.generate!
|
|
|
|
project = Project.generate!
|
|
role = Role.generate!(users_visibility: 'members_of_visible_projects')
|
|
|
|
User.add_to_project(current_user, project, role)
|
|
User.add_to_project(visible_user, project, roles(:roles_001))
|
|
|
|
issue = Issue.generate!(project: project)
|
|
|
|
[current_user, visible_user, non_visible_user].each do |user|
|
|
issue.reactions.create!(user: user)
|
|
end
|
|
|
|
Issue.preload_reaction_details([issue])
|
|
|
|
# non_visible_user is not visible to current_user because they do not belong to any project.
|
|
assert_equal [visible_user, current_user], issue.reaction_detail.visible_users
|
|
end
|
|
|
|
test 'preload_reaction_details does nothing when the reaction feature is disabled' do
|
|
Setting.reactions_enabled = '0'
|
|
|
|
User.current = users(:users_002)
|
|
news1 = news(:news_001)
|
|
|
|
# Stub the Setting to avoid executing queries for retrieving settings,
|
|
# making it easier to confirm no queries are executed by preload_reaction_details().
|
|
Setting.stubs(:reactions_enabled?).returns(false)
|
|
|
|
assert_no_queries do
|
|
News.preload_reaction_details([news1])
|
|
end
|
|
|
|
assert_nil news1.instance_variable_get(:@reaction_detail)
|
|
end
|
|
|
|
test 'reaction_detail loads and returns ReactionDetail if it is not preloaded' do
|
|
message7 = messages(:messages_007)
|
|
|
|
User.current = users(:users_002)
|
|
assert_nil message7.instance_variable_get(:@reaction_detail)
|
|
|
|
assert_equal Reaction::Detail.new(
|
|
visible_users: [users(:users_002)],
|
|
user_reaction: reactions(:reaction_009)
|
|
), message7.reaction_detail
|
|
end
|
|
|
|
test 'load_reaction_detail loads ReactionDetail for the object itself' do
|
|
comment1 = comments(:comments_001)
|
|
|
|
User.current = users(:users_001)
|
|
assert_nil comment1.instance_variable_get(:@reaction_detail)
|
|
|
|
comment1.load_reaction_detail
|
|
|
|
assert_equal Reaction::Detail.new(
|
|
visible_users: [users(:users_002)],
|
|
user_reaction: nil
|
|
), comment1.reaction_detail
|
|
end
|
|
|
|
test 'visible? returns true when reactions are enabled and object is visible to user' do
|
|
object = issues(:issues_007)
|
|
user = users(:users_002)
|
|
|
|
assert Redmine::Reaction.visible?(object, user)
|
|
end
|
|
|
|
test 'visible? returns false when reactions are disabled' do
|
|
Setting.reactions_enabled = '0'
|
|
|
|
object = issues(:issues_007)
|
|
user = users(:users_002)
|
|
|
|
assert_not Redmine::Reaction.visible?(object, user)
|
|
end
|
|
|
|
test 'visible? returns false when object is not visible to user' do
|
|
object = issues(:issues_007)
|
|
user = users(:users_002)
|
|
|
|
object.expects(:visible?).with(user).returns(false)
|
|
|
|
assert_not Redmine::Reaction.visible?(object, user)
|
|
end
|
|
|
|
test 'editable? returns true for various reactable objects when user is logged in, object is visible, and project is active' do
|
|
reactable_objects = {
|
|
issue: issues(:issues_007),
|
|
message: messages(:messages_001),
|
|
news: news(:news_001),
|
|
journal: journals(:journals_001),
|
|
comment: comments(:comments_002)
|
|
}
|
|
user = users(:users_002)
|
|
|
|
reactable_objects.each do |type, object|
|
|
assert Redmine::Reaction.editable?(object, user), "Expected editable? to return true for #{type}"
|
|
end
|
|
end
|
|
|
|
test 'editable? returns false when user is not logged in' do
|
|
object = issues(:issues_007)
|
|
user = User.anonymous
|
|
|
|
assert_not Redmine::Reaction.editable?(object, user)
|
|
end
|
|
|
|
test 'editable? returns false when project is inactive' do
|
|
object = issues(:issues_007)
|
|
user = users(:users_002)
|
|
object.project.update!(status: Project::STATUS_ARCHIVED)
|
|
|
|
assert_not Redmine::Reaction.editable?(object, user)
|
|
end
|
|
|
|
test 'editable? returns false when project is closed' do
|
|
object = issues(:issues_007)
|
|
user = users(:users_002)
|
|
object.project.update!(status: Project::STATUS_CLOSED)
|
|
|
|
assert_not Redmine::Reaction.editable?(object, user)
|
|
end
|
|
end
|