# -*- coding: utf-8 -*- # # Copyright (C) 2017 Gauvain Pocentek # # 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 . import pickle 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') 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_pickability(self): obj = FakeObject(self.manager, {'foo': 'bar'}) original_obj_module = obj._module pickled = pickle.dumps(obj) unpickled = pickle.loads(pickled) self.assertIsInstance(unpickled, FakeObject) self.assertTrue(hasattr(unpickled, '_module')) self.assertEqual(unpickled._module, original_obj_module) 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'}) obj.id = 42 self.assertIsInstance(obj.fakes, FakeManager) self.assertEqual(obj.fakes.gitlab, self.gitlab) self.assertEqual(obj.fakes._parent, obj) def test_equality(self): obj1 = FakeObject(self.manager, {'id': 'foo'}) obj2 = FakeObject(self.manager, {'id': 'foo', 'other_attr': 'bar'}) self.assertEqual(obj1, obj2) def test_equality_custom_id(self): class OtherFakeObject(FakeObject): _id_attr = 'foo' obj1 = OtherFakeObject(self.manager, {'foo': 'bar'}) obj2 = OtherFakeObject( self.manager, {'foo': 'bar', 'other_attr': 'baz'} ) self.assertEqual(obj1, obj2) def test_inequality(self): obj1 = FakeObject(self.manager, {'id': 'foo'}) obj2 = FakeObject(self.manager, {'id': 'bar'}) self.assertNotEqual(obj1, obj2) def test_inequality_no_id(self): obj1 = FakeObject(self.manager, {'attr1': 'foo'}) obj2 = FakeObject(self.manager, {'attr1': 'bar'}) self.assertNotEqual(obj1, obj2)