diff --git a/syncano/models/accounts.py b/syncano/models/accounts.py index aa07d50..16639d2 100644 --- a/syncano/models/accounts.py +++ b/syncano/models/accounts.py @@ -156,10 +156,24 @@ def auth(self, username=None, password=None): def _user_groups_method(self, group_id=None, method='GET'): properties = self.get_endpoint_data() endpoint = self._meta.resolve_endpoint('groups', properties) - if group_id is not None: + + if group_id is not None and method != 'POST': endpoint += '{}/'.format(group_id) connection = self._get_connection() - return connection.request(method, endpoint) + + data = {} + if method == 'POST': + data = {'group': group_id} + + response = connection.request(method, endpoint, data=data) + + if method == 'DELETE': # no response here; + return + + if 'objects' in response: + return [Group(**group_response['group']) for group_response in response['objects']] + + return Group(**response['group']) def add_to_group(self, group_id): return self._user_groups_method(group_id, method='POST') @@ -212,17 +226,28 @@ class Meta: def _group_users_method(self, user_id=None, method='GET'): properties = self.get_endpoint_data() endpoint = self._meta.resolve_endpoint('users', properties) - if user_id is not None: + if user_id is not None and method != 'POST': endpoint += '{}/'.format(user_id) connection = self._get_connection() + + data = {} + if method == 'POST': + data = {'user': user_id} + try: - response = connection.request(method, endpoint) + response = connection.request(method, endpoint, data=data) except SyncanoRequestError as e: if e.status_code == 404: raise UserNotFound(e.status_code, 'User not found.') raise - return response + if method == 'DELETE': + return + + if 'objects' in response: + return [User(**user_response['user']) for user_response in response['objects']] + + return User(**response['user']) def list_users(self): return self._group_users_method() diff --git a/tests/integration_test_user.py b/tests/integration_test_user.py index 87fc9d5..e314e28 100644 --- a/tests/integration_test_user.py +++ b/tests/integration_test_user.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from syncano.exceptions import UserNotFound -from syncano.models import User +from syncano.models import Group, User from tests.integration_test import InstanceMixin, IntegrationTest @@ -62,3 +62,55 @@ def setUpClass(cls): def test_if_custom_error_is_raised_on_user_group(self): with self.assertRaises(UserNotFound): self.group.user_details(user_id=221) + + def test_user_group_membership(self): + user = User.please.create( + username='testa', + password='1234' + ) + + group_test = Group.please.create(label='new_group_a') + + groups = user.list_groups() + self.assertListEqual(groups, []) + + group = user.add_to_group(group_id=group_test.id) + self.assertEqual(group.id, group_test.id) + self.assertEqual(group.label, group_test.label) + + groups = user.list_groups() + self.assertEqual(len(groups), 1) + self.assertEqual(groups[0].id, group_test.id) + + group = user.group_details(group_id=group_test.id) + self.assertEqual(group.id, group_test.id) + self.assertEqual(group.label, group_test.label) + + response = user.remove_from_group(group_id=group_test.id) + self.assertIsNone(response) + + def test_group_user_membership(self): + user_test = User.please.create( + username='testb', + password='1234' + ) + + group = Group.please.create(label='new_group_b') + + users = group.list_users() + self.assertListEqual(users, []) + + user = group.add_user(user_id=user_test.id) + self.assertEqual(user.id, user_test.id) + self.assertEqual(user.username, user_test.username) + + users = group.list_users() + self.assertEqual(len(users), 1) + self.assertEqual(users[0].id, user_test.id) + + user = group.user_details(user_id=user_test.id) + self.assertEqual(user.id, user_test.id) + self.assertEqual(user.username, user_test.username) + + response = group.delete_user(user_id=user_test.id) + self.assertIsNone(response)