summaryrefslogtreecommitdiff
path: root/gitlab/tests/test_base.py
blob: c55f0003cf510cc94817d822c9a9e06fcc2113c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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)