"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "keystone/tests/protection/v3/test_access_rules.py" between
keystone-16.0.1.tar.gz and keystone-17.0.0.tar.gz

About: OpenStack Keystone (Core Service: Identity) provides an authentication and authorization service for other OpenStack services. Provides a catalog of endpoints for all OpenStack services.
The "Ussuri" series (latest release).

test_access_rules.py  (keystone-16.0.1):test_access_rules.py  (keystone-17.0.0)
skipping to change at line 15 skipping to change at line 15
# http://www.apache.org/licenses/LICENSE-2.0 # http://www.apache.org/licenses/LICENSE-2.0
# #
# Unless required by applicable law or agreed to in writing, software # Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import uuid import uuid
from six.moves import http_client import http.client
from keystone.common import provider_api from keystone.common import provider_api
import keystone.conf import keystone.conf
from keystone.tests.common import auth as common_auth from keystone.tests.common import auth as common_auth
from keystone.tests import unit from keystone.tests import unit
from keystone.tests.unit import base_classes from keystone.tests.unit import base_classes
from keystone.tests.unit import ksfixtures from keystone.tests.unit import ksfixtures
from keystone.tests.unit.ksfixtures import temporaryfile from keystone.tests.unit.ksfixtures import temporaryfile
CONF = keystone.conf.CONF CONF = keystone.conf.CONF
skipping to change at line 46 skipping to change at line 46
'user_id': self.user_id, 'user_id': self.user_id,
'project_id': self.project_id, 'project_id': self.project_id,
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (self.user_id, app_cred['acc path = '/v3/users/%s/access_rules/%s' % (
ess_rules'][0]['id']) self.user_id, app_cred['access_rules'][0]['id'])
c.get(path, headers=self.headers) c.get(path, headers=self.headers)
def test_user_can_list_their_access_rules(self): def test_user_can_list_their_access_rules(self):
app_cred = { app_cred = {
'id': uuid.uuid4().hex, 'id': uuid.uuid4().hex,
'name': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
'user_id': self.user_id, 'user_id': self.user_id,
'project_id': self.project_id, 'project_id': self.project_id,
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': uuid.uuid4().hex, 'id': uuid.uuid4().hex,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
with self.test_client() as c: with self.test_client() as c:
r = c.get('/v3/users/%s/access_rules' % self.user_id, headers=self.h r = c.get('/v3/users/%s/access_rules' % self.user_id,
eaders) headers=self.headers)
self.assertEqual(len(r.json['access_rules']), 1) self.assertEqual(len(r.json['access_rules']), 1)
def test_user_can_delete_their_access_rules(self): def test_user_can_delete_their_access_rules(self):
access_rule_id = uuid.uuid4().hex access_rule_id = uuid.uuid4().hex
app_cred = { app_cred = {
'id': uuid.uuid4().hex, 'id': uuid.uuid4().hex,
'name': uuid.uuid4().hex, 'name': uuid.uuid4().hex,
'user_id': self.user_id, 'user_id': self.user_id,
'project_id': self.project_id, 'project_id': self.project_id,
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
PROVIDERS.application_credential_api.delete_application_credential(app_c PROVIDERS.application_credential_api.delete_application_credential(
red['id']) app_cred['id'])
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (self.user_id, access_rule_i path = '/v3/users/%s/access_rules/%s' % (
d) self.user_id, access_rule_id)
c.delete(path, headers=self.headers) c.delete(path, headers=self.headers)
class _ProjectUsersTests(object): class _ProjectUsersTests(object):
"""Users who have project role authorization observe the same behavior.""" """Users who have project role authorization observe the same behavior."""
def test_user_cannot_get_access_rules_for_other_users(self): def test_user_cannot_get_access_rules_for_other_users(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
project = unit.new_project_ref( project = unit.new_project_ref(
domain_id=CONF.identity.default_domain_id domain_id=CONF.identity.default_domain_id
skipping to change at line 120 skipping to change at line 127
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.get( c.get(
path, headers=self.headers, path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
def test_user_cannot_get_own_non_existent_access_rule_not_found(self): def test_user_cannot_get_own_non_existent_access_rule_not_found(self):
with self.test_client() as c: with self.test_client() as c:
c.get( c.get(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
self.user_id, uuid.uuid4().hex), self.user_id, uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.NOT_FOUND expected_status_code=http.client.NOT_FOUND
) )
def test_user_cannot_get_non_existent_access_rule_other_user_forbidden(self) : def test_cannot_get_non_existent_access_rule_other_user_forbidden(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.get( c.get(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
def test_user_cannot_list_access_rules_for_other_users(self): def test_user_cannot_list_access_rules_for_other_users(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
project = unit.new_project_ref( project = unit.new_project_ref(
domain_id=CONF.identity.default_domain_id domain_id=CONF.identity.default_domain_id
) )
project = PROVIDERS.resource_api.create_project(project['id'], project) project = PROVIDERS.resource_api.create_project(project['id'], project)
PROVIDERS.assignment_api.create_grant( PROVIDERS.assignment_api.create_grant(
skipping to change at line 172 skipping to change at line 181
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': uuid.uuid4().hex, 'id': uuid.uuid4().hex,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules' % user['id'] path = '/v3/users/%s/access_rules' % user['id']
c.get(path, headers=self.headers, c.get(path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN) expected_status_code=http.client.FORBIDDEN)
def test_user_cannot_delete_access_rules_for_others(self): def test_user_cannot_delete_access_rules_for_others(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
project = unit.new_project_ref( project = unit.new_project_ref(
domain_id=CONF.identity.default_domain_id domain_id=CONF.identity.default_domain_id
) )
project = PROVIDERS.resource_api.create_project(project['id'], project) project = PROVIDERS.resource_api.create_project(project['id'], project)
PROVIDERS.assignment_api.create_grant( PROVIDERS.assignment_api.create_grant(
self.bootstrapper.member_role_id, user_id=user['id'], self.bootstrapper.member_role_id, user_id=user['id'],
skipping to change at line 204 skipping to change at line 214
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
PROVIDERS.application_credential_api.delete_application_credential(app_c PROVIDERS.application_credential_api.delete_application_credential(
red['id']) app_cred['id'])
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.delete( c.delete(
path, headers=self.headers, path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
def test_user_cannot_delete_non_existent_access_rule_other_user_forbidden(se lf): def test_cannot_delete_non_existent_access_rule_other_user_forbidden(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.delete( c.delete(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
class _SystemUserAccessRuleTests(object): class _SystemUserAccessRuleTests(object):
"""Tests that are common across all system users.""" """Tests that are common across all system users."""
def test_user_can_list_access_rules_for_other_users(self): def test_user_can_list_access_rules_for_other_users(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
project = unit.new_project_ref( project = unit.new_project_ref(
domain_id=CONF.identity.default_domain_id domain_id=CONF.identity.default_domain_id
skipping to change at line 252 skipping to change at line 265
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': uuid.uuid4().hex, 'id': uuid.uuid4().hex,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
with self.test_client() as c: with self.test_client() as c:
r = c.get('/v3/users/%s/access_rules' % user['id'], r = c.get('/v3/users/%s/access_rules' % user['id'],
headers=self.headers) headers=self.headers)
self.assertEqual(1, len(r.json['access_rules'])) self.assertEqual(1, len(r.json['access_rules']))
def test_user_cannot_get_non_existent_access_rule_not_found(self): def test_user_cannot_get_non_existent_access_rule_not_found(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.get( c.get(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.NOT_FOUND expected_status_code=http.client.NOT_FOUND
) )
class SystemReaderTests(base_classes.TestCaseWithBootstrap, class SystemReaderTests(base_classes.TestCaseWithBootstrap,
common_auth.AuthTestMixin, common_auth.AuthTestMixin,
_SystemUserAccessRuleTests): _SystemUserAccessRuleTests):
def setUp(self): def setUp(self):
super(SystemReaderTests, self).setUp() super(SystemReaderTests, self).setUp()
self.loadapp() self.loadapp()
self.useFixture(ksfixtures.Policy(self.config_fixture)) self.useFixture(ksfixtures.Policy(self.config_fixture))
skipping to change at line 328 skipping to change at line 342
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
PROVIDERS.application_credential_api.delete_application_credential(app_c PROVIDERS.application_credential_api.delete_application_credential(
red['id']) app_cred['id'])
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.delete( c.delete(
path, headers=self.headers, path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
def test_user_cannot_delete_non_existent_access_rule_forbidden(self): def test_user_cannot_delete_non_existent_access_rule_forbidden(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.delete( c.delete(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
class SystemMemberTests(base_classes.TestCaseWithBootstrap, class SystemMemberTests(base_classes.TestCaseWithBootstrap,
common_auth.AuthTestMixin, common_auth.AuthTestMixin,
_SystemUserAccessRuleTests): _SystemUserAccessRuleTests):
def setUp(self): def setUp(self):
super(SystemMemberTests, self).setUp() super(SystemMemberTests, self).setUp()
self.loadapp() self.loadapp()
self.useFixture(ksfixtures.Policy(self.config_fixture)) self.useFixture(ksfixtures.Policy(self.config_fixture))
skipping to change at line 406 skipping to change at line 423
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
PROVIDERS.application_credential_api.delete_application_credential(app_c PROVIDERS.application_credential_api.delete_application_credential(
red['id']) app_cred['id'])
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.delete( c.delete(
path, headers=self.headers, path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.delete( c.delete(
path, headers=self.headers, path, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
def test_user_cannot_delete_non_existent_access_rule_forbidden(self): def test_user_cannot_delete_non_existent_access_rule_forbidden(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.delete( c.delete(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.FORBIDDEN expected_status_code=http.client.FORBIDDEN
) )
class SystemAdminTests(base_classes.TestCaseWithBootstrap, class SystemAdminTests(base_classes.TestCaseWithBootstrap,
common_auth.AuthTestMixin, common_auth.AuthTestMixin,
_SystemUserAccessRuleTests): _SystemUserAccessRuleTests):
def setUp(self): def setUp(self):
super(SystemAdminTests, self).setUp() super(SystemAdminTests, self).setUp()
self.loadapp() self.loadapp()
self.useFixture(ksfixtures.Policy(self.config_fixture)) self.useFixture(ksfixtures.Policy(self.config_fixture))
skipping to change at line 484 skipping to change at line 505
'user_id': user['id'], 'user_id': user['id'],
'project_id': project['id'], 'project_id': project['id'],
'secret': uuid.uuid4().hex, 'secret': uuid.uuid4().hex,
'access_rules': [{ 'access_rules': [{
'id': access_rule_id, 'id': access_rule_id,
'service': uuid.uuid4().hex, 'service': uuid.uuid4().hex,
'path': uuid.uuid4().hex, 'path': uuid.uuid4().hex,
'method': uuid.uuid4().hex[16:] 'method': uuid.uuid4().hex[16:]
}] }]
} }
PROVIDERS.application_credential_api.create_application_credential(app_c PROVIDERS.application_credential_api.create_application_credential(
red) app_cred)
PROVIDERS.application_credential_api.delete_application_credential(app_c PROVIDERS.application_credential_api.delete_application_credential(
red['id']) app_cred['id'])
with self.test_client() as c: with self.test_client() as c:
path = '/v3/users/%s/access_rules/%s' % (user['id'], access_rule_id) path = '/v3/users/%s/access_rules/%s' % (
user['id'], access_rule_id)
c.delete(path, headers=self.headers) c.delete(path, headers=self.headers)
def test_user_cannot_delete_non_existent_access_rule_not_found(self): def test_user_cannot_delete_non_existent_access_rule_not_found(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id) user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = PROVIDERS.identity_api.create_user(user) user = PROVIDERS.identity_api.create_user(user)
with self.test_client() as c: with self.test_client() as c:
c.delete( c.delete(
'/v3/users/%s/access_rules/%s' % ( '/v3/users/%s/access_rules/%s' % (
user['id'], uuid.uuid4().hex), user['id'], uuid.uuid4().hex),
headers=self.headers, headers=self.headers,
expected_status_code=http_client.NOT_FOUND expected_status_code=http.client.NOT_FOUND
) )
class ProjectReaderTests(base_classes.TestCaseWithBootstrap, class ProjectReaderTests(base_classes.TestCaseWithBootstrap,
common_auth.AuthTestMixin, common_auth.AuthTestMixin,
_UserAccessRuleTests, _UserAccessRuleTests,
_ProjectUsersTests): _ProjectUsersTests):
def setUp(self): def setUp(self):
super(ProjectReaderTests, self).setUp() super(ProjectReaderTests, self).setUp()
self.loadapp() self.loadapp()
 End of changes. 35 change blocks. 
58 lines changed or deleted 64 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)