Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions syncano/models/accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down Expand Up @@ -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()
Expand Down
54 changes: 53 additions & 1 deletion tests/integration_test_user.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down Expand Up @@ -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)