Skip to content

Commit 932c2b6

Browse files
committed
Adding tests for all methods defined in ide/git.py, revising the script to run all tests.
1 parent d810415 commit 932c2b6

File tree

4 files changed

+239
-41
lines changed

4 files changed

+239
-41
lines changed

ide/run_tests.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

ide/test_git.py

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
"""
2+
Tests in this file can be run with python manage.py test ide/
3+
"""
4+
5+
from django.conf import settings
6+
from django.test import TestCase
7+
from mock import MagicMock, Mock, patch, PropertyMock
8+
import git
9+
10+
11+
@patch('ide.git.git_verify_tokens')
12+
class GitAuthCheckTest(TestCase):
13+
def setUp(self):
14+
self.f = Mock()
15+
self.f.return_value = "test result"
16+
17+
self.mock_user = MagicMock()
18+
19+
def test_invalid_tokens(self, mock_verify_tokens):
20+
mock_verify_tokens.return_value = False
21+
g = git.git_auth_check(self.f)
22+
23+
self.assertRaises(Exception, g, self.mock_user)
24+
25+
def test_bad_credentials_expection(self, mock_verify_tokens):
26+
mock_verify_tokens.return_value = True
27+
self.f.side_effect = git.BadCredentialsException(None, None)
28+
g = git.git_auth_check(self.f)
29+
30+
self.assertRaises(git.BadCredentialsException, g, self.mock_user)
31+
self.mock_user.github.delete.assert_called_once_with()
32+
33+
def test_other_excpetion(self, mock_verify_tokens):
34+
mock_verify_tokens.return_value = True
35+
self.f.side_effect = Exception("Test exception")
36+
g = git.git_auth_check(self.f)
37+
38+
self.assertRaises(Exception, g, self.mock_user)
39+
self.assertEqual(0, self.mock_user.github.delete.call_count)
40+
41+
def test_successful_auth_check(self, mock_verify_tokens):
42+
mock_verify_tokens.return_value = True
43+
g = git.git_auth_check(self.f)
44+
45+
self.assertEquals("test result", g(self.mock_user))
46+
self.assertEqual(0, self.mock_user.github.delete.call_count)
47+
48+
49+
@patch('ide.git.urllib2.urlopen')
50+
@patch('ide.git.json.loads')
51+
@patch('ide.git.urllib2.Request')
52+
class GitVerifyTokensTest(TestCase):
53+
def setUp(self):
54+
self.mock_user = MagicMock()
55+
self.mock_user.github = Mock()
56+
self.mock_user.github.token = "123456"
57+
58+
self.mock_request = MagicMock()
59+
60+
self.urlopen_read_result_mock = Mock()
61+
self.urlopen_result_mock = Mock()
62+
self.urlopen_result_mock.read.return_value = self.urlopen_read_result_mock
63+
64+
def test_user_does_not_exist(self, request_mock, loads_mock, urlopen_mock):
65+
error_raising_property = PropertyMock(side_effect=git.UserGithub.DoesNotExist(None));
66+
type(self.mock_user).github = error_raising_property
67+
68+
self.assertFalse(git.git_verify_tokens(self.mock_user))
69+
70+
self.assertEqual(0, request_mock.call_count)
71+
self.assertEqual(0, loads_mock.call_count)
72+
self.assertEqual(0, urlopen_mock.call_count)
73+
74+
def test_github_token_none(self, request_mock, loads_mock, urlopen_mock):
75+
self.mock_user.github.token = None
76+
77+
self.assertFalse(git.git_verify_tokens(self.mock_user))
78+
79+
self.assertEqual(0, request_mock.call_count)
80+
self.assertEqual(0, loads_mock.call_count)
81+
self.assertEqual(0, urlopen_mock.call_count)
82+
83+
84+
def test_github_token_no_such_token(self, request_mock, loads_mock, urlopen_mock):
85+
request_mock.return_value = self.mock_request
86+
loads_mock.side_effect = git.urllib2.HTTPError("Squirrels not found", 404, None, None, None)
87+
urlopen_mock.return_value = self.urlopen_result_mock
88+
self.mock_user.github.delete = Mock()
89+
90+
self.assertFalse(git.git_verify_tokens(self.mock_user))
91+
92+
request_mock.assert_called_once_with("https://api.github.com/applications/%s/tokens/%s" %
93+
(settings.GITHUB_CLIENT_ID, self.mock_user.github.token))
94+
loads_mock.assert_called_once_with(self.urlopen_read_result_mock)
95+
urlopen_mock.assert_called_once_with(self.mock_request)
96+
self.urlopen_result_mock.read.assert_called_once_with()
97+
self.mock_user.github.delete.assert_called_once_with()
98+
99+
def test_other_http_error(self, request_mock, loads_mock, urlopen_mock):
100+
request_mock.return_value = self.mock_request
101+
loads_mock.side_effect = git.urllib2.HTTPError("Squirrels are black, not red", 406, None, None, None)
102+
urlopen_mock.return_value = self.urlopen_result_mock
103+
self.mock_user.github.delete = Mock()
104+
105+
self.assertFalse(git.git_verify_tokens(self.mock_user))
106+
107+
request_mock.assert_called_once_with("https://api.github.com/applications/%s/tokens/%s" %
108+
(settings.GITHUB_CLIENT_ID, self.mock_user.github.token))
109+
loads_mock.assert_called_once_with(self.urlopen_read_result_mock)
110+
urlopen_mock.assert_called_once_with(self.mock_request)
111+
self.urlopen_result_mock.read.assert_called_once_with()
112+
self.assertEqual(0, self.mock_user.github.delete.call_count)
113+
114+
def test_github_token_verified(self, request_mock, loads_mock, urlopen_mock):
115+
request_mock.return_value = self.mock_request
116+
urlopen_mock.return_value = self.urlopen_result_mock
117+
118+
self.assertTrue(git.git_verify_tokens(self.mock_user))
119+
120+
request_mock.assert_called_once_with("https://api.github.com/applications/%s/tokens/%s" %
121+
(settings.GITHUB_CLIENT_ID, self.mock_user.github.token))
122+
loads_mock.assert_called_once_with(self.urlopen_read_result_mock)
123+
urlopen_mock.assert_called_once_with(self.mock_request)
124+
self.urlopen_result_mock.read.assert_called_once_with()
125+
126+
127+
class GetGithubTest(TestCase):
128+
def setUp(self):
129+
self.mock_user = Mock()
130+
self.mock_user.github = Mock()
131+
self.mock_user.github.token = "12345"
132+
133+
@patch('ide.git.Github')
134+
def test_get_github_basic(self, mock_github):
135+
test_result = git.get_github(self.mock_user)
136+
mock_github.assert_called_once_with(
137+
"12345",
138+
client_id=settings.GITHUB_CLIENT_ID,
139+
client_secret=settings.GITHUB_CLIENT_SECRET)
140+
141+
142+
@patch('ide.git.get_github')
143+
class CheckRepoAccessTest(TestCase):
144+
def setUp(self):
145+
self.mock_repo = MagicMock()
146+
147+
self.mock_github = MagicMock(spec=git.Github)
148+
self.mock_github.get_repo.return_value = self.mock_repo
149+
150+
self.mock_user = Mock()
151+
self.mock_user.github = Mock()
152+
self.mock_user.github.username = "FuzzyWuzzy"
153+
154+
self.repo_name = "bear/bear_code"
155+
156+
def test_repo_access(self, mock_get_github):
157+
mock_get_github.return_value = self.mock_github
158+
self.mock_repo.has_in_collaborators.return_value = True
159+
160+
self.assertTrue(git.check_repo_access(self.mock_user, self.repo_name))
161+
162+
mock_get_github.assert_called_once_with(self.mock_user)
163+
self.mock_github.get_repo.assert_called_once_with(self.repo_name)
164+
165+
named_user = self.mock_repo.has_in_collaborators.call_args[0][0]
166+
self.assertEquals(self.mock_user.github.username, named_user._login)
167+
self.assertIsNone(named_user._requester)
168+
self.assertFalse(named_user._CompletableGithubObject__completed)
169+
170+
def test_no_repo_access(self, mock_get_github):
171+
mock_get_github.return_value = self.mock_github
172+
self.mock_repo.has_in_collaborators.return_value = False
173+
174+
self.assertFalse(git.check_repo_access(self.mock_user, self.repo_name))
175+
176+
mock_get_github.assert_called_once_with(self.mock_user)
177+
self.mock_github.get_repo.assert_called_once_with(self.repo_name)
178+
179+
named_user = self.mock_repo.has_in_collaborators.call_args[0][0]
180+
self.assertEquals(self.mock_user.github.username, named_user._login)
181+
self.assertIsNone(named_user._requester)
182+
self.assertFalse(named_user._CompletableGithubObject__completed)
183+
184+
def test_get_repo_error(self, mock_get_github):
185+
mock_get_github.return_value = self.mock_github
186+
self.mock_github.get_repo.side_effect = git.UnknownObjectException(404, "Not Found")
187+
188+
self.assertRaises(git.UnknownObjectException,
189+
git.check_repo_access,
190+
self.mock_user,
191+
self.repo_name)
192+
193+
mock_get_github.assert_called_once_with(self.mock_user)
194+
self.mock_github.get_repo.assert_called_once_with(self.repo_name)
195+
self.assertEqual(0, self.mock_repo.call_count)
196+
197+
198+
class UrlToReposTest(TestCase):
199+
def test_basic_url_to_repo(self):
200+
"""
201+
Tests that a simple repo url is correctly recognized.
202+
"""
203+
username, reponame = git.url_to_repo("https://github.com/pebble/cloudpebble")
204+
self.assertEqual("pebble", username)
205+
self.assertEqual("cloudpebble", reponame)
206+
207+
def test_strange_url_to_repo(self):
208+
"""
209+
Tests that a non-standard repo url is correctly recognized.
210+
"""
211+
username, reponame = git.url_to_repo("git://github.com:foo/bar.git")
212+
self.assertEqual("foo", username)
213+
self.assertEqual("bar", reponame)
214+
215+
216+
def test_bad_url_to_repo(self):
217+
"""
218+
Tests that a entirely different url returns None.
219+
"""
220+
self.assertEqual(None, git.url_to_repo("http://www.cuteoverload.com"))
221+
222+
223+
@patch('ide.git.get_github')
224+
@patch('ide.git.git_verify_tokens')
225+
class CreateRepoTest(TestCase):
226+
def test_expected_call(self, mock_verify_tokens, mock_get_github):
227+
mock_user = MagicMock()
228+
mock_github = Mock()
229+
mock_github.get_user = Mock(return_value=mock_user)
230+
mock_get_github.return_value = mock_github
231+
232+
self.assertTrue(git.create_repo("user", "repo", "description"))
233+
234+
mock_verify_tokens.assert_called_once_with("user")
235+
mock_get_github.assert_called_once_with("user")
236+
mock_user.create_repo.assert_called_once_with("repo", description="description", auto_init=True)

ide/tests.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

run_all_tests.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/usr/bin/env bash
2+
3+
python manage.py test

0 commit comments

Comments
 (0)