Skip to content

Commit d67d194

Browse files
committed
Add tests for Gogs client
1 parent 8f70ad2 commit d67d194

File tree

1 file changed

+246
-0
lines changed

1 file changed

+246
-0
lines changed

tests/interface_test.py

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
import base64
2+
import json
3+
import unittest
4+
5+
import responses
6+
from future.moves.urllib.parse import parse_qs
7+
from builtins import bytes
8+
9+
import gogs_client
10+
import gogs_client.http_utils as http_utils
11+
12+
13+
class GogsClientInterfaceTest(unittest.TestCase):
14+
15+
def setUp(self):
16+
self.api_endpoint = "https://www.example.com/api/v1/"
17+
self.base_url = "https://www.example.com/"
18+
self.client = gogs_client.GogsApi(self.base_url)
19+
self.repo_json_str = """{
20+
"id": 27,
21+
"owner": {
22+
"id": 1,
23+
"username": "unknwon",
24+
"full_name": "",
25+
"email": "u@gogs.io",
26+
"avatar_url": "/avatars/1"
27+
},
28+
"full_name": "unknwon/Hello-World",
29+
"private": false,
30+
"fork": false,
31+
"html_url": "http://localhost:3000/unknwon/Hello-World",
32+
"clone_url": "http://localhost:3000/unknwon/hello-world.git",
33+
"ssh_url": "jiahuachen@localhost:unknwon/hello-world.git",
34+
"permissions": {
35+
"admin": true,
36+
"push": true,
37+
"pull": true
38+
}
39+
}"""
40+
self.user_json_str = """{
41+
"id": 1,
42+
"username": "unknwon",
43+
"full_name": "",
44+
"email": "u@gogs.io",
45+
"avatar_url": "/avatars/1"
46+
}"""
47+
self.token = gogs_client.GogsToken("mytoken")
48+
self.username_password = gogs_client.GogsUsernamePassword(
49+
"auth_username", "password")
50+
self.expected_repo = gogs_client.GogsRepo.from_json(json.loads(self.repo_json_str))
51+
self.expected_user = gogs_client.GogsUser.from_json(json.loads(self.user_json_str))
52+
53+
@responses.activate
54+
def test_create_repo1(self):
55+
uri = self.path("/user/repos")
56+
responses.add(responses.POST, uri, body=self.repo_json_str)
57+
repo = self.client.create_repo(self.token, "AGreatRepo")
58+
self.assert_repos_equal(repo, self.expected_repo)
59+
self.assertEqual(len(responses.calls), 1)
60+
call = responses.calls[0]
61+
self.assertEqual(call.request.url, self.path_with_token(uri))
62+
63+
@responses.activate
64+
def test_repo_exists1(self):
65+
uri1 = self.path("/repos/username/repo1")
66+
uri2 = self.path("/repos/username/repo2")
67+
responses.add(responses.GET, uri1, body=self.repo_json_str, status=200)
68+
responses.add(responses.GET, uri2, status=404)
69+
self.assertTrue(self.client.repo_exists(self.token, "username", "repo1"))
70+
self.assertFalse(self.client.repo_exists(self.token, "username", "repo2"))
71+
self.assertEqual(len(responses.calls), 2)
72+
first_call = responses.calls[0]
73+
self.assertEqual(first_call.request.url, self.path_with_token(uri1))
74+
last_call = responses.calls[1]
75+
self.assertEqual(last_call.request.url, self.path_with_token(uri2))
76+
77+
@responses.activate
78+
def test_get_repo1(self):
79+
uri1 = self.path("/repos/username/repo1")
80+
uri2 = self.path("/repos/username/repo2")
81+
responses.add(responses.GET, uri1, body=self.repo_json_str, status=200)
82+
responses.add(responses.GET, uri2, status=404)
83+
repo = self.client.get_repo(self.token, "username", "repo1")
84+
self.assert_repos_equal(repo, self.expected_repo)
85+
self.assertRaises(gogs_client.GogsApi.ApiFailure, self.client.get_repo,
86+
self.token, "username", "repo2")
87+
self.assertEqual(len(responses.calls), 2)
88+
first_call = responses.calls[0]
89+
self.assertEqual(first_call.request.url, self.path_with_token(uri1))
90+
last_call = responses.calls[1]
91+
self.assertEqual(last_call.request.url, self.path_with_token(uri2))
92+
93+
@responses.activate
94+
def test_delete_repo1(self):
95+
uri1 = self.path("/repos/username/repo1")
96+
uri2 = self.path("/repos/otherusername/repo2")
97+
responses.add(responses.DELETE, uri1, status=204)
98+
responses.add(responses.DELETE, uri2, status=401)
99+
self.client.delete_repo(self.token, "username", "repo1")
100+
self.assertRaises(gogs_client.GogsApi.ApiFailure, self.client.delete_repo,
101+
self.token, "otherusername", "repo2")
102+
self.assertEqual(len(responses.calls), 2)
103+
first_call = responses.calls[0]
104+
self.assertEqual(first_call.request.url, self.path_with_token(uri1))
105+
last_call = responses.calls[1]
106+
self.assertEqual(last_call.request.url, self.path_with_token(uri2))
107+
108+
@responses.activate
109+
def test_create_user1(self):
110+
uri = self.path("/admin/users")
111+
responses.add(responses.POST, uri, body=self.user_json_str, status=201)
112+
user = self.client.create_user(self.token, login_name="loginname",
113+
username="username", email="user@example.com",
114+
password="password")
115+
self.assert_users_equals(user, self.expected_user)
116+
self.assertEqual(len(responses.calls), 1)
117+
call = responses.calls[0]
118+
self.assertEqual(call.request.url, self.path_with_token(uri))
119+
120+
@responses.activate
121+
def test_user_exists1(self):
122+
uri1 = self.path("/users/username1")
123+
uri2 = self.path("/users/username2")
124+
responses.add(responses.GET, uri1, body=self.user_json_str, status=200)
125+
responses.add(responses.GET, uri2, status=404)
126+
self.assertTrue(self.client.user_exists("username1"))
127+
self.assertFalse(self.client.user_exists("username2"))
128+
self.assertEqual(len(responses.calls), 2)
129+
first_call = responses.calls[0]
130+
self.assertEqual(first_call.request.url, uri1)
131+
last_call = responses.calls[1]
132+
self.assertEqual(last_call.request.url, uri2)
133+
134+
@responses.activate
135+
def test_search_users(self):
136+
uri = self.path("/users/search")
137+
138+
def callback(request):
139+
url = request.url
140+
index = url.find("?")
141+
self.assertTrue(index >= 0) # assert a ? was actually found
142+
self.assertEqual(url[:index], uri)
143+
data = self.data_of_query(url[index + 1:])
144+
self.assertEqual(data["q"], "keyword")
145+
self.assertEqual(int(data["limit"]), 4)
146+
return 200, {}, "{\"data\": [%s], \"ok\": true}" % self.user_json_str
147+
responses.add_callback(responses.GET, uri, callback=callback)
148+
users = self.client.search_users("keyword", limit=4)
149+
self.assertEqual(len(users), 1)
150+
self.assert_users_equals(users[0], self.expected_user)
151+
152+
@responses.activate
153+
def test_get_user1(self):
154+
uri1 = self.path("/users/username1")
155+
uri2 = self.path("/users/username2")
156+
responses.add(responses.GET, uri1, body=self.user_json_str, status=200)
157+
responses.add(responses.GET, uri2, status=404)
158+
user = self.client.get_user(None, "username1")
159+
self.assert_users_equals(user, self.expected_user)
160+
self.assertRaises(gogs_client.GogsApi.ApiFailure, self.client.get_user,
161+
None, "username2")
162+
self.assertEqual(len(responses.calls), 2)
163+
first_call = responses.calls[0]
164+
self.assertEqual(first_call.request.url, uri1)
165+
last_call = responses.calls[1]
166+
self.assertEqual(last_call.request.url, uri2)
167+
168+
@responses.activate
169+
def test_update_user1(self):
170+
update = gogs_client.GogsUserUpdate.Builder("loginname", "user@example.com")\
171+
.set_full_name("Example User")\
172+
.set_password("Password")\
173+
.set_website("mywebsite.net")\
174+
.build()
175+
176+
def callback(request):
177+
data = self.data_of_query(request.body)
178+
self.assertEqual(data["login_name"], "loginname")
179+
self.assertEqual(data["full_name"], "Example User")
180+
self.assertEqual(data["email"], "user@example.com")
181+
self.assertEqual(data["password"], "Password")
182+
self.assertEqual(data["website"], "mywebsite.net")
183+
return 200, {}, self.user_json_str
184+
uri = self.path("/admin/users/username")
185+
responses.add_callback(responses.PATCH, uri, callback=callback)
186+
user = self.client.update_user(self.token, "username", update)
187+
self.assert_users_equals(user, self.expected_user)
188+
189+
@responses.activate
190+
def test_delete_user1(self):
191+
uri1 = self.path("/admin/users/username1")
192+
uri2 = self.path("/admin/users/username2")
193+
responses.add(responses.DELETE, uri1, status=204)
194+
responses.add(responses.DELETE, uri2, status=401)
195+
self.client.delete_user(self.username_password, "username1")
196+
self.assertRaises(gogs_client.GogsApi.ApiFailure, self.client.delete_user,
197+
self.username_password, "username2")
198+
self.assertEqual(len(responses.calls), 2)
199+
first_call = responses.calls[0]
200+
self.assertEqual(first_call.request.url, uri1)
201+
self.check_for_basic_auth(first_call.request)
202+
last_call = responses.calls[1]
203+
self.assertEqual(last_call.request.url, uri2)
204+
self.check_for_basic_auth(last_call.request)
205+
206+
# helper methods
207+
208+
@staticmethod
209+
def data_of_query(query):
210+
return {k: v[0] for (k, v) in parse_qs(query).items()}
211+
212+
def path(self, relative):
213+
return http_utils.append_url(self.api_endpoint, relative)
214+
215+
def path_with_token(self, path):
216+
return "{p}?token={t}".format(p=path, t=self.token.token)
217+
218+
def check_for_basic_auth(self, request):
219+
auth = "{u}:{p}".format(u=self.username_password.username,
220+
p=self.username_password.password)
221+
b64 = base64.b64encode(auth.encode()).decode()
222+
self.assertEqual(request.headers["Authorization"], "Basic {}".format(b64))
223+
224+
def assert_repos_equal(self, repo, expected):
225+
self.assertEqual(repo.repo_id, expected.repo_id)
226+
self.assert_users_equals(repo.owner, expected.owner)
227+
self.assertEqual(repo.full_name, expected.full_name)
228+
self.assertEqual(repo.private, expected.private)
229+
self.assertEqual(repo.fork, expected.fork)
230+
self.assertEqual(repo.urls.html_url, expected.urls.html_url)
231+
self.assertEqual(repo.urls.clone_url, expected.urls.clone_url)
232+
self.assertEqual(repo.urls.ssh_url, expected.urls.ssh_url)
233+
self.assertEqual(repo.permissions.admin, expected.permissions.admin)
234+
self.assertEqual(repo.permissions.push, expected.permissions.push)
235+
self.assertEqual(repo.permissions.pull, expected.permissions.pull)
236+
237+
def assert_users_equals(self, user, expected):
238+
self.assertEqual(user.user_id, expected.user_id)
239+
self.assertEqual(user.username, expected.username)
240+
self.assertEqual(user.full_name, expected.full_name)
241+
self.assertEqual(user.email, expected.email)
242+
self.assertEqual(user.avatar_url, expected.avatar_url)
243+
244+
245+
if __name__ == "__main__":
246+
unittest.main()

0 commit comments

Comments
 (0)