aboutsummaryrefslogtreecommitdiffstats
path: root/github3
diff options
context:
space:
mode:
Diffstat (limited to 'github3')
-rw-r--r--github3/handlers/users.py46
-rw-r--r--github3/models/user.py11
-rw-r--r--github3/tests/fixtures.py13
-rw-r--r--github3/tests/user_handler_test.py121
4 files changed, 167 insertions, 24 deletions
diff --git a/github3/handlers/users.py b/github3/handlers/users.py
index 34ed013..08c6171 100644
--- a/github3/handlers/users.py
+++ b/github3/handlers/users.py
@@ -155,7 +155,7 @@ class AuthUser(User):
:param `user`: User model or username string
"""
- parse_user = str(getattr(user, 'login', user))
+ parse_user = getattr(user, 'login', user)
return self._bool('following/%s' % parse_user)
def follow(self, user):
@@ -179,23 +179,28 @@ class AuthUser(User):
parse_user = getattr(user, 'login', user)
return self._delete('following/%s' % parse_user)
- def get_keys(self):
+ def get_keys(self, limit=None):
""" Get public keys """
return self._get_resources('keys', model=models.Key,
limit=limit)
- def get_key(self, key_id):
- """ Get public key by id """
+ def get_key(self, key):
+ """ Get public key
+
+ :param `key`: Key model or key id
+
+ """
- return self._get_resource('keys/%s' % key_id, model=models.Key)
+ parse_key_id = getattr(key, 'id', key)
+ return self._get_resource('keys/%s' % parse_key_id, model=models.Key)
def create_key(self, **kwargs):
"""
Create public key
:param title
- :param key: Key string
+ :param key: Key string (It must starts with 'ssh-rsa')
"""
#TODO: render key.pub file
@@ -205,12 +210,17 @@ class AuthUser(User):
}
return self._post_resource('keys', data=key, model=models.Key)
- def delete_key(self, key_id):
- """ Delete public key """
+ def delete_key(self, key):
+ """ Delete public key
- return self._delete('keys/%s' % key_id)
+ :param `key`: Key model or key id
- def get_repos(self, filter='all'):
+ """
+
+ parse_key_id = getattr(key, 'id', key)
+ return self._delete('keys/%s' % parse_key_id)
+
+ def get_repos(self, filter='all', limit=None):
"""
Return user's public repositories
@@ -224,8 +234,8 @@ class AuthUser(User):
"""
Return true if you are watching the user repository
- :param owner: username
- :param repo: repository name
+ :param owner: Model user or username string
+ :param repo: Model repo or repo name string
is_watching_repo('copitux', 'python-github3')
"""
@@ -237,18 +247,22 @@ class AuthUser(User):
"""
Watch the repository
- :param owner: username
- :param repo: repository name
+ :param owner: Model user or username string
+ :param repo: Model repo or repo name string
"""
+ owner = getattr(owner, 'login', owner)
+ repo = getattr(repo, 'name', repo)
return self._put('watched/%s/%s' % (owner, repo))
def unwatch_repo(self, owner, repo):
"""
Unwatch the repository
- :param owner: username
- :param repo: repository name
+ :param owner: Model user or username string
+ :param repo: Model repo or repo name string
"""
+ owner = getattr(owner, 'login', owner)
+ repo = getattr(repo, 'name', repo)
return self._delete('watched/%s/%s' % (owner, repo))
diff --git a/github3/models/user.py b/github3/models/user.py
index 93201bd..aed6f09 100644
--- a/github3/models/user.py
+++ b/github3/models/user.py
@@ -52,17 +52,18 @@ class User(BaseResource):
}
def __repr__(self):
- return '<User %s>' % self.login
+ return '<User %s>' % getattr(self, 'login', 'without user')
#def handler(self):
- # return self._gh.user_handler(self.login, force=True)
+ # return self._gh.users
class AuthUser(User):
"""Github Authenticated User object model."""
- #def handler(self):
- # return self._gh.user_handler(self.login, force=True, private=True)
-
def __repr__(self):
return '<AuthUser %s>' % self.login
+
+ #def handler(self):
+ # return self._gh.users
+
diff --git a/github3/tests/fixtures.py b/github3/tests/fixtures.py
index 5f56753..ff5179c 100644
--- a/github3/tests/fixtures.py
+++ b/github3/tests/fixtures.py
@@ -23,8 +23,8 @@ GET_USER = {
"type": "User"
}
-GET_LINK = '<https://api.github.com/gists/public?page=2>; rel="next", \
-<https://api.github.com/gists/public?page=5>; rel="last"'
+GET_LINK = '<https://api.github.com/it_doesnt_matter?page=2>; rel="next", \
+<https://api.github.com/it_doesnt_matter?page=5>; rel="last"'
GET_RESOURCES = [
{'login': 'octocat'},
@@ -153,3 +153,12 @@ GET_USER_EMAILS = [
"octocat@github.com",
"support@github.com"
]
+
+GET_USER_KEYS = [
+ {
+ "url": "https://api.github.com/user/keys/1",
+ "id": 1,
+ "title": "octocat@octomac",
+ "key": "ssh-rsa AAA..."
+ }
+]
diff --git a/github3/tests/user_handler_test.py b/github3/tests/user_handler_test.py
index b1fd0d0..28fda3b 100644
--- a/github3/tests/user_handler_test.py
+++ b/github3/tests/user_handler_test.py
@@ -5,7 +5,7 @@ from unittest import TestCase
from mock import Mock, patch
from github3 import api
from fixtures import *
-from github3.models import User, AuthUser, Repo, Gist, Org
+from github3.models import User, AuthUser, Repo, Gist, Org, Key
from github3.exceptions import *
@@ -15,6 +15,8 @@ class TestAuthUserHandler(TestCase):
def setUp(self):
self.gh = api.Github('test', 'pass')
self.handler = self.gh.users
+ self.user_mock = Mock()
+ self.user_mock.login = 'user_model'
@patch.object(api.Github, 'get')
def test_get(self, get):
@@ -48,6 +50,123 @@ class TestAuthUserHandler(TestCase):
method='delete')
self.assertTrue(emails)
+ @patch.object(api.Github, 'head')
+ def test_is_following(self, head):
+ response = head.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.is_following('test'))
+ head.assert_called_with('user/following/test')
+ self.handler.is_following(self.user_mock)
+ head.assert_called_with('user/following/user_model')
+
+ @patch.object(api.Github, 'put')
+ def test_follow(self, put):
+ response = put.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.follow('test'))
+ put.assert_called_with('user/following/test', method='put')
+
+ @patch.object(api.Github, 'delete')
+ def test_unfollow(self, delete):
+ response = delete.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.unfollow('test'))
+ delete.assert_called_with('user/following/test', method='delete')
+
+ @patch.object(api.Github, '_request')
+ def test_get_keys(self, request):
+ response = request.return_value
+ response.status_code = 200
+ response.content = self.gh._parser.dumps(GET_USER_KEYS)
+ response.headers = {'link': GET_LINK} # 1 per page
+ keys = list(self.handler.get_keys())
+ self.assertEquals(len(keys), 5)
+ self.assertIsInstance(keys[0], Key)
+ request.assert_called_with('GET', 'user/keys', page=5)
+ keys = list(self.handler.get_keys(limit=2))
+ self.assertEquals(len(keys), 2)
+
+ @patch.object(api.Github, 'get')
+ def test_get_key(self, get):
+ get.return_value = GET_USER_KEYS[0]
+ key = self.handler.get_key(1)
+ self.assertIsInstance(key, Key)
+ get.assert_called_with('user/keys/1')
+ model_key = Mock()
+ model_key.id = 1
+ key = self.handler.get_key(model_key)
+ get.assert_called_with('user/keys/1')
+
+ @patch.object(api.Github, 'post')
+ def test_create_key(self, post):
+ post.return_value = GET_USER_KEYS[0]
+ key_data = {'title': 'some', 'key': 'ssh-rsa AAA'}
+ created_key = self.handler.create_key(**key_data)
+ self.assertIsInstance(created_key, Key)
+ post.assert_called_with('user/keys', data=key_data)
+
+ @patch.object(api.Github, 'delete')
+ def test_delete_key(self, delete):
+ response = delete.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.delete_key(1))
+ delete.assert_called_with('user/keys/1', method='delete')
+ model_key = Mock()
+ model_key.id = 1
+ key = self.handler.delete_key(model_key)
+ delete.assert_called_with('user/keys/1', method='delete')
+
+ @patch.object(api.Github, '_request')
+ def test_get_repos(self, request):
+ response = request.return_value
+ response.status_code = 200
+ response.content = self.gh._parser.dumps(GET_SHORT_REPOS)
+ response.headers = {'link': GET_LINK} # 1 per page
+ repos = list(self.handler.get_repos(filter='public'))
+ self.assertEquals(len(repos), 5)
+ self.assertIsInstance(repos[0], Repo)
+ request.assert_called_with('GET', 'user/repos',
+ page=5, type='public')
+ repos = list(self.handler.get_repos(limit=2))
+ self.assertEquals(len(repos), 2)
+
+ @patch.object(api.Github, 'head')
+ def test_is_watching_repo(self, head):
+ response = head.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.is_watching_repo('user', 'repo'))
+ head.assert_called_with('user/watched/user/repo')
+ model_user, model_repo = Mock(), Mock()
+ model_user.login = 'user'
+ model_repo.name = 'repo'
+ self.assertTrue(self.handler.is_watching_repo('user', 'repo'))
+ head.assert_called_with('user/watched/user/repo')
+
+ @patch.object(api.Github, 'put')
+ def test_watch_repo(self, put):
+ response = put.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.watch_repo('user', 'repo'))
+ put.assert_called_with('user/watched/user/repo', method='put')
+ model_user, model_repo = Mock(), Mock()
+ model_user.login = 'user'
+ model_repo.name = 'repo'
+ self.assertTrue(self.handler.watch_repo('user', 'repo'))
+ put.assert_called_with('user/watched/user/repo', method='put')
+
+ @patch.object(api.Github, 'delete')
+ def test_unwatch_repo(self, delete):
+ response = delete.return_value
+ response.status_code = 204
+ self.assertTrue(self.handler.unwatch_repo('user', 'repo'))
+ delete.assert_called_with('user/watched/user/repo', method='delete')
+ model_user, model_repo = Mock(), Mock()
+ model_user.login = 'user'
+ model_repo.name = 'repo'
+ self.assertTrue(self.handler.unwatch_repo('user', 'repo'))
+ delete.assert_called_with('user/watched/user/repo', method='delete')
+
+
class TestUserHandler(TestCase):
""" Test public api about users """