blob: 56b4bbda9ab29f67b2c8a1ddcbaa31f5289c1729 [file] [log] [blame]
# Copyright 2020 Canonical Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import asynctest
import asyncio
from unittest import mock
from unittest.mock import Mock
from n2vc.juju_watcher import JujuModelWatcher
from n2vc.utils import EntityType
from n2vc.exceptions import EntityInvalidException
from .utils import FakeN2VC, AsyncMock, Deltas, FakeWatcher
class JujuWatcherTest(asynctest.TestCase):
def setUp(self):
self.n2vc = FakeN2VC()
self.model = Mock()
self.loop = asyncio.new_event_loop()
def test_get_status(self):
tests = Deltas
for test in tests:
(status, message, vca_status) = JujuModelWatcher.get_status(
test.delta, test.entity.type
)
self.assertEqual(status, test.entity_status.status)
self.assertEqual(message, test.entity_status.message)
self.assertEqual(vca_status, test.entity_status.vca_status)
@mock.patch("n2vc.juju_watcher.client.AllWatcherFacade.from_connection")
def test_model_watcher(self, allwatcher):
tests = Deltas
allwatcher.return_value = FakeWatcher()
for test in tests:
with self.assertRaises(asyncio.TimeoutError):
allwatcher.return_value.delta_to_return = [test.delta]
self.loop.run_until_complete(
JujuModelWatcher.model_watcher(
self.model,
test.filter.entity_id,
test.filter.entity_type,
timeout=0,
db_dict={"something"},
n2vc=self.n2vc,
)
)
self.assertEqual(self.n2vc.last_written_values, test.db.data)
self.n2vc.last_written_values = None
@mock.patch("n2vc.juju_watcher.asyncio.wait")
@mock.patch("n2vc.juju_watcher.EntityType.get_entity")
def test_wait_for(self, get_entity, wait):
wait.return_value = asyncio.Future()
wait.return_value.set_result(None)
get_entity.return_value = EntityType.MACHINE
machine = AsyncMock()
self.loop.run_until_complete(JujuModelWatcher.wait_for(self.model, machine))
@mock.patch("n2vc.juju_watcher.asyncio.wait")
@mock.patch("n2vc.juju_watcher.EntityType.get_entity")
def test_wait_for_exception(self, get_entity, wait):
wait.return_value = asyncio.Future()
wait.return_value.set_result(None)
wait.side_effect = Exception("error")
get_entity.return_value = EntityType.MACHINE
machine = AsyncMock()
with self.assertRaises(Exception):
self.loop.run_until_complete(JujuModelWatcher.wait_for(self.model, machine))
def test_wait_for_invalid_entity_exception(self):
with self.assertRaises(EntityInvalidException):
self.loop.run_until_complete(
JujuModelWatcher.wait_for(self.model, AsyncMock(), total_timeout=0)
)