def test_delete(self): behavior = get_group_model().objects.create(name='Behavior Group', ) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.delete(url) self.assertEqual(resp.status_code, 204, resp.content.decode()) behavior = get_group_model().objects.filter(id=behavior.id).first() self.assertIsNone(behavior)
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_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_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_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, 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.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_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_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_groups(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) ford = get_user_adapter()(ford) expected = [{ 'display': u'Behavior Group', 'value': '1', '$ref': u'https://localhost/scim/v2/Groups/1', }] self.assertEqual(ford.groups, expected)
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) 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 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_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_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 = { 'schemas': [constants.SchemaURI.USER], 'userName': '******', 'meta': { 'resourceType': 'User', 'lastModified': ford.date_joined.isoformat(timespec='milliseconds'), 'location': u'https://localhost/scim/v2/Users/1', 'created': ford.date_joined.isoformat(timespec='milliseconds'), }, 'displayName': u'Robert Ford', 'name': { 'givenName': 'Robert', 'familyName': 'Ford', }, 'groups': [{ 'display': u'Behavior Group', 'value': '1', '$ref': u'https://localhost/scim/v2/Groups/1' }], 'active': True, 'id': '1', 'emails': [{ 'primary': True, 'value': '*****@*****.**' }], } ford = get_user_adapter()(ford, self.request) self.assertEqual(ford.to_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_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.groups.add(behavior) behavior = get_group_adapter()(behavior) url = reverse('scim:groups', kwargs={'uuid': behavior.id}) resp = self.client.get(url, content_type='application/scim+json') 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_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_patch_atomic(self): behavior = get_group_model().objects.create(name='Behavior Group', ) ids = list(get_user_model().objects.all().values_list( 'id', flat=True)) or [0] max_id = max(ids) data = { 'schemas': ['urn:ietf:params:scim:api:messages:2.0:PatchOp'], 'Operations': [ { 'op': 'replace', 'path': 'name', 'value': [{ 'value': 'Way better Behavior Group Name' }] }, # Adding a non-existent user should cause this PATCH to fail { 'op': 'add', 'path': 'members', 'value': [{ 'value': max_id + 1 }] } ] } 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, 400, resp.content.decode()) behavior.refresh_from_db() self.assertEqual(behavior.name, 'Behavior Group')
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')