summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGauvain Pocentek <gauvain@pocentek.net>2017-06-05 08:48:18 +0200
committerGauvain Pocentek <gauvain@pocentek.net>2017-06-05 08:48:18 +0200
commit0d94ee228b6ac1ffef4c4cac68a4e4757a6a824c (patch)
tree052554fc06f39b50916ec2f062c032bb0e655bdb
parenta5b39a526035c1868a39f0533f019e5e24eeb4db (diff)
downloadgitlab-0d94ee228b6ac1ffef4c4cac68a4e4757a6a824c.tar.gz
Unit tests for REST* classes
-rw-r--r--gitlab/base.py15
-rw-r--r--gitlab/tests/test_base.py129
2 files changed, 140 insertions, 4 deletions
diff --git a/gitlab/base.py b/gitlab/base.py
index 8949554..c318c1d 100644
--- a/gitlab/base.py
+++ b/gitlab/base.py
@@ -540,8 +540,8 @@ class RESTObject(object):
another. This allows smart updates, if the object allows it.
You can redefine ``_id_attr`` in child classes to specify which attribute
- must be used as uniq ID. None means that the object can be updated without
- ID in the url.
+ must be used as uniq ID. ``None`` means that the object can be updated
+ without ID in the url.
"""
_id_attr = 'id'
@@ -594,8 +594,8 @@ class RESTObject(object):
self.__dict__[attr] = manager
def _update_attrs(self, new_attrs):
- self._updated_attrs = {}
- self._attrs.update(new_attrs)
+ self.__dict__['_updated_attrs'] = {}
+ self.__dict__['_attrs'].update(new_attrs)
def get_id(self):
if self._id_attr is None:
@@ -649,6 +649,13 @@ class RESTManager(object):
_obj_cls = None
def __init__(self, gl, parent=None):
+ """REST manager constructor.
+
+ Args:
+ gl (Gitlab): :class:`~gitlab.Gitlab` connection to use to make
+ requests.
+ parent: REST object to which the manager is attached.
+ """
self.gitlab = gl
self._parent = parent # for nested managers
self._computed_path = self._compute_path()
diff --git a/gitlab/tests/test_base.py b/gitlab/tests/test_base.py
new file mode 100644
index 0000000..c55f000
--- /dev/null
+++ b/gitlab/tests/test_base.py
@@ -0,0 +1,129 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2017 Gauvain Pocentek <gauvain@pocentek.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+try:
+ import unittest
+except ImportError:
+ import unittest2 as unittest
+
+from gitlab import base
+
+
+class FakeGitlab(object):
+ pass
+
+
+class FakeObject(base.RESTObject):
+ pass
+
+
+class FakeManager(base.RESTManager):
+ _obj_cls = FakeObject
+ _path = '/tests'
+
+
+class TestRESTManager(unittest.TestCase):
+ def test_computed_path_simple(self):
+ class MGR(base.RESTManager):
+ _path = '/tests'
+ _obj_cls = object
+
+ mgr = MGR(FakeGitlab())
+ self.assertEqual(mgr._computed_path, '/tests')
+
+ def test_computed_path_with_parent(self):
+ class MGR(base.RESTManager):
+ _path = '/tests/%(test_id)s/cases'
+ _obj_cls = object
+ _from_parent_attrs = {'test_id': 'id'}
+
+ class Parent(object):
+ id = 42
+
+ class BrokenParent(object):
+ no_id = 0
+
+ mgr = MGR(FakeGitlab(), parent=Parent())
+ self.assertEqual(mgr._computed_path, '/tests/42/cases')
+
+ self.assertRaises(AttributeError, MGR, FakeGitlab(),
+ parent=BrokenParent())
+
+ def test_path_property(self):
+ class MGR(base.RESTManager):
+ _path = '/tests'
+ _obj_cls = object
+
+ mgr = MGR(FakeGitlab())
+ self.assertEqual(mgr.path, '/tests')
+
+
+class TestRESTObject(unittest.TestCase):
+ def setUp(self):
+ self.gitlab = FakeGitlab()
+ self.manager = FakeManager(self.gitlab)
+
+ def test_instanciate(self):
+ obj = FakeObject(self.manager, {'foo': 'bar'})
+
+ self.assertDictEqual({'foo': 'bar'}, obj._attrs)
+ self.assertDictEqual({}, obj._updated_attrs)
+ self.assertEqual(None, obj._create_managers())
+ self.assertEqual(self.manager, obj.manager)
+ self.assertEqual(self.gitlab, obj.manager.gitlab)
+
+ def test_attrs(self):
+ obj = FakeObject(self.manager, {'foo': 'bar'})
+
+ self.assertEqual('bar', obj.foo)
+ self.assertRaises(AttributeError, getattr, obj, 'bar')
+
+ obj.bar = 'baz'
+ self.assertEqual('baz', obj.bar)
+ self.assertDictEqual({'foo': 'bar'}, obj._attrs)
+ self.assertDictEqual({'bar': 'baz'}, obj._updated_attrs)
+
+ def test_get_id(self):
+ obj = FakeObject(self.manager, {'foo': 'bar'})
+ obj.id = 42
+ self.assertEqual(42, obj.get_id())
+
+ obj.id = None
+ self.assertEqual(None, obj.get_id())
+
+ def test_custom_id_attr(self):
+ class OtherFakeObject(FakeObject):
+ _id_attr = 'foo'
+
+ obj = OtherFakeObject(self.manager, {'foo': 'bar'})
+ self.assertEqual('bar', obj.get_id())
+
+ def test_update_attrs(self):
+ obj = FakeObject(self.manager, {'foo': 'bar'})
+ obj.bar = 'baz'
+ obj._update_attrs({'foo': 'foo', 'bar': 'bar'})
+ self.assertDictEqual({'foo': 'foo', 'bar': 'bar'}, obj._attrs)
+ self.assertDictEqual({}, obj._updated_attrs)
+
+ def test_create_managers(self):
+ class ObjectWithManager(FakeObject):
+ _managers = (('fakes', 'FakeManager'), )
+
+ obj = ObjectWithManager(self.manager, {'foo': 'bar'})
+ self.assertIsInstance(obj.fakes, FakeManager)
+ self.assertEqual(obj.fakes.gitlab, self.gitlab)
+ self.assertEqual(obj.fakes._parent, obj)