summaryrefslogtreecommitdiffstats
path: root/test/unit/principal_test.rb
blob: 77ccb540a3d0f24f016a48520ab1565481fa27cf (plain)
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
# frozen_string_literal: true

# 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 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
end