Skip to content

Commit 5e5193b

Browse files
committed
users are 100% covered
1 parent 9fec046 commit 5e5193b

3 files changed

Lines changed: 233 additions & 25 deletions

File tree

github3/users.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,21 +85,6 @@ def is_free(self):
8585
return self.name == 'free' # (No coverage)
8686

8787

88-
_large = Plan({'name': 'large', 'private_repos': 50,
89-
'collaborators': 25, 'space': 0})
90-
_medium = Plan({'name': 'medium', 'private_repos': 20,
91-
'collaborators': 10, 'space': 0})
92-
_small = Plan({'name': 'small', 'private_repos': 10,
93-
'collaborators': 5, 'space': 0})
94-
_micro = Plan({'name': 'micro', 'private_repos': 5,
95-
'collaborators': 1, 'space': 0})
96-
_free = Plan({'name': 'free', 'private_repos': 0,
97-
'collaborators': 0, 'space': 0})
98-
99-
plans = {'large': _large, 'medium': _medium, 'small': _small,
100-
'micro': _micro, 'free': _free}
101-
102-
10388
class User(BaseAccount):
10489
"""The :class:`User <User>` object. This handles and structures information
10590
in the `User section <http://developer.github.com/v3/users/>`_.
@@ -130,10 +115,7 @@ def __init__(self, user, session=None):
130115
self.total_private_repos = user.get('total_private_repos', 0)
131116

132117
#: Which plan this user is on
133-
self.plan = None
134-
if user.get('plan'):
135-
self.plan = plans[user['plan']['name'].lower()]
136-
self.plan.space = user['plan']['space']
118+
self.plan = Plan(user.get('plan', {}))
137119

138120
def __repr__(self):
139121
return '<User [{0}:{1}]>'.format(self.login, self.name)
@@ -189,11 +171,6 @@ def delete_email_addresses(self, addresses=[]):
189171
return self._boolean(self._delete(url, data=dumps(addresses)),
190172
204, 404)
191173

192-
@property
193-
def for_hire(self):
194-
"""DEPRECATED: Use hireable instead"""
195-
raise DeprecationWarning('Use hireable instead')
196-
197174
def is_assignee_on(self, login, repository):
198175
"""Checks if this user can be assigned to issues on login/repository.
199176
@@ -315,4 +292,4 @@ def update(self, name=None, email=None, blog=None, company=None,
315292
if json:
316293
self._update_(json)
317294
return True
318-
return False # (No coverage)
295+
return False

tests/test_users.py

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,229 @@
1+
import github3
2+
from mock import patch
3+
from tests.utils import (expect, BaseCase, load)
4+
5+
6+
class TestKey(BaseCase):
7+
def __init__(self, methodName='runTest'):
8+
super(TestKey, self).__init__(methodName)
9+
self.key = github3.users.Key(load('key'))
10+
self.api = "https://api.github.com/user/keys/10"
11+
12+
def setUp(self):
13+
super(TestKey, self).setUp()
14+
self.key = github3.users.Key(self.key.to_json(), self.g)
15+
16+
def test_str(self):
17+
expect(str(self.key)) == self.key.key
18+
expect(repr(self.key).startswith('<User Key')).is_True()
19+
20+
def test_delete(self):
21+
self.response('', 204)
22+
self.delete(self.api)
23+
24+
with expect.githuberror():
25+
self.key.delete()
26+
27+
self.not_called()
28+
self.login()
29+
expect(self.key.delete()).is_True()
30+
self.mock_assertions()
31+
32+
def test_update(self):
33+
self.response('key', 200)
34+
self.patch(self.api)
35+
self.conf = {
36+
'data': {
37+
'key': 'fakekey',
38+
'title': 'New title',
39+
}
40+
}
41+
42+
with expect.githuberror():
43+
self.key.update(None, None)
44+
45+
self.login()
46+
47+
expect(self.key.update(None, None)).is_False()
48+
self.not_called()
49+
expect(self.key.update(**self.conf['data'])).is_True()
50+
self.mock_assertions()
51+
52+
53+
class TestPlan(BaseCase):
54+
def __init__(self, methodName='runTest'):
55+
super(TestPlan, self).__init__(methodName)
56+
self.plan = github3.users.Plan({
57+
'name': 'free',
58+
'space': 400,
59+
'collaborators': 10,
60+
'private_repos': 20,
61+
})
62+
63+
def test_str(self):
64+
expect(str(self.plan)) == self.plan.name
65+
expect(repr(self.plan)) == '<Plan [free]>'
66+
expect(self.plan.is_free()).is_True()
67+
68+
69+
class TestUser(BaseCase):
70+
def __init__(self, methodName='runTest'):
71+
super(TestUser, self).__init__(methodName)
72+
self.user = github3.users.User(load('user'))
73+
self.api = "https://api.github.com/users/sigmavirus24"
74+
75+
def setUp(self):
76+
super(TestUser, self).setUp()
77+
self.user = github3.users.User(self.user.to_json(), self.g)
78+
79+
def test_str(self):
80+
expect(str(self.user)) == 'sigmavirus24'
81+
expect(repr(self.user)) == '<User [sigmavirus24:Ian Cordasco]>'
82+
83+
def test_add_email_address(self):
84+
with expect.githuberror():
85+
self.user.add_email_address('foo')
86+
87+
self.not_called()
88+
self.login()
89+
with patch.object(github3.users.User, 'add_email_addresses') as p:
90+
self.user.add_email_address('foo')
91+
p.assert_called_once_with(['foo'])
92+
93+
def test_add_email_addresses(self):
94+
self.response('emails', 201, _iter=True)
95+
self.post(self.github_url + 'user/emails')
96+
self.conf = {
97+
'data': '["foo@bar.com"]',
98+
}
99+
100+
with expect.githuberror():
101+
self.user.add_email_addresses([])
102+
103+
self.not_called()
104+
self.login()
105+
106+
self.user.add_email_addresses(['foo@bar.com'])
107+
self.mock_assertions()
108+
109+
def test_delete_email_address(self):
110+
with expect.githuberror():
111+
self.user.delete_email_address('foo')
112+
113+
self.not_called()
114+
self.login()
115+
with patch.object(github3.users.User, 'delete_email_addresses') as p:
116+
self.user.delete_email_address('foo')
117+
p.assert_called_once_with(['foo'])
118+
119+
def test_delete_email_addresses(self):
120+
self.response('', 204)
121+
self.delete(self.github_url + 'user/emails')
122+
self.conf = {
123+
'data': '["foo@bar.com"]'
124+
}
125+
126+
with expect.githuberror():
127+
self.user.delete_email_addresses([])
128+
129+
self.not_called()
130+
self.login()
131+
expect(
132+
self.user.delete_email_addresses(['foo@bar.com'])
133+
).is_True()
134+
self.mock_assertions()
135+
136+
def test_is_assignee_on(self):
137+
self.response('', 404)
138+
self.get(self.github_url + 'repos/abc/def/assignees/sigmavirus24')
139+
140+
expect(self.user.is_assignee_on('abc', 'def')).is_False()
141+
self.mock_assertions()
142+
143+
def test_iter_events(self):
144+
self.response('event', 200, _iter=True)
145+
self.get(self.api + '/events')
146+
147+
expect(next(self.user.iter_events())).isinstance(github3.events.Event)
148+
self.mock_assertions()
149+
150+
self.get(self.api + '/events/public')
151+
next(self.user.iter_events(public=True))
152+
self.mock_assertions()
153+
154+
def test_iter_followers(self):
155+
self.response('user', 200, _iter=True)
156+
self.get(self.api + '/followers')
157+
158+
expect(next(self.user.iter_followers())).isinstance(github3.users.User)
159+
self.mock_assertions()
160+
161+
def test_iter_following(self):
162+
self.response('user', 200, _iter=True)
163+
self.get(self.api + '/following')
164+
165+
expect(next(self.user.iter_following())).isinstance(github3.users.User)
166+
self.mock_assertions()
167+
168+
def test_iter_org_events(self):
169+
self.response('event', 200, _iter=True)
170+
self.get(self.api + '/events/orgs/foo')
171+
172+
with expect.raises(StopIteration):
173+
next(self.user.iter_org_events(None))
174+
175+
self.not_called()
176+
expect(next(self.user.iter_org_events('foo'))).isinstance(
177+
github3.events.Event)
178+
self.mock_assertions()
179+
180+
def test_iter_received_events(self):
181+
self.response('event', 200, _iter=True)
182+
self.get(self.api + '/received_events')
183+
184+
expect(next(self.user.iter_received_events())).isinstance(
185+
github3.events.Event)
186+
self.mock_assertions()
187+
188+
self.get(self.api + '/received_events/public')
189+
next(self.user.iter_received_events(public=True))
190+
self.mock_assertions()
191+
192+
def test_iter_starred(self):
193+
self.response('repo', 200, _iter=True)
194+
self.get(self.api + '/starred')
195+
196+
expect(next(self.user.iter_starred())).isinstance(
197+
github3.repos.Repository)
198+
self.mock_assertions()
199+
200+
def test_iter_subscriptions(self):
201+
self.response('repo', 200, _iter=True)
202+
self.get(self.api + '/subscriptions')
203+
204+
expect(next(self.user.iter_subscriptions())).isinstance(
205+
github3.repos.Repository)
206+
self.mock_assertions()
207+
208+
def test_update(self):
209+
self.response('user', 200)
210+
self.patch('https://api.github.com/user')
211+
self.conf = {
212+
'data': {
213+
'name': 'Ian Cordasco',
214+
'email': 'ian@cor.da.sc.o',
215+
'blog': 'http://example.com/blog',
216+
'hireable': True,
217+
}
218+
}
219+
220+
with expect.githuberror():
221+
self.user.update()
222+
223+
self.not_called()
224+
self.login()
225+
expect(self.user.update(**self.conf['data'])).is_True()
226+
self.mock_assertions()
227+
228+
self.response('', 404)
229+
expect(self.user.update(**self.conf['data'])).is_False()

tests/utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ def githuberror(cls):
5656

5757

5858
class BaseCase(TestCase):
59+
github_url = 'https://api.github.com/'
60+
5961
def setUp(self):
6062
self.g = github3.GitHub()
6163
self.args = ()

0 commit comments

Comments
 (0)