python-dockercloud/tests/test_base.py
2016-01-26 18:45:04 +01:00

252 lines
9.7 KiB
Python

from __future__ import absolute_import
import json
import unittest
import unittest.mock as mock
import dockercloud
from dockercloud.api.base import Restful, Mutable, Immutable
class RestfulTestCase(unittest.TestCase):
def setUp(self):
self.pk = Restful.pk
Restful.pk = 'uuid'
def tearDown(self):
Restful.pk = self.pk
def test_restful_init(self):
model = Restful(key1='value1', key2='value2')
self.assertEqual('value1', model.key1)
self.assertEqual('value2', model.key2)
def test_restful_setattr(self):
model = Restful()
setattr(model, 'key', 'value')
self.assertEqual('value', model.key)
self.assertEqual(['key'], model.__changedattrs__)
setattr(model, 'key', 'other value')
self.assertEqual('other value', model.key)
self.assertEqual(['key'], model.__changedattrs__)
setattr(model, 'another_key', 'another_value')
self.assertEqual('another_value', model.another_key)
self.assertEqual(['key', 'another_key'], model.__changedattrs__)
def test_restful_getchanges(self):
model = Restful()
self.assertEqual([], model.__getchanges__())
model.__changedattrs__ = ['dockercloud']
self.assertEqual(['dockercloud'], model.__getchanges__())
def test_restful_setchanges(self):
model = Restful()
model.__setchanges__('abc')
self.assertEqual('abc', model.__changedattrs__)
model.__setchanges__(None)
self.assertIsNone(model.__changedattrs__)
def test_restful_loaddict(self):
model = Restful()
self.assertRaises(AssertionError, model._loaddict, {'key': 'value'})
model.endpoint = 'endpoint'
model.subsystem = "subsystem"
model._loaddict({'key': 'value'})
self.assertEqual('value', model.key)
self.assertEqual("/".join(["api", model.subsystem, model._api_version, model.endpoint.lstrip("/"), model.pk]),
model._detail_uri)
self.assertEqual([], model.__getchanges__())
def test_restful_pk(self):
model = Restful()
self.assertEqual(model.__class__._pk_key(), model.pk)
def test_restful_is_dirty(self):
model = Restful()
self.assertFalse(model.is_dirty)
model.key = 'value'
self.assertTrue(model.is_dirty)
@mock.patch('dockercloud.api.base.send_request')
def test_restful_perform_action(self, mock_send_request):
try:
model = Restful()
self.assertRaises(dockercloud.ApiError, model._perform_action, 'action')
model.endpoint = 'fake'
model.subsystem = "subsystem"
model._detail_uri = "/".join(
["api", model.subsystem, model._api_version, model.endpoint.lstrip("/"), model.pk])
mock_send_request.side_effect = [{'key': 'value'}, None]
self.assertTrue(model._perform_action('action', params={'k': 'v'}, data={'key': 'value'}))
self.assertEqual('value', model.key)
mock_send_request.assert_called_with('POST', "/".join([model._detail_uri, "action"]), data={'key': 'value'},
params={'k': 'v'})
self.assertFalse(model._perform_action('action', {'key': 'value'}))
finally:
if hasattr(Restful, 'endpoint'):
delattr(Restful, 'endpoint')
@mock.patch('dockercloud.api.base.send_request')
def test_restful_expand_attribute(self, mock_send_request):
model = Restful()
self.assertRaises(dockercloud.ApiError, model._expand_attribute, 'attribute')
model._detail_uri = 'fake/uuid'
mock_send_request.side_effect = [{'key': 'value'}, None]
self.assertEqual('value', model._expand_attribute('key'))
self.assertIsNone(model._expand_attribute('key'))
def test_restful_get_all_attributes(self):
model = Restful()
model.key = 'value'
self.assertDictEqual({'key': 'value'}, model.get_all_attributes())
class ImmutableTestCase(unittest.TestCase):
def setUp(self):
self.pk = Immutable.pk
Immutable.pk = 'uuid'
def tearDown(self):
Immutable.pk = self.pk
@mock.patch('dockercloud.api.base.send_request')
def test_immutable_fetch(self, mock_send_request):
self.assertRaises(AssertionError, Immutable.fetch, 'uuid')
try:
ret_json = {"key": "value"}
mock_send_request.return_value = ret_json
Immutable.endpoint = 'endpoint'
Immutable.subsystem = "subsystem"
model = Immutable.fetch('uuid')
mock_send_request.assert_called_with('GET', 'api/subsystem/%s/endpoint/uuid' % Immutable._api_version)
self.assertIsInstance(model, Immutable)
self.assertEqual('value', model.key)
finally:
if hasattr(Immutable, 'endpoint'):
delattr(Immutable, 'endpoint')
@mock.patch('dockercloud.api.base.send_request')
def test_immutable_list(self, mock_send_request):
self.assertRaises(AssertionError, Immutable.list)
try:
kwargs = {'key': 'value'}
ret_json = {"meta": {"limit": 25, "next": None, "offset": 0, "previous": None, "total_count": 1},
"objects": [{"key": "value1"}, {"key": "value2"}]}
mock_send_request.return_value = ret_json
Immutable.endpoint = 'fake'
models = Immutable.list(**kwargs)
mock_send_request.assert_called_with('GET', 'api/subsystem/%s/fake' % Immutable._api_version, params=kwargs)
self.assertEqual(2, len(models))
self.assertIsInstance(models[0], Immutable)
self.assertEqual('value1', models[0].key)
self.assertIsInstance(models[1], Immutable)
self.assertEqual('value2', models[1].key)
finally:
if hasattr(Immutable, 'endpoint'):
delattr(Immutable, 'endpoint')
@mock.patch('dockercloud.api.base.send_request')
def test_immutable_refresh(self, mock_send_request):
try:
model = Immutable()
model.key = 'value'
self.assertFalse(model.refresh(force=False))
self.assertRaises(dockercloud.ApiError, model.refresh, force=True)
Immutable.endpoint = 'endpoint'
Immutable.subsystem = 'subsystem'
model._detail_uri = 'api/subsystem/%s/endpoint/uuid' % Immutable._api_version
mock_send_request.side_effect = [{'newkey': 'newvalue'}, None]
self.assertTrue(model.refresh(force=True))
self.assertEqual('newvalue', model.newkey)
mock_send_request.assert_called_with('GET', model._detail_uri)
self.assertFalse(model.refresh(force=True))
mock_send_request.assert_called_with('GET', model._detail_uri)
finally:
if hasattr(Immutable, 'endpoint'):
delattr(Immutable, 'endpoint')
class MutableTestCase(unittest.TestCase):
def setUp(self):
self.pk = Mutable.pk
Mutable.pk = 'uuid'
def tearDown(self):
Mutable.pk = self.pk
def test_mutable_create(self):
self.assertIsInstance(Mutable.create(), Mutable)
@mock.patch('dockercloud.api.base.send_request')
def test_mutable_delete(self, mock_send_request):
try:
model = Mutable()
self.assertRaises(dockercloud.ApiError, model.delete)
Mutable.endpoint = 'fake'
model._detail_uri = 'fake/uuid'
mock_send_request.side_effect = [{'key': 'value'}, None]
self.assertTrue(model.delete())
self.assertEqual('value', model.key)
mock_send_request.assert_called_with('DELETE', 'fake/uuid')
self.assertTrue(model.delete())
self.assertIsNone(model._detail_uri)
self.assertFalse(model.is_dirty)
finally:
if hasattr(Mutable, 'endpoint'):
delattr(Mutable, 'endpoint')
@mock.patch('dockercloud.api.base.send_request')
def test_mutable_save(self, mock_send_request):
try:
self.assertTrue(Mutable().save())
model = Mutable()
model.key = 'value'
self.assertRaises(AssertionError, model.save)
Mutable.endpoint = 'endpoint'
Mutable.subsystem = 'subsystem'
mock_send_request.return_value = None
result = model.save()
mock_send_request.assert_called_with('POST', 'api/subsystem/%s/endpoint' % Mutable._api_version,
data=json.dumps({'key': 'value'}))
self.assertFalse(result)
mock_send_request.return_value = {'newkey': 'newvalue'}
result = model.save()
mock_send_request.assert_called_with('POST', 'api/subsystem/%s/endpoint' % Mutable._api_version,
data=json.dumps({'key': 'value'}))
self.assertTrue(result)
self.assertEqual('newvalue', model.newkey)
model.key = 'another value'
mock_send_request.return_value = {'newkey2': 'newvalue2'}
model._detail_uri = 'api/subsystem/%s/endpoint/uuid' % Immutable._api_version
result = model.save()
mock_send_request.assert_called_with('PATCH', 'api/subsystem/%s/endpoint/uuid' % Mutable._api_version,
data=json.dumps({'key': 'another value'}))
self.assertTrue(result)
self.assertEqual('another value', model.key)
self.assertEqual('newvalue2', model.newkey2)
finally:
if hasattr(Mutable, 'endpoint'):
delattr(Mutable, 'endpoint')