Skip to content
Open
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
29 changes: 19 additions & 10 deletions pyolite/models/lists/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ def add(self, user, permission):

@with_user
def edit(self, user, permission):
if user.name not in self.repo.users:
raise ValueError('User %s not exists in repo %s' %
(user.name, self.repository_model.name))

if set(map(lambda permission: permission.upper(), permission)) - \
ACCEPTED_PERMISSIONS != set([]):
raise ValueError('Invalid permissions. They must be from %s' %
ACCEPTED_PERMISSIONS)

pattern = r'(\s*)([RW+DC]*)(\s*)=(\s*)%s' % user.name
string = r"\n %s = %s" % (permission, user.name)

Expand Down Expand Up @@ -94,19 +103,19 @@ def set(self, users=None):
)
self.repository_model.git.commit(['conf'], commit_message)

def __iter__(self):
for user in self._user:
yield user
# def __iter__(self):
# for user in self._user:
# yield user

def __getitem__(self, item):
return self._users[item]
# def __getitem__(self, item):
# return self._users[item]

def __setitem__(self, item, value):
self._users[item] = value
# def __setitem__(self, item, value):
# self._users[item] = value

def __add__(self, items):
for item in items:
self.append(item)
# def __add__(self, items):
# for item in items:
# self.append(item)

def __str__(self):
return "['%s']" % ', '.join(self.repo.users)
144 changes: 142 additions & 2 deletions tests/lists/test_users.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,8 @@ def test_user_removing(self):
message = "Deleted user another_user from repository test_repo"
mocked_repository.git.commit.has_calls([call(['conf'], message)])

def test_user_edit_permissions(self):
@raises(ValueError)
def test_invalid_user_edit_permissions(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()
mocked_user = MagicMock()
Expand All @@ -121,7 +122,93 @@ def test_user_edit_permissions(self):
string = r"\n %s = %s" % ('R', 'another_user')
mocked_repo.replace.assert_called_once_with(pattern, string)

message = "User another_user has R permission for repository test_repo"
message = "User another_user not in repository test_repo"
mocked_repository.git.commit.has_calls([call(['conf'], message)])

@raises(ValueError)
def test_user_edit_invalid_permissions(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()
mocked_user = MagicMock()

mock_single_user = MagicMock()
mock_single_user.name = 'another_user'
mock_single_user.__str__ = lambda x: 'another_user'

mocked_repository.name = 'test_repo'
mocked_repository.path = 'path'

mocked_user.get.return_value = mock_single_user
mocked_repo.users = ['another_user']

with patch.multiple('pyolite.models.lists.users',
Repo=MagicMock(return_value=mocked_repo),
User=mocked_user):
repo_users = ListUsers(mocked_repository)
repo_users.edit('test', 'X')

pattern = r'(\s*)([RW+DC]*)(\s*)=(\s*)%s' % 'another_user'
string = r"\n %s = %s" % ('X', 'another_user')
mocked_repo.replace.assert_called_once_with(pattern, string)

message = "User another_user edit invalid permission for repository test_repo"
mocked_repository.git.commit.has_calls([call(['conf'], message)])

def test_valid_user_edit_valid_permissions(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()
mocked_user = MagicMock()

mock_single_user = MagicMock()
mock_single_user.name = 'another_user'
mock_single_user.__str__ = lambda x: 'another_user'

mocked_repository.name = 'test_repo'
mocked_repository.path = 'path'

mocked_user.get.return_value = mock_single_user
mocked_repo.users = ['another_user']

with patch.multiple('pyolite.models.lists.users',
Repo=MagicMock(return_value=mocked_repo),
User=mocked_user):
repo_users = ListUsers(mocked_repository)
repo_users.edit('test', 'R')

pattern = r'(\s*)([RW+DC]*)(\s*)=(\s*)%s' % 'another_user'
string = r"\n %s = %s" % ('R', 'another_user')
mocked_repo.replace.assert_called_once_with(pattern, string)

message = "User another_user have permission R in repository test_repo"
mocked_repository.git.commit.has_calls([call(['conf'], message)])

@raises(ValueError)
def test_user_edit_invalid_permissions(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()
mocked_user = MagicMock()

mock_single_user = MagicMock()
mock_single_user.name = 'another_user'
mock_single_user.__str__ = lambda x: 'another_user'

mocked_repository.name = 'test_repo'
mocked_repository.path = 'path'

mocked_user.get.return_value = mock_single_user
mocked_repo.users = ['another_user']

with patch.multiple('pyolite.models.lists.users',
Repo=MagicMock(return_value=mocked_repo),
User=mocked_user):
repo_users = ListUsers(mocked_repository)
repo_users.edit('test', 'X')

pattern = r'(\s*)([RW+DC]*)(\s*)=(\s*)%s' % 'another_user'
string = r"\n %s = %s" % ('X', 'another_user')
mocked_repo.replace.assert_called_once_with(pattern, string)

message = "User another_user edit invalid permission for repository test_repo"
mocked_repository.git.commit.has_calls([call(['conf'], message)])

def user_init(self, *args, **kwargs):
Expand Down Expand Up @@ -177,3 +264,56 @@ def test_users_set(self):

message = "Initialized repository test_repo with users: test, user"
mocked_repository.git.commit.has_calls([call(['conf'], message)])
def user_init(self, *args, **kwargs):
self.name = args[2]

@patch('pyolite.models.user.User.__init__', new=user_init)
def test_user_get_or_create(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()

mocked_repository.name = 'test_repo'
mocked_repository.path = 'path'

with patch.multiple('pyolite.models.lists.users',
Repo=MagicMock(return_value=mocked_repo)):
found_user = object()
mocked_user_get = MagicMock(return_value=found_user)

with patch.multiple('pyolite.models.user.User', get=mocked_user_get):
repo_users = ListUsers(mocked_repository)

# user found
user = repo_users.get_or_create('test_user')
assert user is found_user

# user created
mocked_user_get.side_effect = ValueError
user = repo_users.get_or_create('test_user')
assert user.name is 'test_user'

def test_users_set(self):
mocked_repo = MagicMock()
mocked_repository = MagicMock()
mocked_user = MagicMock()

mock_single_user = MagicMock()
mock_single_user.name = 'user'

mocked_repository.name = 'test_repo'
mocked_repository.path = 'path'

mocked_user.get.return_value = mock_single_user

with patch.multiple('pyolite.models.lists.users',
Repo=MagicMock(return_value=mocked_repo),
User=mocked_user):
repo_users = ListUsers(mocked_repository)
repo_users.set((('mocked', 'R'), ('mocked', 'RW+')))

serialized_users = "repo test_repo\n R = user\n" \
" RW+ = user\n"
mocked_repo.overwrite.assert_called_once_with(serialized_users)

message = "Initialized repository test_repo with users: test, user"
mocked_repository.git.commit.has_calls([call(['conf'], message)])