1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2022 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 PrincipalTest < ActiveSupport::TestCase
fixtures :users, :projects, :members, :member_roles, :roles,
:email_addresses
def setup
User.current = nil
end
def test_active_scope_should_return_groups_and_active_users
result = Principal.active.to_a
assert_include Group.first, result
assert_not_nil result.detect {|p| p.is_a?(User)}
assert_nil result.detect {|p| p.is_a?(User) && !p.active?}
assert_nil result.detect {|p| p.is_a?(AnonymousUser)}
end
def test_visible_scope_for_admin_should_return_all_principals
admin = User.generate! {|u| u.admin = true}
assert_equal Principal.count, Principal.visible(admin).count
end
def test_visible_scope_for_user_with_members_of_visible_projects_visibility_should_return_active_principals
Role.non_member.update! :users_visibility => 'all'
user = User.generate!
expected = Principal.active
assert_equal expected.map(&:id).sort, Principal.visible(user).pluck(:id).sort
end
def test_visible_scope_for_user_with_members_of_visible_projects_visibility_should_return_members_of_visible_projects_and_self
Role.non_member.update! :users_visibility => 'members_of_visible_projects'
user = User.generate!
expected = Project.visible(user).map {|p| p.memberships.active}.flatten.map(&:principal).uniq << user
assert_equal expected.map(&:id).sort, Principal.visible(user).pluck(:id).sort
end
def test_member_of_scope_should_return_the_union_of_all_active_and_locked_members
projects = Project.find([1])
assert_equal [3, 5, 2], Principal.member_of(projects).sort.map(&:id)
projects = Project.find([1, 2])
assert_equal [3, 5, 2, 8, 11], Principal.member_of(projects).sort.map(&:id)
end
def test_member_of_scope_should_be_empty_for_no_projects
assert_equal [], Principal.member_of([]).sort
end
def test_not_member_of_scope_should_return_users_that_have_no_memberships
[[1], [1, 2]].each do |ids|
projects = Project.find(ids)
assert_equal ids.size, projects.count
expected = (Principal.all - projects.map(&:memberships).flatten.map(&:principal)).sort
assert_equal expected, Principal.not_member_of(projects).sort
end
end
def test_not_member_of_scope_should_be_empty_for_no_projects
assert_equal [], Principal.not_member_of([]).sort
end
def test_sorted_scope_should_sort_users_before_groups
scope = Principal.where(:type => ['User', 'Group'])
users = scope.select {|p| p.is_a?(User)}.sort
groups = scope.select {|p| p.is_a?(Group)}.sort
assert_equal (users + groups).map(&:name).map(&:downcase),
scope.sorted.map(&:name).map(&:downcase)
end
test "like scope should search login" do
results = Principal.like('jsmi')
assert results.any?
assert results.all? {|u| u.login.match(/jsmi/i)}
end
test "like scope should search firstname" do
results = Principal.like('john')
assert results.any?
assert results.all? {|u| u.firstname.match(/john/i)}
end
test "like scope should search lastname" do
results = Principal.like('smi')
assert results.any?
assert results.all? {|u| u.lastname.match(/smi/i)}
end
test "like scope should search mail" do
results = Principal.like('somenet')
assert results.any?
assert results.all? {|u| u.mail.match(/somenet/i)}
end
test "like scope should search firstname and lastname" do
results = Principal.like('john smi')
assert_equal 1, results.count
assert_equal User.find(2), results.first
end
test "like scope should search lastname and firstname" do
results = Principal.like('smith joh')
assert_equal 1, results.count
assert_equal User.find(2), results.first
end
test "like scope should find lastname with spaces" do
user = User.find(1)
user.update_columns(:firstname => 'Leonardo', :lastname => 'da Vinci')
results = Principal.like('Leonardo da Vinci')
assert_equal 1, results.count
assert_equal user, results.first
end
def test_like_scope_with_cyrillic_name
user = User.generate!(:firstname => 'Соболев', :lastname => 'Денис')
results = Principal.like('Собо')
assert_equal 1, results.count
assert_equal user, results.first
end
def test_like_scope_should_escape_query
user = User.generate!(:firstname => 'Leonardo', :lastname => 'da Vinci')
r = Principal.like('Vi_ci')
assert_not_include user, r
r = Principal.like('Vi%ci')
assert_not_include user, r
user.update_column :lastname, 'da Vi%ci'
r = Principal.like('vi%ci')
assert_include user, r
user.update_column :lastname, 'da Vi_ci'
r = Principal.like('vi_ci')
assert_include user, r
end
end
|