Skip to content

Commit

Permalink
Unit tests for REST* classes
Browse files Browse the repository at this point in the history
  • Loading branch information
Gauvain Pocentek committed Jun 5, 2017
1 parent a5b39a5 commit 0d94ee2
Show file tree
Hide file tree
Showing 2 changed files with 140 additions and 4 deletions.
15 changes: 11 additions & 4 deletions gitlab/base.py
Expand Up @@ -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'

Expand Down Expand Up @@ -594,8 +594,8 @@ def _create_managers(self):
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:
Expand Down Expand Up @@ -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()
Expand Down
129 changes: 129 additions & 0 deletions 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)

0 comments on commit 0d94ee2

Please sign in to comment.