##// END OF EJS Templates
Sort members on the DB side....
Jean-Philippe Lang -
r15658:e22159a3cb72
parent child
Show More
@@ -1,198 +1,205
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2016 Jean-Philippe Lang
2 # Copyright (C) 2006-2016 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class Member < ActiveRecord::Base
18 class Member < ActiveRecord::Base
19 belongs_to :user
19 belongs_to :user
20 belongs_to :principal, :foreign_key => 'user_id'
20 belongs_to :principal, :foreign_key => 'user_id'
21 has_many :member_roles, :dependent => :destroy
21 has_many :member_roles, :dependent => :destroy
22 has_many :roles, lambda { distinct }, :through => :member_roles
22 has_many :roles, lambda { distinct }, :through => :member_roles
23 belongs_to :project
23 belongs_to :project
24
24
25 validates_presence_of :principal, :project
25 validates_presence_of :principal, :project
26 validates_uniqueness_of :user_id, :scope => :project_id
26 validates_uniqueness_of :user_id, :scope => :project_id
27 validate :validate_role
27 validate :validate_role
28 attr_protected :id
28 attr_protected :id
29
29
30 before_destroy :set_issue_category_nil
30 before_destroy :set_issue_category_nil
31
31
32 scope :active, lambda { joins(:principal).where(:users => {:status => Principal::STATUS_ACTIVE})}
32 scope :active, lambda { joins(:principal).where(:users => {:status => Principal::STATUS_ACTIVE})}
33
33
34 # Sort by first role and principal
35 scope :sorted, lambda {
36 includes(:member_roles, :roles, :principal).
37 reorder("#{Role.table_name}.position").
38 order(Principal.fields_for_order_statement)
39 }
40
34 alias :base_reload :reload
41 alias :base_reload :reload
35 def reload(*args)
42 def reload(*args)
36 @managed_roles = nil
43 @managed_roles = nil
37 base_reload(*args)
44 base_reload(*args)
38 end
45 end
39
46
40 def role
47 def role
41 end
48 end
42
49
43 def role=
50 def role=
44 end
51 end
45
52
46 def name
53 def name
47 self.user.name
54 self.user.name
48 end
55 end
49
56
50 alias :base_role_ids= :role_ids=
57 alias :base_role_ids= :role_ids=
51 def role_ids=(arg)
58 def role_ids=(arg)
52 ids = (arg || []).collect(&:to_i) - [0]
59 ids = (arg || []).collect(&:to_i) - [0]
53 # Keep inherited roles
60 # Keep inherited roles
54 ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id)
61 ids += member_roles.select {|mr| !mr.inherited_from.nil?}.collect(&:role_id)
55
62
56 new_role_ids = ids - role_ids
63 new_role_ids = ids - role_ids
57 # Add new roles
64 # Add new roles
58 new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id, :member => self) }
65 new_role_ids.each {|id| member_roles << MemberRole.new(:role_id => id, :member => self) }
59 # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy)
66 # Remove roles (Rails' #role_ids= will not trigger MemberRole#on_destroy)
60 member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)}
67 member_roles_to_destroy = member_roles.select {|mr| !ids.include?(mr.role_id)}
61 if member_roles_to_destroy.any?
68 if member_roles_to_destroy.any?
62 member_roles_to_destroy.each(&:destroy)
69 member_roles_to_destroy.each(&:destroy)
63 end
70 end
64 end
71 end
65
72
66 def <=>(member)
73 def <=>(member)
67 a, b = roles.sort, member.roles.sort
74 a, b = roles.sort, member.roles.sort
68 if a == b
75 if a == b
69 if principal
76 if principal
70 principal <=> member.principal
77 principal <=> member.principal
71 else
78 else
72 1
79 1
73 end
80 end
74 elsif a.any?
81 elsif a.any?
75 b.any? ? a <=> b : -1
82 b.any? ? a <=> b : -1
76 else
83 else
77 1
84 1
78 end
85 end
79 end
86 end
80
87
81 # Set member role ids ignoring any change to roles that
88 # Set member role ids ignoring any change to roles that
82 # user is not allowed to manage
89 # user is not allowed to manage
83 def set_editable_role_ids(ids, user=User.current)
90 def set_editable_role_ids(ids, user=User.current)
84 ids = (ids || []).collect(&:to_i) - [0]
91 ids = (ids || []).collect(&:to_i) - [0]
85 editable_role_ids = user.managed_roles(project).map(&:id)
92 editable_role_ids = user.managed_roles(project).map(&:id)
86 untouched_role_ids = self.role_ids - editable_role_ids
93 untouched_role_ids = self.role_ids - editable_role_ids
87 touched_role_ids = ids & editable_role_ids
94 touched_role_ids = ids & editable_role_ids
88 self.role_ids = untouched_role_ids + touched_role_ids
95 self.role_ids = untouched_role_ids + touched_role_ids
89 end
96 end
90
97
91 # Returns true if one of the member roles is inherited
98 # Returns true if one of the member roles is inherited
92 def any_inherited_role?
99 def any_inherited_role?
93 member_roles.any? {|mr| mr.inherited_from}
100 member_roles.any? {|mr| mr.inherited_from}
94 end
101 end
95
102
96 # Returns true if the member has the role and if it's inherited
103 # Returns true if the member has the role and if it's inherited
97 def has_inherited_role?(role)
104 def has_inherited_role?(role)
98 member_roles.any? {|mr| mr.role_id == role.id && mr.inherited_from.present?}
105 member_roles.any? {|mr| mr.role_id == role.id && mr.inherited_from.present?}
99 end
106 end
100
107
101 # Returns true if the member's role is editable by user
108 # Returns true if the member's role is editable by user
102 def role_editable?(role, user=User.current)
109 def role_editable?(role, user=User.current)
103 if has_inherited_role?(role)
110 if has_inherited_role?(role)
104 false
111 false
105 else
112 else
106 user.managed_roles(project).include?(role)
113 user.managed_roles(project).include?(role)
107 end
114 end
108 end
115 end
109
116
110 # Returns true if the member is deletable by user
117 # Returns true if the member is deletable by user
111 def deletable?(user=User.current)
118 def deletable?(user=User.current)
112 if any_inherited_role?
119 if any_inherited_role?
113 false
120 false
114 else
121 else
115 roles & user.managed_roles(project) == roles
122 roles & user.managed_roles(project) == roles
116 end
123 end
117 end
124 end
118
125
119 # Destroys the member
126 # Destroys the member
120 def destroy
127 def destroy
121 member_roles.reload.each(&:destroy_without_member_removal)
128 member_roles.reload.each(&:destroy_without_member_removal)
122 super
129 super
123 end
130 end
124
131
125 # Returns true if the member is user or is a group
132 # Returns true if the member is user or is a group
126 # that includes user
133 # that includes user
127 def include?(user)
134 def include?(user)
128 if principal.is_a?(Group)
135 if principal.is_a?(Group)
129 !user.nil? && user.groups.include?(principal)
136 !user.nil? && user.groups.include?(principal)
130 else
137 else
131 self.user == user
138 self.user == user
132 end
139 end
133 end
140 end
134
141
135 def set_issue_category_nil
142 def set_issue_category_nil
136 if user_id && project_id
143 if user_id && project_id
137 # remove category based auto assignments for this member
144 # remove category based auto assignments for this member
138 IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project_id, user_id]).
145 IssueCategory.where(["project_id = ? AND assigned_to_id = ?", project_id, user_id]).
139 update_all("assigned_to_id = NULL")
146 update_all("assigned_to_id = NULL")
140 end
147 end
141 end
148 end
142
149
143 # Returns the roles that the member is allowed to manage
150 # Returns the roles that the member is allowed to manage
144 # in the project the member belongs to
151 # in the project the member belongs to
145 def managed_roles
152 def managed_roles
146 @managed_roles ||= begin
153 @managed_roles ||= begin
147 if principal.try(:admin?)
154 if principal.try(:admin?)
148 Role.givable.to_a
155 Role.givable.to_a
149 else
156 else
150 members_management_roles = roles.select do |role|
157 members_management_roles = roles.select do |role|
151 role.has_permission?(:manage_members)
158 role.has_permission?(:manage_members)
152 end
159 end
153 if members_management_roles.empty?
160 if members_management_roles.empty?
154 []
161 []
155 elsif members_management_roles.any?(&:all_roles_managed?)
162 elsif members_management_roles.any?(&:all_roles_managed?)
156 Role.givable.to_a
163 Role.givable.to_a
157 else
164 else
158 members_management_roles.map(&:managed_roles).reduce(&:|)
165 members_management_roles.map(&:managed_roles).reduce(&:|)
159 end
166 end
160 end
167 end
161 end
168 end
162 end
169 end
163
170
164 # Creates memberships for principal with the attributes
171 # Creates memberships for principal with the attributes
165 # * project_ids : one or more project ids
172 # * project_ids : one or more project ids
166 # * role_ids : ids of the roles to give to each membership
173 # * role_ids : ids of the roles to give to each membership
167 #
174 #
168 # Example:
175 # Example:
169 # Member.create_principal_memberships(user, :project_ids => [2, 5], :role_ids => [1, 3]
176 # Member.create_principal_memberships(user, :project_ids => [2, 5], :role_ids => [1, 3]
170 def self.create_principal_memberships(principal, attributes)
177 def self.create_principal_memberships(principal, attributes)
171 members = []
178 members = []
172 if attributes
179 if attributes
173 project_ids = Array.wrap(attributes[:project_ids] || attributes[:project_id])
180 project_ids = Array.wrap(attributes[:project_ids] || attributes[:project_id])
174 role_ids = attributes[:role_ids]
181 role_ids = attributes[:role_ids]
175 project_ids.each do |project_id|
182 project_ids.each do |project_id|
176 members << Member.new(:principal => principal, :role_ids => role_ids, :project_id => project_id)
183 members << Member.new(:principal => principal, :role_ids => role_ids, :project_id => project_id)
177 end
184 end
178 principal.members << members
185 principal.members << members
179 end
186 end
180 members
187 members
181 end
188 end
182
189
183 # Finds or initilizes a Member for the given project and principal
190 # Finds or initilizes a Member for the given project and principal
184 def self.find_or_new(project, principal)
191 def self.find_or_new(project, principal)
185 project_id = project.is_a?(Project) ? project.id : project
192 project_id = project.is_a?(Project) ? project.id : project
186 principal_id = principal.is_a?(Principal) ? principal.id : principal
193 principal_id = principal.is_a?(Principal) ? principal.id : principal
187
194
188 member = Member.find_by_project_id_and_user_id(project_id, principal_id)
195 member = Member.find_by_project_id_and_user_id(project_id, principal_id)
189 member ||= Member.new(:project_id => project_id, :user_id => principal_id)
196 member ||= Member.new(:project_id => project_id, :user_id => principal_id)
190 member
197 member
191 end
198 end
192
199
193 protected
200 protected
194
201
195 def validate_role
202 def validate_role
196 errors.add(:role, :empty) if member_roles.empty? && roles.empty?
203 errors.add(:role, :empty) if member_roles.empty? && roles.empty?
197 end
204 end
198 end
205 end
@@ -1,62 +1,62
1 <% roles = Role.find_all_givable
1 <% roles = Role.find_all_givable
2 members = @project.memberships.active.includes(:member_roles, :roles, :principal).to_a.sort %>
2 members = @project.memberships.active.sorted.to_a %>
3
3
4 <p><%= link_to l(:label_member_new), new_project_membership_path(@project), :remote => true, :class => "icon icon-add" %></p>
4 <p><%= link_to l(:label_member_new), new_project_membership_path(@project), :remote => true, :class => "icon icon-add" %></p>
5
5
6 <% if members.any? %>
6 <% if members.any? %>
7 <table class="list members">
7 <table class="list members">
8 <thead>
8 <thead>
9 <tr>
9 <tr>
10 <th><%= l(:label_user) %> / <%= l(:label_group) %></th>
10 <th><%= l(:label_user) %> / <%= l(:label_group) %></th>
11 <th><%= l(:label_role_plural) %></th>
11 <th><%= l(:label_role_plural) %></th>
12 <th style="width:15%"></th>
12 <th style="width:15%"></th>
13 <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
13 <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
14 </tr>
14 </tr>
15 </thead>
15 </thead>
16 <tbody>
16 <tbody>
17 <% members.each do |member| %>
17 <% members.each do |member| %>
18 <% next if member.new_record? %>
18 <% next if member.new_record? %>
19 <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
19 <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
20 <td class="name icon icon-<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td>
20 <td class="name icon icon-<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td>
21 <td class="roles">
21 <td class="roles">
22 <span id="member-<%= member.id %>-roles"><%= member.roles.sort.collect(&:to_s).join(', ') %></span>
22 <span id="member-<%= member.id %>-roles"><%= member.roles.sort.collect(&:to_s).join(', ') %></span>
23 <%= form_for(member,
23 <%= form_for(member,
24 {:as => :membership, :remote => true,
24 {:as => :membership, :remote => true,
25 :url => membership_path(member),
25 :url => membership_path(member),
26 :method => :put,
26 :method => :put,
27 :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }}
27 :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }}
28 ) do |f| %>
28 ) do |f| %>
29 <p>
29 <p>
30 <% roles.each do |role| %>
30 <% roles.each do |role| %>
31 <label>
31 <label>
32 <%= check_box_tag('membership[role_ids][]',
32 <%= check_box_tag('membership[role_ids][]',
33 role.id, member.roles.include?(role),
33 role.id, member.roles.include?(role),
34 :id => nil,
34 :id => nil,
35 :disabled => !member.role_editable?(role)) %> <%= role %>
35 :disabled => !member.role_editable?(role)) %> <%= role %>
36 </label><br />
36 </label><br />
37 <% end %>
37 <% end %>
38 </p>
38 </p>
39 <%= hidden_field_tag 'membership[role_ids][]', '', :id => nil %>
39 <%= hidden_field_tag 'membership[role_ids][]', '', :id => nil %>
40 <p>
40 <p>
41 <%= submit_tag l(:button_save), :class => "small" %>
41 <%= submit_tag l(:button_save), :class => "small" %>
42 <%= link_to_function(l(:button_cancel),
42 <%= link_to_function(l(:button_cancel),
43 "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;") %>
43 "$('#member-#{member.id}-roles').show(); $('#member-#{member.id}-roles-form').hide(); return false;") %>
44 </p>
44 </p>
45 <% end %>
45 <% end %>
46 </td>
46 </td>
47 <td class="buttons">
47 <td class="buttons">
48 <%= link_to_function l(:button_edit),
48 <%= link_to_function l(:button_edit),
49 "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;",
49 "$('#member-#{member.id}-roles').hide(); $('#member-#{member.id}-roles-form').show(); return false;",
50 :class => 'icon icon-edit' %>
50 :class => 'icon icon-edit' %>
51 <%= delete_link membership_path(member),
51 <%= delete_link membership_path(member),
52 :remote => true,
52 :remote => true,
53 :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %>
53 :data => (!User.current.admin? && member.include?(User.current) ? {:confirm => l(:text_own_membership_delete_confirmation)} : {}) if member.deletable? %>
54 </td>
54 </td>
55 <%= call_hook(:view_projects_settings_members_table_row, { :project => @project, :member => member}) %>
55 <%= call_hook(:view_projects_settings_members_table_row, { :project => @project, :member => member}) %>
56 </tr>
56 </tr>
57 <% end; reset_cycle %>
57 <% end; reset_cycle %>
58 </tbody>
58 </tbody>
59 </table>
59 </table>
60 <% else %>
60 <% else %>
61 <p class="nodata"><%= l(:label_no_data) %></p>
61 <p class="nodata"><%= l(:label_no_data) %></p>
62 <% end %>
62 <% end %>
@@ -1,193 +1,199
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2016 Jean-Philippe Lang
2 # Copyright (C) 2006-2016 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class MemberTest < ActiveSupport::TestCase
20 class MemberTest < ActiveSupport::TestCase
21 fixtures :projects, :trackers, :issue_statuses, :issues,
21 fixtures :projects, :trackers, :issue_statuses, :issues,
22 :enumerations, :users, :issue_categories,
22 :enumerations, :users, :issue_categories,
23 :projects_trackers,
23 :projects_trackers,
24 :roles,
24 :roles,
25 :member_roles,
25 :member_roles,
26 :members,
26 :members,
27 :enabled_modules,
27 :enabled_modules,
28 :groups_users,
28 :groups_users,
29 :watchers,
29 :watchers,
30 :journals, :journal_details,
30 :journals, :journal_details,
31 :messages,
31 :messages,
32 :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
32 :wikis, :wiki_pages, :wiki_contents, :wiki_content_versions,
33 :boards
33 :boards
34
34
35 include Redmine::I18n
35 include Redmine::I18n
36
36
37 def setup
37 def setup
38 @jsmith = Member.find(1)
38 @jsmith = Member.find(1)
39 end
39 end
40
40
41 def test_sorted_scope_on_project_members
42 members = Project.find(1).members.sorted.to_a
43 roles = members.map {|m| m.roles.sort.first}
44 assert_equal roles, roles.sort
45 end
46
41 def test_create
47 def test_create
42 member = Member.new(:project_id => 1, :user_id => 4, :role_ids => [1, 2])
48 member = Member.new(:project_id => 1, :user_id => 4, :role_ids => [1, 2])
43 assert member.save
49 assert member.save
44 member.reload
50 member.reload
45
51
46 assert_equal 2, member.roles.size
52 assert_equal 2, member.roles.size
47 assert_equal Role.find(1), member.roles.sort.first
53 assert_equal Role.find(1), member.roles.sort.first
48 end
54 end
49
55
50 def test_update
56 def test_update
51 assert_equal "eCookbook", @jsmith.project.name
57 assert_equal "eCookbook", @jsmith.project.name
52 assert_equal "Manager", @jsmith.roles.first.name
58 assert_equal "Manager", @jsmith.roles.first.name
53 assert_equal "jsmith", @jsmith.user.login
59 assert_equal "jsmith", @jsmith.user.login
54
60
55 @jsmith.mail_notification = !@jsmith.mail_notification
61 @jsmith.mail_notification = !@jsmith.mail_notification
56 assert @jsmith.save
62 assert @jsmith.save
57 end
63 end
58
64
59 def test_update_roles
65 def test_update_roles
60 assert_equal 1, @jsmith.roles.size
66 assert_equal 1, @jsmith.roles.size
61 @jsmith.role_ids = [1, 2]
67 @jsmith.role_ids = [1, 2]
62 assert @jsmith.save
68 assert @jsmith.save
63 assert_equal 2, @jsmith.reload.roles.size
69 assert_equal 2, @jsmith.reload.roles.size
64 end
70 end
65
71
66 def test_validate
72 def test_validate
67 member = Member.new(:project_id => 1, :user_id => 2, :role_ids => [2])
73 member = Member.new(:project_id => 1, :user_id => 2, :role_ids => [2])
68 # same use cannot have more than one membership for a project
74 # same use cannot have more than one membership for a project
69 assert !member.save
75 assert !member.save
70
76
71 # must have one role at least
77 # must have one role at least
72 user = User.new(:firstname => "new1", :lastname => "user1",
78 user = User.new(:firstname => "new1", :lastname => "user1",
73 :mail => "test_validate@somenet.foo")
79 :mail => "test_validate@somenet.foo")
74 user.login = "test_validate"
80 user.login = "test_validate"
75 user.password, user.password_confirmation = "password", "password"
81 user.password, user.password_confirmation = "password", "password"
76 assert user.save
82 assert user.save
77
83
78 set_language_if_valid 'fr'
84 set_language_if_valid 'fr'
79 member = Member.new(:project_id => 1, :user_id => user.id, :role_ids => [])
85 member = Member.new(:project_id => 1, :user_id => user.id, :role_ids => [])
80 assert !member.save
86 assert !member.save
81 assert_include I18n.translate('activerecord.errors.messages.empty'), member.errors[:role]
87 assert_include I18n.translate('activerecord.errors.messages.empty'), member.errors[:role]
82 assert_equal "R\xc3\xb4le doit \xc3\xaatre renseign\xc3\xa9(e)".force_encoding('UTF-8'),
88 assert_equal "R\xc3\xb4le doit \xc3\xaatre renseign\xc3\xa9(e)".force_encoding('UTF-8'),
83 [member.errors.full_messages].flatten.join
89 [member.errors.full_messages].flatten.join
84 end
90 end
85
91
86 def test_validate_member_role
92 def test_validate_member_role
87 user = User.new(:firstname => "new1", :lastname => "user1",
93 user = User.new(:firstname => "new1", :lastname => "user1",
88 :mail => "test_validate@somenet.foo")
94 :mail => "test_validate@somenet.foo")
89 user.login = "test_validate_member_role"
95 user.login = "test_validate_member_role"
90 user.password, user.password_confirmation = "password", "password"
96 user.password, user.password_confirmation = "password", "password"
91 assert user.save
97 assert user.save
92 member = Member.new(:project_id => 1, :user_id => user.id, :role_ids => [5])
98 member = Member.new(:project_id => 1, :user_id => user.id, :role_ids => [5])
93 assert !member.save
99 assert !member.save
94 end
100 end
95
101
96 def test_set_issue_category_nil_should_handle_nil_values
102 def test_set_issue_category_nil_should_handle_nil_values
97 m = Member.new
103 m = Member.new
98 assert_nil m.user
104 assert_nil m.user
99 assert_nil m.project
105 assert_nil m.project
100
106
101 assert_nothing_raised do
107 assert_nothing_raised do
102 m.set_issue_category_nil
108 m.set_issue_category_nil
103 end
109 end
104 end
110 end
105
111
106 def test_destroy
112 def test_destroy
107 category1 = IssueCategory.find(1)
113 category1 = IssueCategory.find(1)
108 assert_equal @jsmith.user.id, category1.assigned_to_id
114 assert_equal @jsmith.user.id, category1.assigned_to_id
109 assert_difference 'Member.count', -1 do
115 assert_difference 'Member.count', -1 do
110 assert_difference 'MemberRole.count', -1 do
116 assert_difference 'MemberRole.count', -1 do
111 @jsmith.destroy
117 @jsmith.destroy
112 end
118 end
113 end
119 end
114 assert_raise(ActiveRecord::RecordNotFound) { Member.find(@jsmith.id) }
120 assert_raise(ActiveRecord::RecordNotFound) { Member.find(@jsmith.id) }
115 category1.reload
121 category1.reload
116 assert_nil category1.assigned_to_id
122 assert_nil category1.assigned_to_id
117 end
123 end
118
124
119 def test_destroy_should_trigger_callbacks_only_once
125 def test_destroy_should_trigger_callbacks_only_once
120 Member.class_eval { def destroy_test_callback; end}
126 Member.class_eval { def destroy_test_callback; end}
121 Member.after_destroy :destroy_test_callback
127 Member.after_destroy :destroy_test_callback
122
128
123 m = Member.create!(:user_id => 1, :project_id => 1, :role_ids => [1,3])
129 m = Member.create!(:user_id => 1, :project_id => 1, :role_ids => [1,3])
124
130
125 Member.any_instance.expects(:destroy_test_callback).once
131 Member.any_instance.expects(:destroy_test_callback).once
126 assert_difference 'Member.count', -1 do
132 assert_difference 'Member.count', -1 do
127 assert_difference 'MemberRole.count', -2 do
133 assert_difference 'MemberRole.count', -2 do
128 m.destroy
134 m.destroy
129 end
135 end
130 end
136 end
131 assert m.destroyed?
137 assert m.destroyed?
132 ensure
138 ensure
133 Member._destroy_callbacks.delete(:destroy_test_callback)
139 Member._destroy_callbacks.delete(:destroy_test_callback)
134 end
140 end
135
141
136 def test_roles_should_be_unique
142 def test_roles_should_be_unique
137 m = Member.new(:user_id => 1, :project_id => 1)
143 m = Member.new(:user_id => 1, :project_id => 1)
138 m.member_roles.build(:role_id => 1)
144 m.member_roles.build(:role_id => 1)
139 m.member_roles.build(:role_id => 1)
145 m.member_roles.build(:role_id => 1)
140 m.save!
146 m.save!
141 m.reload
147 m.reload
142 assert_equal 1, m.roles.count
148 assert_equal 1, m.roles.count
143 assert_equal [1], m.roles.ids
149 assert_equal [1], m.roles.ids
144 end
150 end
145
151
146 def test_sort_without_roles
152 def test_sort_without_roles
147 a = Member.new(:roles => [Role.first])
153 a = Member.new(:roles => [Role.first])
148 b = Member.new
154 b = Member.new
149
155
150 assert_equal -1, a <=> b
156 assert_equal -1, a <=> b
151 assert_equal 1, b <=> a
157 assert_equal 1, b <=> a
152 end
158 end
153
159
154 def test_sort_without_principal
160 def test_sort_without_principal
155 role = Role.first
161 role = Role.first
156 a = Member.new(:roles => [role], :principal => User.first)
162 a = Member.new(:roles => [role], :principal => User.first)
157 b = Member.new(:roles => [role])
163 b = Member.new(:roles => [role])
158
164
159 assert_equal -1, a <=> b
165 assert_equal -1, a <=> b
160 assert_equal 1, b <=> a
166 assert_equal 1, b <=> a
161 end
167 end
162
168
163 def test_managed_roles_should_return_all_roles_for_role_with_all_roles_managed
169 def test_managed_roles_should_return_all_roles_for_role_with_all_roles_managed
164 member = Member.new
170 member = Member.new
165 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => true)
171 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => true)
166 assert_equal Role.givable.all, member.managed_roles
172 assert_equal Role.givable.all, member.managed_roles
167 end
173 end
168
174
169 def test_managed_roles_should_return_all_roles_for_admins
175 def test_managed_roles_should_return_all_roles_for_admins
170 member = Member.new(:user => User.find(1))
176 member = Member.new(:user => User.find(1))
171 member.roles << Role.generate!
177 member.roles << Role.generate!
172 assert_equal Role.givable.all, member.managed_roles
178 assert_equal Role.givable.all, member.managed_roles
173 end
179 end
174
180
175 def test_managed_roles_should_return_limited_roles_for_role_without_all_roles_managed
181 def test_managed_roles_should_return_limited_roles_for_role_without_all_roles_managed
176 member = Member.new
182 member = Member.new
177 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [2, 3])
183 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [2, 3])
178 assert_equal [2, 3], member.managed_roles.map(&:id).sort
184 assert_equal [2, 3], member.managed_roles.map(&:id).sort
179 end
185 end
180
186
181 def test_managed_roles_should_cumulated_managed_roles
187 def test_managed_roles_should_cumulated_managed_roles
182 member = Member.new
188 member = Member.new
183 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [3])
189 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [3])
184 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [2])
190 member.roles << Role.generate!(:permissions => [:manage_members], :all_roles_managed => false, :managed_role_ids => [2])
185 assert_equal [2, 3], member.managed_roles.map(&:id).sort
191 assert_equal [2, 3], member.managed_roles.map(&:id).sort
186 end
192 end
187
193
188 def test_managed_roles_should_return_no_roles_for_role_without_permission
194 def test_managed_roles_should_return_no_roles_for_role_without_permission
189 member = Member.new
195 member = Member.new
190 member.roles << Role.generate!(:all_roles_managed => true)
196 member.roles << Role.generate!(:all_roles_managed => true)
191 assert_equal [], member.managed_roles
197 assert_equal [], member.managed_roles
192 end
198 end
193 end
199 end
General Comments 0
You need to be logged in to leave comments. Login now