async def test_relate(event_loop): from juju.relation import Relation async with base.CleanModel() as model: await model.deploy( 'cs:~jameinel/ubuntu-lite-7', application_name='ubuntu', series='bionic', channel='stable', ) await model.deploy( 'nrpe', application_name='nrpe', series='bionic', channel='stable', # subordinates must be deployed without units num_units=0, ) relation_added = asyncio.Event() timeout = asyncio.Event() class TestObserver(ModelObserver): async def on_relation_add(self, delta, old, new, model): if set(new.key.split()) == { 'nrpe:general-info', 'ubuntu:juju-info' }: relation_added.set() event_loop.call_later(10, timeout.set) model.add_observer(TestObserver()) real_app_facade = ApplicationFacade.from_connection(model.connection()) mock_app_facade = mock.MagicMock() async def mock_AddRelation(*args, **kwargs): # force response delay from AddRelation to test race condition # (see https://github.com/juju/python-libjuju/issues/191) result = await real_app_facade.AddRelation(*args, **kwargs) await relation_added.wait() return result mock_app_facade.AddRelation = mock_AddRelation with mock.patch.object(ApplicationFacade, 'from_connection', return_value=mock_app_facade): my_relation = await run_with_interrupt(model.add_relation( 'ubuntu', 'nrpe', ), timeout, loop=event_loop) assert isinstance(my_relation, Relation)
async def test_relate(event_loop): from juju.relation import Relation async with base.CleanModel() as model: await model.deploy( 'ubuntu', application_name='ubuntu', series='trusty', channel='stable', ) await model.deploy( 'nrpe', application_name='nrpe', series='trusty', channel='stable', # subordinates must be deployed without units num_units=0, ) relation_added = asyncio.Event() timeout = asyncio.Event() class TestObserver(ModelObserver): async def on_relation_add(self, delta, old, new, model): if set(new.key.split()) == {'nrpe:general-info', 'ubuntu:juju-info'}: relation_added.set() event_loop.call_later(2, timeout.set) model.add_observer(TestObserver()) real_app_facade = ApplicationFacade.from_connection(model.connection()) mock_app_facade = mock.MagicMock() async def mock_AddRelation(*args): # force response delay from AddRelation to test race condition # (see https://github.com/juju/python-libjuju/issues/191) result = await real_app_facade.AddRelation(*args) await relation_added.wait() return result mock_app_facade.AddRelation = mock_AddRelation with mock.patch.object(ApplicationFacade, 'from_connection', return_value=mock_app_facade): my_relation = await run_with_interrupt(model.add_relation( 'ubuntu', 'nrpe', ), timeout, loop=event_loop) assert isinstance(my_relation, Relation)