def test_get_all_groups_with_extra_model_exclude_kwargs(self, func): """ Test GET /Users with extra model exclude filters. """ # define kwargs returned by a call to get_extra_exclude_kwargs func.return_value = {'name': 'Behavior Group'} get_group_model().objects.create(name='Behavior Group', ) security = get_group_model().objects.create(name='Security Group', ) security = get_group_adapter()(security, self.request) url = reverse('scim:groups') resp = self.client.get(url, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 200, resp.content.decode()) result = json.loads(resp.content.decode()) expected = { "schemas": [constants.SchemaURI.LIST_RESPONSE], "totalResults": 1, "itemsPerPage": 50, "startIndex": 1, 'Resources': [ security.to_dict(), ], } self.assertEqual(expected, result)
def test_to_dict(self): behavior = get_group_model().objects.create( name='Behavior Group', scim_external_id='ww.bg', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', email='*****@*****.**', ) ford.scim_groups.add(behavior) expected = { 'meta': { 'resourceType': 'Group', 'location': u'https://localhost/scim/v2/Groups/1' }, 'displayName': 'Behavior Group', 'id': '1', 'members': [{ 'display': u'Robert Ford', 'value': '1', '$ref': u'https://localhost/scim/v2/Users/1' }], 'schemas': [constants.SchemaURI.GROUP], 'externalId': 'ww.bg', } behavior = get_group_adapter()(behavior, self.request) self.assertEqual(behavior.to_dict(), expected)
def test_patch_replace(self): behavior = get_group_model().objects.create(name='Behavior Group', ) data = { 'schemas': [constants.SchemaURI.PATCH_OP], 'Operations': [{ 'op': 'replace', 'path': 'name', 'value': [{ 'value': 'Way better Behavior Group Name' }] }] } data = json.dumps(data) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.patch(url, data=data, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 200, resp.content.decode()) behavior.refresh_from_db() result = json.loads(resp.content.decode()) expected = get_group_adapter()(behavior, self.request).to_dict() self.assertEqual(expected, result) self.assertEqual(behavior.name, 'Way better Behavior Group Name')
def test_to_dict(self): behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', email='*****@*****.**', ) ford.groups.add(behavior) expected = { 'meta': { 'resourceType': 'Group', 'location': u'https://localhost/scim/v2/Groups/1' }, 'displayName': 'Behavior Group', 'id': '1', 'members': [{ 'display': u'Robert Ford', 'value': '1', '$ref': u'https://localhost/scim/v2/Users/1' }], 'schemas': ['urn:ietf:params:scim:schemas:core:2.0:Group'] } behavior = get_group_adapter()(behavior) self.assertEqual(behavior.to_dict(), expected)
def test_patch_replace(self): behavior = get_group_model().objects.create(name='Behavior Group', ) data = { 'schemas': ['urn:ietf:params:scim:api:messages:2.0:PatchOp'], 'Operations': [{ 'op': 'replace', 'path': 'name', 'value': [{ 'value': 'Way better Behavior Group Name' }] }] } data = json.dumps(data) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.patch(url, data=data, content_type='application/scim+json') self.assertEqual(resp.status_code, 200, resp.content.decode()) behavior.refresh_from_db() result = json.loads(resp.content.decode()) expected = get_group_adapter()(behavior).to_dict() self.assertEqual(expected, result) self.assertEqual(behavior.name, 'Way better Behavior Group Name')
def test_put(self): behavior = get_group_model().objects.create(name='Behavior Group', ) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) data = get_group_adapter()(behavior).to_dict() data['displayName'] = 'Better Behavior Group' body = json.dumps(data) resp = self.client.put(url, body, content_type='application/scim+json') self.assertEqual(resp.status_code, 200, resp.content.decode()) # test object behavior.refresh_from_db() self.assertEqual(behavior.name, 'Better Behavior Group') # test response result = json.loads(resp.content.decode()) behavior = get_group_adapter()(behavior) self.assertEqual(result, behavior.to_dict())
def test_meta(self): behavior = get_group_model().objects.create(name='Behavior Group', ) behavior = get_group_adapter()(behavior) expected = { 'resourceType': 'Group', 'location': u'https://localhost/scim/v2/Groups/1' } self.assertEqual(behavior.meta, expected)
def test_get_all(self): url = reverse('scim:resource-types') resp = self.client.get(url) self.assertEqual(resp.status_code, 200, resp.content.decode()) user_type = get_user_adapter().resource_type_dict() group_type = get_group_adapter().resource_type_dict() key = lambda o: o.get('id') # noqa: 731 expected = { 'schemas': [constants.SchemaURI.LIST_RESPONSE], 'Resources': list(sorted((user_type, group_type), key=key)), } result = json.loads(resp.content.decode()) self.assertEqual(expected, result)
def test_get_all(self): url = reverse('scim:resource-types') resp = self.client.get(url) self.assertEqual(resp.status_code, 200, resp.content.decode()) user_type = get_user_adapter().resource_type_dict() group_type = get_group_adapter().resource_type_dict() key = lambda o: o.get('id') expected = { 'schemas': ['urn:ietf:params:scim:api:messages:2.0:ListResponse'], 'Resources': list(sorted((user_type, group_type), key=key)), } result = json.loads(resp.content.decode()) self.assertEqual(expected, result)
def test_get_all_groups(self): """ Test GET /Groups """ behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', ) ford.scim_groups.add(behavior) behavior = get_group_adapter()(behavior, self.request) security = get_group_model().objects.create(name='Security Group', ) abernathy = get_user_model().objects.create( first_name='Dolores', last_name='Abernathy', username='******', ) abernathy.scim_groups.add(security) security = get_group_adapter()(security, self.request) url = reverse('scim:groups') resp = self.client.get(url, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 200, resp.content.decode()) result = json.loads(resp.content.decode()) expected = { "schemas": [constants.SchemaURI.LIST_RESPONSE], "totalResults": 2, "itemsPerPage": 50, "startIndex": 1, 'Resources': [ behavior.to_dict(), security.to_dict(), ], } self.assertEqual(expected, result)
def test_get_all_groups(self): """ Test GET /Groups """ behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', ) ford.groups.add(behavior) behavior = get_group_adapter()(behavior) security = get_group_model().objects.create(name='Security Group', ) abernathy = get_user_model().objects.create( first_name='Dolores', last_name='Abernathy', username='******', ) abernathy.groups.add(security) security = get_group_adapter()(security) url = reverse('scim:groups') resp = self.client.get(url, content_type='application/scim+json') self.assertEqual(resp.status_code, 200, resp.content.decode()) result = json.loads(resp.content.decode()) expected = { "schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"], "totalResults": 2, "itemsPerPage": 50, "startIndex": 1, 'Resources': [ behavior.to_dict(), security.to_dict(), ], } self.assertEqual(expected, result)
def test_patch_remove(self): behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', ) ford.groups.add(behavior) abernathy = get_user_model().objects.create( first_name='Dolores', last_name='Abernathy', username='******', ) abernathy.groups.add(behavior) scim_abernathy = get_user_adapter()(abernathy) data = { 'schemas': ['urn:ietf:params:scim:api:messages:2.0:PatchOp'], 'Operations': [{ 'op': 'remove', 'path': 'members', 'value': [ { 'value': ford.id }, { 'value': abernathy.id }, ] }] } data = json.dumps(data) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.patch(url, data=data, content_type='application/scim+json') self.assertEqual(resp.status_code, 200, resp.content.decode()) result = json.loads(resp.content.decode()) expected = get_group_adapter()(behavior).to_dict() self.assertEqual(expected, result) self.assertEqual(behavior.user_set.count(), 0)
def test_patch_remove(self): behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', ) ford.scim_groups.add(behavior) abernathy = get_user_model().objects.create( first_name='Dolores', last_name='Abernathy', username='******', ) abernathy.scim_groups.add(behavior) data = { 'schemas': [constants.SchemaURI.PATCH_OP], 'Operations': [{ 'op': 'remove', 'path': 'members', 'value': [ { 'value': ford.id }, { 'value': abernathy.id }, ] }] } data = json.dumps(data) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.patch(url, data=data, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 200, resp.content.decode()) result = json.loads(resp.content.decode()) expected = get_group_adapter()(behavior, self.request).to_dict() self.assertEqual(expected, result) self.assertEqual(behavior.user_set.count(), 0)
def groups(self): """ Return the groups of the user per the SCIM spec. """ group_qs = Group.objects.filter(members__member=self.obj) scim_groups = [get_group_adapter()(g, self.request) for g in group_qs] dicts = [] for group in scim_groups: d = { 'value': group.scim_id, '$ref': group.location, 'display': group.display_name, } dicts.append(d) return dicts
def test_resource_type_dict(self): behavior = get_group_model().objects.create(name='Behavior Group', ) behavior = get_group_adapter()(behavior, self.request) expected = { 'endpoint': u'/scim/v2/Groups', 'description': 'Group', 'name': 'Group', 'meta': { 'resourceType': 'ResourceType', 'location': u'https://localhost/scim/v2/ResourceTypes/Group' }, 'schemas': [constants.SchemaURI.RESOURCE_TYPE], 'id': 'Group', 'schema': constants.SchemaURI.GROUP } self.assertEqual(behavior.resource_type_dict(), expected)
def test_resource_type_dict(self): behavior = get_group_model().objects.create(name='Behavior Group', ) behavior = get_group_adapter()(behavior) expected = { 'endpoint': u'/scim/v2/Groups', 'description': 'Group', 'name': 'Group', 'meta': { 'resourceType': 'ResourceType', 'location': u'https://localhost/scim/v2/ResourceTypes/Group' }, 'schemas': ['urn:ietf:params:scim:schemas:core:2.0:ResourceType'], 'id': 'Group', 'schema': 'urn:ietf:params:scim:schemas:core:2.0:Group' } self.assertEqual(behavior.resource_type_dict(), expected)
def test_members(self): behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create( first_name='Robert', last_name='Ford', username='******', email='*****@*****.**', ) ford.groups.add(behavior) behavior = get_group_adapter()(behavior) expected = [{ 'display': u'Robert Ford', 'value': '1', '$ref': u'https://localhost/scim/v2/Users/1' }] self.assertEqual(behavior.members, expected)
def test_post(self): url = reverse('scim:groups') data = { 'schemas': [constants.SchemaURI.GROUP], 'displayName': 'Behavior Group', } body = json.dumps(data) resp = self.client.post(url, body, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 201, resp.content.decode()) # test object exists behavior = get_group_model().objects.get(name='Behavior Group') # test response behavior = get_group_adapter()(behavior, self.request) result = json.loads(resp.content.decode()) self.assertEqual(result, behavior.to_dict()) self.assertEqual(resp['Location'], behavior.location)
def test_get_group_by_id(self): """ Test GET /Group/{id} """ behavior = get_group_model().objects.create(name='Behavior Group', ) ford = get_user_model().objects.create(first_name='Robert', last_name='Ford') ford.scim_groups.add(behavior) behavior = get_group_adapter()(behavior, self.request) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.get(url, content_type=constants.SCIM_CONTENT_TYPE) self.assertEqual(resp.status_code, 200, resp.content.decode()) self.assertEqual(resp['Location'], behavior.location) result = json.loads(resp.content.decode()) expected = behavior.to_dict() self.assertEqual(expected, result)
def test_post(self): url = reverse('scim:groups') data = { 'schemas': ['urn:ietf:params:scim:schemas:core:2.0:Group'], 'displayName': 'Behavior Group', } body = json.dumps(data) resp = self.client.post(url, body, content_type='application/scim+json') self.assertEqual(resp.status_code, 201, resp.content.decode()) # test object exists behavior = get_group_model().objects.get(name='Behavior Group') # test response behavior = get_group_adapter()(behavior) result = json.loads(resp.content.decode()) self.assertEqual(result, behavior.to_dict()) self.assertEqual(resp['Location'], behavior.location)
def test_display_name(self): behavior = get_group_model().objects.create(name='Behavior Group', ) behavior = get_group_adapter()(behavior) self.assertEqual(behavior.display_name, 'Behavior Group')