blob: 32bc94462e8bb0094ed9627509e07d5ebeea181b [file] [log] [blame]
import pkg_resources
import unittest
from pylons import app_globals as g
from pylons import tmpl_context as c
from ming.orm.ormsession import ThreadLocalORMSession, session
from alluratest.controller import TestController, setup_basic_test, setup_global_objects
from allura.tests import decorators as td
from allura.lib import helpers as h
from allura.model import User
from allura import model as M
from forgegit.tests import with_git
from forgeorganization.organization import model as OM
import tg
class TestOrganization(TestController):
def setUp(self):
setup_basic_test(config='test.ini')
setup_global_objects()
super(TestOrganization, self).setUp()
c.user = User.by_username('test-user-1')
#Create a test organization
self.name = 'testorg'
self.fullname = 'Test Organization'
self.role = 'Developer'
self.orgtype = 'Foundation or other non-profit organization'
r = self.app.post('/organization/save_new/',
params=dict(
fullname=self.fullname,
shortname=self.name,
orgtype=self.orgtype,
role=self.role),
extra_environ=dict(username='test-user-1'))
self.org = OM.Organization.query.get(shortname=self.name)
#Add a new user
self.user2 = User.by_username('test-user-2')
r = self.app.post((self.org.url()+'admin/organizationprofile/invite_user'),
params=dict(
username = self.user2.username,
role = 'Software Engineer'),
extra_environ=dict(username='test-user-1'))
m = OM.Membership.query.get(
member_id=self.user2._id,
organization_id=self.org._id)
r = self.app.post('/organization/change_membership',
params=dict(
status = 'active',
membershipid = str(m._id),
requestfrom = 'user',
role = 'Software Engineer'),
extra_environ=dict(username='test-user-2'))
class TestOrganizationGeneral(TestOrganization):
@td.with_user_project('test-user-1')
def test_registration(self):
#Test organization registration
r = self.app.get('/organization/',
extra_environ=dict(username='test-user-1'))
assert 'Test Organization' in r
org = OM.Organization.query.get(shortname=self.name)
assert self.org.fullname == self.fullname
assert self.org.organization_type == self.orgtype
#Check that the user is the administrator of the org. profile
m = OM.Membership.query.get(
member_id=c.user._id,
organization_id=self.org._id)
assert c.user.username in org.project().admins()
assert m.status == 'active'
assert m.role == self.role
@td.with_user_project('test-user-1')
def test_update_profile(self):
fullname = 'New Full Name'
organization_type = 'For-profit business'
description = 'New test description'
dimension = 'Medium'
headquarters = 'Milan'
website = 'http://www.example.com'
#Update the profile of the organization
r = self.app.post('%sadmin/organizationprofile/change_data' % self.org.url(),
params = dict(
fullname = fullname,
organization_type = organization_type,
description = description,
dimension = dimension,
headquarters = headquarters,
website = website),
extra_environ=dict(username='test-user-1'))
ThreadLocalORMSession.flush_all()
r = self.app.get('%sorganizationprofile' % self.org.url())
assert organization_type in r
assert description in r
assert headquarters in r
assert fullname in r
assert website in r
self.org = OM.Organization.query.get(_id=self.org._id)
assert self.org.organization_type == organization_type
assert self.org.description == description
assert self.org.dimension == dimension
assert self.org.headquarters == headquarters
assert self.org.website == website
assert self.org.fullname == fullname
#Try to provide invalid parameters
r = self.app.post('%sadmin/organizationprofile/change_data' % self.org.url(),
params = dict(
fullname = 'a',
organization_type = 'Invalid type',
description = 'b',
dimension = 'Invalid dimension',
headquarters = 'c',
website = 'd'),
extra_environ=dict(username='test-user-1'))
ThreadLocalORMSession.flush_all()
r = self.app.get('%sorganizationprofile' % self.org.url(),
extra_environ=dict(username='test-user-1'))
self.org = OM.Organization.query.get(_id=self.org._id)
assert self.org.organization_type == organization_type
assert self.org.description == description
assert self.org.dimension == dimension
assert self.org.headquarters == headquarters
assert self.org.website == website
assert self.org.fullname == fullname
@td.with_user_project('test-user-1')
def test_workfield(self):
wf = OM.WorkFields.query.get(name='Mobile apps')
c.user = User.by_username('test-user-1')
#Add a workfield
r = self.app.post('%sadmin/organizationprofile/add_work_field' % self.org.url(),
params = dict(
workfield = str(wf._id)),
extra_environ=dict(username='test-user-1'))
r = self.app.get('%sorganizationprofile' % self.org.url())
self.org = OM.Organization.query.get(_id=self.org._id)
assert len(self.org.getWorkfields()) == 1
assert self.org.getWorkfields()[0]._id == wf._id
assert wf.name in r
assert wf.description in r
#Add a second workfield
wf2 = OM.WorkFields.query.get(name='Web applications')
r = self.app.post('%sadmin/organizationprofile/add_work_field' % self.org.url(),
params = dict(
workfield = str(wf2._id)),
extra_environ=dict(username='test-user-1'))
r = self.app.get('%sorganizationprofile' % self.org.url())
self.org = OM.Organization.query.get(_id=self.org._id)
assert len(self.org.getWorkfields()) == 2
assert wf2.name in r
assert wf2.description in r
#Remove a workfield
r = self.app.post('%sadmin/organizationprofile/remove_work_field' % self.org.url(),
params = {'workfieldid' : str(wf._id)},
extra_environ=dict(username='test-user-1'))
r = self.app.get('%sorganizationprofile' % self.org.url())
assert len(self.org.getWorkfields()) == 1
assert self.org.getWorkfields()[0]._id == wf2._id
assert wf.name not in r
assert wf.description not in r
class TestOrganizationMembership(TestOrganization):
@td.with_user_project('test-user-1')
def test_invite_user(self):
#Try to invite a new user
user3 = User.by_username('test-admin')
testrole = 'Software Engineer'
r = self.app.post('%sadmin/organizationprofile/invite_user' % self.org.url(),
params=dict(
username = user3.username,
role = testrole),
extra_environ=dict(username='test-user-1'))
r = self.app.get('%sadmin/organizationprofile' % self.org.url(),
extra_environ=dict(username='test-user-1'))
assert user3.display_name in r
m = OM.Membership.query.get(
member_id=user3._id,
organization_id=self.org._id)
assert m.status == 'invitation'
assert m.role == testrole
#Accept invitation
r = self.app.post('/organization/change_membership',
params=dict(
status = 'active',
membershipid = str(m._id),
role = testrole),
extra_environ=dict(username='test-admin'))
m = OM.Membership.query.get(
member_id=user3._id,
organization_id=self.org._id)
assert m.status == 'active'
assert m.role == testrole
@td.with_user_project('test-user-1')
def test_change_permissions(self):
m = OM.Membership.query.get(
member_id=self.user2._id,
organization_id=self.org._id)
#Close the involvement of test-user-1
testuser1 = User.by_username('test-user-1')
m = OM.Membership.query.get(
member_id=testuser1._id,
organization_id=self.org._id)
r = self.app.post('%sadmin/organizationprofile/change_membership' % self.org.url(),
params=dict(
status = 'closed',
membershipid = str(m._id),
requestfrom = 'user',
role = self.role),
extra_environ=dict(username='test-user-1'))
m = OM.Membership.query.get(
member_id=c.user._id,
organization_id=self.org._id)
assert m.status == 'closed'
assert m.role == self.role
@td.with_user_project('test-admin')
def test_send_request(self):
#Send an admission request from a new user
user3 = User.by_username('test-admin')
testrole = 'Software Engineer'
r = self.app.post('%sorganizationprofile/admission_request' % self.org.url(),
params=dict(
role = testrole),
extra_environ=dict(username='test-admin'))
c.user = M.User.by_username('test-user-1')
r = self.app.get('%sadmin/organizationprofile' % self.org.url(),
extra_environ=dict(username='test-user-1'))
assert user3.display_name in r
m = OM.Membership.query.get(
member_id=user3._id,
organization_id=self.org._id)
assert m.status == 'request'
assert m.role == testrole
#Accept request
r = self.app.post('%sadmin/organizationprofile/change_membership' % self.org.url(),
params=dict(
status = 'active',
membershipid = str(m._id),
requestfrom = 'user',
role = testrole),
extra_environ=dict(username='test-user-1'))
m = OM.Membership.query.get(
member_id=user3._id,
organization_id=self.org._id)
assert m.status == 'active'
assert m.role == testrole
#check projects
class TestOrganizationProjects(TestOrganization):
@td.with_user_project('test-admin')
def test_request_collaboration(self):
def send_request(self):
#Try to send a request to participate to a project
#The user sending the request is the admin of the org's profile
r = self.app.post('/organizationstool/send_request',
params=dict(
organization = str(self.org._id),
coll_type = 'cooperation'),
extra_environ=dict(username='test-user-1'))
return OM.ProjectInvolvement.query.get(organization_id=self.org._id)
p = send_request(self)
assert p.status == 'request'
assert p.collaborationtype == 'cooperation'
#As the admin of the project, reject pending request
r = self.app.post('/organizationstool/update_collaboration_status',
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'remove'),
extra_environ=dict(username='test-admin'))
p = OM.ProjectInvolvement.query.get(organization_id=self.org._id)
assert p is None
p = send_request(self)
#As the admin of the project, accept pending request
r = self.app.post('/organizationstool/update_collaboration_status',
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'active'),
extra_environ=dict(username='test-admin'))
assert p.status == 'active'
assert p.collaborationtype == 'cooperation'
#As the admin of the project, close the collaboration
r = self.app.post('/organizationstool/update_collaboration_status',
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'closed'),
extra_environ=dict(username='test-admin'))
p = OM.ProjectInvolvement.query.get(organization_id=self.org._id)
assert p.status == 'closed'
assert p.collaborationtype == 'cooperation'
@td.with_user_project('test-admin')
def test_invite_organization(self):
def send_invitation(self):
#Try to send an invitation to participate to a project
#The user sending the request is the admin of the project
r = self.app.post('/organizationstool/invite',
params=dict(
organizationid = str(self.org._id),
collaborationtype = 'cooperation'),
extra_environ=dict(username='test-admin'))
return OM.ProjectInvolvement.query.get(organization_id=self.org._id)
p = send_invitation(self)
assert p.status == 'invitation'
assert p.collaborationtype == 'cooperation'
#As the admin of the organization, reject pending invitation
r = self.app.post('%sadmin/organizationprofile/update_collaboration_status' % self.org.url(),
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'remove'),
extra_environ=dict(username='test-user-1'))
p = OM.ProjectInvolvement.query.get(organization_id=self.org._id)
assert p is None
p = send_invitation(self)
#As the admin of the organization, accept pending invitation
r = self.app.post('%sadmin/organizationprofile/update_collaboration_status' % self.org.url(),
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'active'),
extra_environ=dict(username='test-user-1'))
assert p.status == 'active'
assert p.collaborationtype == 'cooperation'
#As the admin of the organization, close the collaboration
r = self.app.post('%sadmin/organizationprofile/update_collaboration_status' % self.org.url(),
params=dict(
collaborationid = str(p._id),
collaborationtype = 'cooperation',
status = 'closed'),
extra_environ=dict(username='test-user-1'))
p = OM.ProjectInvolvement.query.get(organization_id=self.org._id)
assert p.status == 'closed'
assert p.collaborationtype == 'cooperation'