User groups feature initial commit.

git-svn-id: http://redmine.rubyforge.org/svn/branches/work@1373 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Jean-Philippe Lang
2008-04-28 15:10:04 +00:00
parent 4783d3d7c5
commit ced3cab7bb
41 changed files with 812 additions and 65 deletions

7
groups/test/fixtures/groups.yml vendored Normal file
View File

@@ -0,0 +1,7 @@
managers:
id: 1
name: Managers
clients:
id: 2
name: Clients

View File

@@ -4,24 +4,43 @@ members_001:
project_id: 1
role_id: 1
id: 1
user_id: 2
principal_type: User
principal_id: 2
members_002:
created_on: 2006-07-19 19:35:36 +02:00
project_id: 1
role_id: 2
id: 2
user_id: 3
principal_type: User
principal_id: 3
members_003:
created_on: 2006-07-19 19:35:36 +02:00
project_id: 2
role_id: 2
id: 3
user_id: 2
principal_type: User
principal_id: 2
members_004:
id: 4
created_on: 2006-07-19 19:35:36 +02:00
project_id: 1
role_id: 2
# Locked user
user_id: 5
principal_type: User
principal_id: 5
members_005:
id: 5
created_on: 2008-01-19 19:35:36 +02:00
project_id: 1
role_id: 3
principal_type: Group
principal_id: 2 # Clients
members_006:
id: 6
created_on: 2008-01-19 19:35:36 +02:00
project_id: 1
role_id: 3
principal_type: User
principal_id: 7
inherited_from: 5

View File

@@ -1,5 +1,5 @@
---
roles_001:
manager:
name: Manager
id: 1
builtin: 0
@@ -41,7 +41,7 @@ roles_001:
- :view_changesets
position: 1
roles_002:
developer:
name: Developer
id: 2
builtin: 0
@@ -78,7 +78,7 @@ roles_002:
- :view_changesets
position: 2
roles_003:
reporter:
name: Reporter
id: 3
builtin: 0
@@ -113,7 +113,7 @@ roles_003:
- :view_changesets
position: 3
roles_004:
non_member:
name: Non member
id: 4
builtin: 1
@@ -141,7 +141,7 @@ roles_004:
- :view_changesets
position: 4
roles_005:
anonymous:
name: Anonymous
id: 5
builtin: 2

View File

@@ -96,5 +96,38 @@ users_006:
mail_notification: false
login: ''
type: AnonymousUser
client:
id: 7
created_on: 2006-07-19 19:33:19 +02:00
status: 1
last_login_on:
language: ''
hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
updated_on: 2006-07-19 19:33:19 +02:00
admin: false
mail: 'client@foo.bar'
lastname: User
firstname: Client
auth_source_id:
mail_notification: false
login: client
type: User
group_id: 2 # Clients
new_client:
id: 8
created_on: 2006-07-19 19:33:19 +02:00
status: 1
last_login_on:
language: ''
hashed_password: 7feb7657aa7a7bf5aef3414a5084875f27192415
updated_on: 2006-07-19 19:33:19 +02:00
admin: false
mail: 'newclient@foo.bar'
lastname: New
firstname: Client
auth_source_id:
mail_notification: false
login: newclient
type: User

View File

@@ -0,0 +1,76 @@
# redMine - project management software
# Copyright (C) 2008 FreeCode
#
# 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.dirname(__FILE__) + '/../test_helper'
require 'groups_controller'
# Re-raise errors caught by the controller.
class GroupsController; def rescue_action(e) raise e end; end
class GroupsControllerTest < Test::Unit::TestCase
fixtures :groups, :users
def setup
@controller = GroupsController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
User.current = nil
@request.session[:user_id] = 1 # admin
end
def test_should_get_index
get :index
assert_response :success
assert_not_nil assigns(:groups)
end
def test_should_get_new
get :new
assert_response :success
end
def test_should_create_group
assert_difference('Group.count') do
post :create, :group => { :name => 'New group' }
end
assert_redirected_to groups_path
assert_not_nil Group.find_by_name('New group')
end
def test_should_show_group
get :show, :id => 1
assert_response :success
end
def test_should_get_edit
get :edit, :id => 1
assert_response :success
end
def test_should_update_group
put :update, :id => 1, :group => { :name => 'Renamed' }
assert_redirected_to groups_path
assert_equal 'Renamed', Group.find(1).name
end
def test_should_destroy_group
assert_difference('Group.count', -1) do
delete :destroy, :id => 1
end
assert_redirected_to groups_path
end
end

View File

@@ -0,0 +1,80 @@
# Redmine - project management software
# Copyright (C) 2008 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.dirname(__FILE__) + '/../test_helper'
require 'members_controller'
# Re-raise errors caught by the controller.
class MembersController; def rescue_action(e) raise e end; end
class MembersControllerTest < Test::Unit::TestCase
fixtures :projects, :roles, :users, :groups, :members
def setup
@controller = MembersController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
User.current = nil
@request.session[:user_id] = 1 # admin
end
def test_should_create_user_member
p = Project.find(1)
u = users(:new_client)
assert_difference('Member.count') do
post :new, :id => p.id, :member => { :role_id => roles(:reporter).id }, :principal => "user_#{u.id}"
end
assert_redirected_to :controller => 'projects', :action => 'settings', :id => p, :tab => 'members'
assert u.reload.member_of?(p)
assert_equal roles(:reporter), u.role_for_project(p)
end
def test_should_create_group_member
p = Project.find(2)
assert_difference('Member.count') do
post :new, :id => p.id, :member => { :role_id => roles(:reporter) }, :principal => 'group_1'
end
assert_redirected_to :controller => 'projects', :action => 'settings', :id => p, :tab => 'members'
end
def test_should_update_user_member
u = User.find(3)
p = Project.find(1)
assert_equal roles(:developer), u.role_for_project(p)
assert_difference('Member.count', 0) do
post :edit, :id => 2, :member => { :role_id => roles(:manager).id }
end
assert_redirected_to :controller => 'projects', :action => 'settings', :id => p, :tab => 'members'
assert_equal roles(:manager), u.reload.role_for_project(p)
end
def test_should_destroy
p = Project.find(1)
assert_difference('Member.count', -1) do
post :destroy, :id => 2
end
assert_redirected_to :controller => 'projects', :action => 'settings', :id => p, :tab => 'members'
end
def test_should_not_destroy_inherited_membership
p = Project.find(1)
assert_difference('Member.count', 0) do
post :destroy, :id => 6
end
assert_response 404
end
end

View File

@@ -47,6 +47,14 @@ class UsersControllerTest < Test::Unit::TestCase
assert_nil assigns(:users).detect {|u| !u.active?}
end
def test_should_add_membership
assert_difference('User.find(2).memberships.count') do
post :edit_membership, :id => 2, :membership => { :role_id => 1, :project_id => 3 }
assert_redirected_to 'users/edit/2'
assert User.find(2).member_of?(Project.find(3))
end
end
def test_edit_membership
post :edit_membership, :id => 2, :membership_id => 1,
:membership => { :role_id => 2}

View File

@@ -0,0 +1,129 @@
# redMine - project management software
# Copyright (C) 2008 FreeCode
#
# 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.dirname(__FILE__) + '/../test_helper'
class GroupTest < ActiveSupport::TestCase
fixtures :groups, :users, :projects, :roles, :members
def test_should_validate_presence_of_name
g = Group.new(:name => '')
assert !g.save
assert_equal 1, g.errors.size
end
def test_should_validate_uniqueness_of_name
g = Group.new(:name => groups(:clients).name)
assert !g.save
assert_equal 1, g.errors.size
end
def test_should_create
g = Group.new(:name => 'New group')
assert g.save
assert g.users.empty?
end
def test_should_destroy
g = groups(:clients)
p = Project.find(1)
u = users(:client)
assert u.member_of?(p)
assert_difference('Member.count', -2) do
g.destroy
end
u.reload
assert_nil u.group
assert !u.member_of?(p)
end
def test_should_add_user_to_group
g = groups(:clients)
p = Project.find(1)
u = users(:new_client)
r = roles(:reporter)
assert !u.member_of?(p)
assert_difference('Member.count') do
assert_difference('g.reload.users.size') do
u.group_id = g.id
assert u.save
end
end
u.reload
assert u.group = g
assert u.member_of?(p)
assert_equal r, u.role_for_project(p)
end
def test_should_add_group_to_project
g = groups(:clients)
p = Project.find(2)
u = users(:client)
r = roles(:reporter)
assert !u.member_of?(p)
assert_difference('Member.count', 2) do
assert_difference('p.reload.users.size') do
m = Member.new(:project => p, :principal => g, :role => r)
assert m.save
end
end
u.reload
assert u.member_of?(p)
assert_equal r, u.role_for_project(p)
end
def test_should_remove_user_from_group
g = groups(:clients)
p = Project.find(1)
u = users(:client)
assert u.member_of?(p)
assert_difference('Member.count', -1) do
assert_difference('g.reload.users.size', -1) do
u.group_id = nil
assert u.save
end
end
end
def test_should_override_group_role
g = groups(:clients)
p = Project.find(1)
u = users(:client)
assert u.member_of?(p)
assert_equal roles(:reporter), u.role_for_project(p)
assert_difference('Member.count', 1) do
assert_difference('p.reload.users.size', 0) do
m = Member.new(:project => p, :principal => u, :role => roles(:manager))
assert m.save
end
end
assert_equal roles(:manager), u.reload.role_for_project(p)
# Remove the group, user should still be a member
assert_difference('Member.count', -2) do
assert_difference('p.reload.users.size', 0) do
assert g.destroy
end
end
assert_equal roles(:manager), u.reload.role_for_project(p)
end
end

View File

@@ -25,7 +25,7 @@ class MemberTest < Test::Unit::TestCase
end
def test_create
member = Member.new(:project_id => 1, :user_id => 4, :role_id => 1)
member = Member.new(:project_id => 1, :principal_type => 'User', :principal_id => 4, :role_id => 1)
assert member.save
end
@@ -39,7 +39,7 @@ class MemberTest < Test::Unit::TestCase
end
def test_validate
member = Member.new(:project_id => 1, :user_id => 2, :role_id =>2)
member = Member.new(:project_id => 1, :principal_type => 'User', :principal_id => 2, :role_id =>2)
# same use can't have more than one role for a project
assert !member.save
end

View File

@@ -80,10 +80,10 @@ class ProjectTest < Test::Unit::TestCase
end
def test_destroy
# 2 active members
assert_equal 2, @ecookbook.members.size
# 3 active members
assert_equal 3, @ecookbook.members.size
# and 1 is locked
assert_equal 3, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
assert_equal 5, Member.find(:all, :conditions => ['project_id = ?', @ecookbook.id]).size
# some boards
assert @ecookbook.boards.any?