X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=tests%2Funit%2Ftest_model.py;h=222d881a6b5c16090fe6f3517e045009c9b72dc4;hb=dbcac620b62e16f9e4b7a763e1400f2f3a79b285;hp=97966da60aa37033d370e978115a74eb879be891;hpb=6d260e15f4122a100d7cbecb81bd5a1a1a2bffa8;p=osm%2FN2VC.git diff --git a/tests/unit/test_model.py b/tests/unit/test_model.py index 97966da..222d881 100644 --- a/tests/unit/test_model.py +++ b/tests/unit/test_model.py @@ -1,22 +1,29 @@ import unittest +import mock +import asynctest + + +def _make_delta(entity, type_, data=None): + from juju.client.client import Delta + from juju.delta import get_entity_delta + + delta = Delta([entity, type_, data]) + return get_entity_delta(delta) + class TestObserver(unittest.TestCase): def _make_observer(self, *args): from juju.model import _Observer return _Observer(*args) - def _make_delta(self, entity, type_, data=None): - from juju.delta import ApplicationDelta - return ApplicationDelta([entity, type_, data]) - def test_cares_about_id(self): id_ = 'foo' o = self._make_observer( None, None, None, id_, None) - delta = self._make_delta( + delta = _make_delta( 'application', 'change', dict(name=id_)) self.assertTrue(o.cares_about(delta)) @@ -27,7 +34,7 @@ class TestObserver(unittest.TestCase): o = self._make_observer( None, type_, None, None, None) - delta = self._make_delta( + delta = _make_delta( type_, 'change', dict(name='foo')) self.assertTrue(o.cares_about(delta)) @@ -38,7 +45,7 @@ class TestObserver(unittest.TestCase): o = self._make_observer( None, None, action, None, None) - delta = self._make_delta( + delta = _make_delta( 'application', action, dict(name='foo')) self.assertTrue(o.cares_about(delta)) @@ -50,7 +57,99 @@ class TestObserver(unittest.TestCase): o = self._make_observer( None, None, None, None, predicate) - delta = self._make_delta( + delta = _make_delta( 'application', 'change', dict(fizz='bang')) self.assertTrue(o.cares_about(delta)) + + +class TestModelState(unittest.TestCase): + def test_apply_delta(self): + from juju.model import Model + from juju.application import Application + + loop = mock.MagicMock() + model = Model(loop=loop) + delta = _make_delta('application', 'add', dict(name='foo')) + + # test add + prev, new = model.state.apply_delta(delta) + self.assertEqual( + len(model.state.state[delta.entity][delta.get_id()]), 1) + self.assertIsNone(prev) + self.assertIsInstance(new, Application) + + # test remove + delta.type = 'remove' + prev, new = model.state.apply_delta(delta) + # length of the entity history deque is now 3: + # - 1 for the first delta + # - 1 for the second delta + # - 1 for the None sentinel appended after the 'remove' + self.assertEqual( + len(model.state.state[delta.entity][delta.get_id()]), 3) + self.assertIsInstance(new, Application) + # new object is falsy because its data is None + self.assertFalse(new) + self.assertIsInstance(prev, Application) + self.assertTrue(prev) + + +def test_get_series(): + from juju.model import Model + model = Model() + entity = { + 'Meta': { + 'supported-series': { + 'SupportedSeries': [ + 'xenial', + 'trusty', + ], + }, + }, + } + assert model._get_series('cs:trusty/ubuntu', entity) == 'trusty' + assert model._get_series('xenial/ubuntu', entity) == 'xenial' + assert model._get_series('~foo/xenial/ubuntu', entity) == 'xenial' + assert model._get_series('~foo/ubuntu', entity) == 'xenial' + assert model._get_series('ubuntu', entity) == 'xenial' + assert model._get_series('cs:ubuntu', entity) == 'xenial' + + +class TestContextManager(asynctest.TestCase): + @asynctest.patch('juju.model.Model.disconnect') + @asynctest.patch('juju.model.Model.connect_current') + async def test_normal_use(self, mock_connect, mock_disconnect): + from juju.model import Model + + async with Model() as model: + self.assertTrue(isinstance(model, Model)) + + self.assertTrue(mock_connect.called) + self.assertTrue(mock_disconnect.called) + + @asynctest.patch('juju.model.Model.disconnect') + @asynctest.patch('juju.model.Model.connect_current') + async def test_exception(self, mock_connect, mock_disconnect): + from juju.model import Model + + class SomeException(Exception): + pass + + with self.assertRaises(SomeException): + async with Model(): + raise SomeException() + + self.assertTrue(mock_connect.called) + self.assertTrue(mock_disconnect.called) + + @asynctest.patch('juju.client.connection.JujuData.current_controller') + async def test_no_current_connection(self, mock_current_controller): + from juju.model import Model + from juju.errors import JujuConnectionError + + mock_current_controller.return_value = "" + + with self.assertRaises(JujuConnectionError): + async with Model(): + pass