Skip to content

Commit 2a93c62

Browse files
author
Gauvain Pocentek
committed
add unit tests for BaseManager
1 parent fdf295f commit 2a93c62

File tree

2 files changed

+155
-9
lines changed

2 files changed

+155
-9
lines changed

gitlab/objects.py

+8-9
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,28 @@ def __init__(self, gl, parent=None, args=[]):
4444
self.args = args
4545
self.parent = parent
4646

47-
def get(self, id, **kwargs):
47+
if self.obj_cls is None:
48+
raise AttributeError("obj_cls must be defined")
49+
50+
def _set_parent_args(self, **kwargs):
4851
if self.parent is not None:
4952
for attr, parent_attr in self.args:
5053
kwargs.setdefault(attr, getattr(self.parent, parent_attr))
5154

55+
def get(self, id, **kwargs):
56+
self._set_parent_args(**kwargs)
5257
if not self.obj_cls.canGet:
5358
raise NotImplementedError
5459
return self.obj_cls.get(self.gitlab, id, **kwargs)
5560

5661
def list(self, **kwargs):
57-
if self.parent is not None:
58-
for attr, parent_attr in self.args:
59-
kwargs.setdefault(attr, getattr(self.parent, parent_attr))
60-
62+
self._set_parent_args(**kwargs)
6163
if not self.obj_cls.canList:
6264
raise NotImplementedError
6365
return self.obj_cls.list(self.gitlab, **kwargs)
6466

6567
def create(self, data, **kwargs):
66-
if self.parent is not None:
67-
for attr, parent_attr in self.args:
68-
kwargs.setdefault(attr, getattr(self.parent, parent_attr))
69-
68+
self._set_parent_args(**kwargs)
7069
if not self.obj_cls.canCreate:
7170
raise NotImplementedError
7271
return self.obj_cls.create(self.gitlab, data, **kwargs)

gitlab/tests/test_manager.py

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# Copyright (C) 2016 Gauvain Pocentek <gauvain@pocentek.net>
4+
#
5+
# This program is free software: you can redistribute it and/or modify
6+
# it under the terms of the GNU Lesser General Public License as published by
7+
# the Free Software Foundation, either version 3 of the License, or
8+
# (at your option) any later version.
9+
#
10+
# This program is distributed in the hope that it will be useful,
11+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
# GNU Lesser General Public License for more details.
14+
#
15+
# You should have received a copy of the GNU Lesser General Public License
16+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
18+
try:
19+
import unittest
20+
except ImportError:
21+
import unittest2 as unittest
22+
23+
from httmock import HTTMock # noqa
24+
from httmock import response # noqa
25+
from httmock import urlmatch # noqa
26+
27+
from gitlab import * # noqa
28+
from gitlab.objects import BaseManager # noqa
29+
30+
31+
class FakeChildObject(GitlabObject):
32+
_url = "/fake"
33+
34+
35+
class FakeChildManager(BaseManager):
36+
obj_cls = FakeChildObject
37+
38+
39+
class FakeObject(GitlabObject):
40+
_url = "/fake"
41+
managers = [('children', FakeChildManager, [('child_id', 'id')])]
42+
43+
44+
class FakeObjectManager(BaseManager):
45+
obj_cls = FakeObject
46+
47+
48+
class TestGitlabManager(unittest.TestCase):
49+
def setUp(self):
50+
self.gitlab = Gitlab("http://localhost", private_token="private_token",
51+
email="testuser@test.com",
52+
password="testpassword", ssl_verify=True)
53+
54+
def test_constructor(self):
55+
self.assertRaises(AttributeError, BaseManager, self.gitlab)
56+
57+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/fake/1",
58+
method="get")
59+
def resp_get(url, request):
60+
headers = {'content-type': 'application/json'}
61+
content = '{"id": 1, "name": "fake_name"}'.encode("utf-8")
62+
return response(200, content, headers, None, 5, request)
63+
64+
with HTTMock(resp_get):
65+
mgr = FakeObjectManager(self.gitlab)
66+
fake_obj = mgr.get(1)
67+
self.assertEqual(fake_obj.id, 1)
68+
self.assertEqual(fake_obj.name, "fake_name")
69+
self.assertEqual(mgr.gitlab, self.gitlab)
70+
self.assertEqual(mgr.args, [])
71+
self.assertEqual(mgr.parent, None)
72+
73+
self.assertIsInstance(fake_obj.children, FakeChildManager)
74+
self.assertEqual(fake_obj.children.gitlab, self.gitlab)
75+
self.assertEqual(fake_obj.children.parent, fake_obj)
76+
self.assertEqual(len(fake_obj.children.args), 1)
77+
78+
fake_child = fake_obj.children.get(1)
79+
self.assertEqual(fake_child.id, 1)
80+
self.assertEqual(fake_child.name, "fake_name")
81+
82+
def test_get(self):
83+
mgr = FakeObjectManager(self.gitlab)
84+
FakeObject.canGet = False
85+
self.assertRaises(NotImplementedError, mgr.get, 1)
86+
87+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/fake/1",
88+
method="get")
89+
def resp_get(url, request):
90+
headers = {'content-type': 'application/json'}
91+
content = '{"id": 1, "name": "fake_name"}'.encode("utf-8")
92+
return response(200, content, headers, None, 5, request)
93+
94+
with HTTMock(resp_get):
95+
FakeObject.canGet = True
96+
mgr = FakeObjectManager(self.gitlab)
97+
fake_obj = mgr.get(1)
98+
self.assertIsInstance(fake_obj, FakeObject)
99+
self.assertEqual(fake_obj.id, 1)
100+
self.assertEqual(fake_obj.name, "fake_name")
101+
102+
def test_list(self):
103+
mgr = FakeObjectManager(self.gitlab)
104+
FakeObject.canList = False
105+
self.assertRaises(NotImplementedError, mgr.list)
106+
107+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/fake",
108+
method="get")
109+
def resp_get(url, request):
110+
headers = {'content-type': 'application/json'}
111+
content = ('[{"id": 1, "name": "fake_name1"},'
112+
'{"id": 2, "name": "fake_name2"}]')
113+
content = content.encode("utf-8")
114+
return response(200, content, headers, None, 5, request)
115+
116+
with HTTMock(resp_get):
117+
FakeObject.canList = True
118+
mgr = FakeObjectManager(self.gitlab)
119+
fake_list = mgr.list()
120+
self.assertEqual(len(fake_list), 2)
121+
self.assertIsInstance(fake_list[0], FakeObject)
122+
self.assertEqual(fake_list[0].id, 1)
123+
self.assertEqual(fake_list[0].name, "fake_name1")
124+
self.assertIsInstance(fake_list[1], FakeObject)
125+
self.assertEqual(fake_list[1].id, 2)
126+
self.assertEqual(fake_list[1].name, "fake_name2")
127+
128+
def test_create(self):
129+
mgr = FakeObjectManager(self.gitlab)
130+
FakeObject.canCreate = False
131+
self.assertRaises(NotImplementedError, mgr.create, {'foo': 'bar'})
132+
133+
@urlmatch(scheme="http", netloc="localhost", path="/api/v3/fake",
134+
method="post")
135+
def resp_post(url, request):
136+
headers = {'content-type': 'application/json'}
137+
data = '{"name": "fake_name"}'
138+
content = '{"id": 1, "name": "fake_name"}'.encode("utf-8")
139+
return response(201, content, headers, data, 5, request)
140+
141+
with HTTMock(resp_post):
142+
FakeObject.canCreate = True
143+
mgr = FakeObjectManager(self.gitlab)
144+
fake_obj = mgr.create({'name': 'fake_name'})
145+
self.assertIsInstance(fake_obj, FakeObject)
146+
self.assertEqual(fake_obj.id, 1)
147+
self.assertEqual(fake_obj.name, "fake_name")

0 commit comments

Comments
 (0)