diff options
-rw-r--r-- | gitlab/objects.py | 48 | ||||
-rw-r--r-- | gitlab/tests/test_manager.py | 49 | ||||
-rw-r--r-- | tools/python_test.py | 21 |
3 files changed, 115 insertions, 3 deletions
diff --git a/gitlab/objects.py b/gitlab/objects.py index 57b8e14..8e94cb2 100644 --- a/gitlab/objects.py +++ b/gitlab/objects.py @@ -34,9 +34,7 @@ from gitlab.exceptions import * # noqa class jsonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, GitlabObject): - return {k: v for k, v in six.iteritems(obj.__dict__) - if (not isinstance(v, BaseManager) - and not k[0] == '_')} + return obj.as_dict() elif isinstance(obj, gitlab.Gitlab): return {'url': obj._url} return json.JSONEncoder.default(self, obj) @@ -488,6 +486,19 @@ class GitlabObject(object): """ return json.dumps(self, cls=jsonEncoder) + def as_dict(self): + """Dump the object as a dict.""" + return {k: v for k, v in six.iteritems(self.__dict__) + if (not isinstance(v, BaseManager) and not k[0] == '_')} + + def __eq__(self, other): + if type(other) is type(self): + return self.as_dict() == other.as_dict() + return False + + def __ne__(self, other): + return not self.__eq__(other) + class UserKey(GitlabObject): _url = '/users/%(user_id)s/keys' @@ -541,10 +552,41 @@ class User(GitlabObject): raise_error_from_response(r, GitlabUnblockError) self.state = 'active' + def __eq__(self, other): + if type(other) is type(self): + selfdict = self.as_dict() + otherdict = other.as_dict() + selfdict.pop(u'password', None) + otherdict.pop(u'password', None) + return selfdict == otherdict + return False + class UserManager(BaseManager): obj_cls = User + def search(self, query, **kwargs): + """Search users. + + Returns a list of matching users. + """ + url = self.obj_cls._url + '?search=' + query + return self._custom_list(url, self.obj_cls, **kwargs) + + def get_by_username(self, username, **kwargs): + """Get a user by its username. + + Returns a User object or None if the named user does not + exist. + """ + url = self.obj_cls._url + '?username=' + username + results = self._custom_list(url, self.obj_cls, **kwargs) + assert len(results) in (0, 1) + try: + return results[0] + except IndexError: + raise GitlabGetError('no such user: ' + username) + class CurrentUserKey(GitlabObject): _url = '/user/keys' diff --git a/gitlab/tests/test_manager.py b/gitlab/tests/test_manager.py index f1286af..59987a7 100644 --- a/gitlab/tests/test_manager.py +++ b/gitlab/tests/test_manager.py @@ -235,6 +235,55 @@ class TestGitlabManager(unittest.TestCase): self.assertEqual(data[0].id, 1) self.assertEqual(data[1].id, 2) + def test_user_manager_search(self): + mgr = UserManager(self.gitlab) + + @urlmatch(scheme="http", netloc="localhost", path="/api/v3/users", + query="search=foo", method="get") + def resp_get_search(url, request): + headers = {'content-type': 'application/json'} + content = ('[{"name": "foo1", "id": 1}, ' + '{"name": "foo2", "id": 2}]') + content = content.encode("utf-8") + return response(200, content, headers, None, 5, request) + + with HTTMock(resp_get_search): + data = mgr.search('foo') + self.assertEqual(type(data), list) + self.assertEqual(2, len(data)) + self.assertEqual(type(data[0]), User) + self.assertEqual(type(data[1]), User) + self.assertEqual(data[0].name, "foo1") + self.assertEqual(data[1].name, "foo2") + self.assertEqual(data[0].id, 1) + self.assertEqual(data[1].id, 2) + + def test_user_manager_get_by_username(self): + mgr = UserManager(self.gitlab) + + @urlmatch(scheme="http", netloc="localhost", path="/api/v3/users", + query="username=foo", method="get") + def resp_get_username(url, request): + headers = {'content-type': 'application/json'} + content = '[{"name": "foo", "id": 1}]'.encode("utf-8") + return response(200, content, headers, None, 5, request) + + with HTTMock(resp_get_username): + data = mgr.get_by_username('foo') + self.assertEqual(type(data), User) + self.assertEqual(data.name, "foo") + self.assertEqual(data.id, 1) + + @urlmatch(scheme="http", netloc="localhost", path="/api/v3/users", + query="username=foo", method="get") + def resp_get_username_nomatch(url, request): + headers = {'content-type': 'application/json'} + content = '[]'.encode("utf-8") + return response(200, content, headers, None, 5, request) + + with HTTMock(resp_get_username_nomatch): + self.assertRaises(GitlabGetError, mgr.get_by_username, 'foo') + def test_group_manager_search(self): mgr = GroupManager(self.gitlab) diff --git a/tools/python_test.py b/tools/python_test.py index aa881b1..d32dccd 100644 --- a/tools/python_test.py +++ b/tools/python_test.py @@ -43,12 +43,33 @@ assert(new_user.email == user.email) new_user.block() new_user.unblock() +foobar_user = gl.users.create( + {'email': 'foobar@example.com', 'username': 'foobar', + 'name': 'Foo Bar', 'password': 'foobar_password'}) + +assert gl.users.search('foobar') == [foobar_user] +usercmp = lambda x,y: cmp(x.id, y.id) +expected = sorted([new_user, foobar_user], cmp=usercmp) +actual = sorted(gl.users.search('foo'), cmp=usercmp) +assert expected == actual +assert gl.users.search('asdf') == [] + +assert gl.users.get_by_username('foobar') == foobar_user +assert gl.users.get_by_username('foo') == new_user +try: + gl.users.get_by_username('asdf') +except gitlab.GitlabGetError: + pass +else: + assert False + # SSH keys key = new_user.keys.create({'title': 'testkey', 'key': SSH_KEY}) assert(len(new_user.keys.list()) == 1) key.delete() new_user.delete() +foobar_user.delete() assert(len(gl.users.list()) == 1) # current user key |