123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- # 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 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_accept_active_record_relation
- projects = Project.where(id: [1, 2])
- expected = (Principal.all - projects.map(&:memberships).flatten.map(&:principal)).sort
- assert_equal expected, Principal.not_member_of(projects).sort
- 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 {|p| p.name.downcase},
- scope.sorted.map {|p| p.name.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
|