async def test_api_broadcaster(app, m_publish, client): await service_status.wait_synchronized(app) app['config']['volatile'] = False b = broadcaster.Broadcaster(app) await b.prepare() await b.run() assert m_publish.call_count == 2
async def test_broadcast(app, m_publish, client, synchronized): app['config']['volatile'] = False b = broadcaster.Broadcaster(app) await b.prepare() await b.run() m_publish.assert_has_calls([ call(app, 'testcast/history/test_app', err=False, message={ 'key': 'test_app', 'data': ANY, }), call(app, 'testcast/state/test_app', err=False, retain=True, message={ 'key': 'test_app', 'type': 'Spark.state', 'data': { 'status': ANY, 'blocks': ANY, 'relations': ANY, 'drive_chains': ANY, }, }), ]) await b.before_shutdown(app) assert m_publish.call_count == 3
async def test_error(app, m_api, m_publish, client, connected): b = broadcaster.Broadcaster(app) await b.prepare() m_api.read_all.side_effect = RuntimeError with pytest.raises(RuntimeError): await b.run() m_api.read_all.side_effect = exceptions.ConnectionPaused await b.run() # no throw # Error over, resume normal work m_api.read_all.side_effect = None m_api.read_all.return_value = [{ 'id': 'testey', 'nid': 1, 'data': { 'var': 1 } }, { 'id': 'testface', 'nid': 2, 'data': { 'val': 2 } }] # 2 * only state event # 1 * history + state await b.run() assert m_publish.call_count == 4
async def test_noop_broadcast(app, m_api, m_publish, client, connected): """The mock by default emits an empty list. This should not be published to history""" b = broadcaster.Broadcaster(app) await b.prepare() await b.run() assert m_api.read_all_logged.call_count == 1 assert m_api.read_all.call_count == 1 assert m_publish.call_count == 2
async def test_startup_shutdown(app, client): assert broadcaster.get_broadcaster(app) b = broadcaster.Broadcaster(app) await b.startup(app) await b.startup(app) await b.shutdown(app) await b.startup(app) await b.shutdown(app)
async def test_startup_error(app, client, mocker, connected): logger_spy = mocker.spy(broadcaster, 'LOGGER') del app['config']['broadcast_interval'] b = broadcaster.Broadcaster(app) await b.startup(app) await asyncio.sleep(0.01) assert logger_spy.error.call_count == 1 await b.shutdown(app)
async def test_broadcast_unsync(app, m_publish, client, synchronized, mocker): m_wait_sync = mocker.patch(TESTED + '.service_status.wait_synchronized', AsyncMock()) m_wait_sync.return_value = False app['config']['volatile'] = False b = broadcaster.Broadcaster(app) await b.prepare() await b.run() assert m_wait_sync.call_count == 1 assert m_publish.call_count == 1
async def test_error(app, m_publish, client, synchronized): app['config']['volatile'] = False b = broadcaster.Broadcaster(app) await b.prepare() connection_sim.fget(app).next_error.append(ErrorCode.UNKNOWN_ERROR) with pytest.raises(exceptions.CommandException): await b.run() # Error over, resume normal work # 1 * only state event # 1 * history + state await b.run() assert m_publish.call_count == 3
async def test_broadcast(app, m_api, m_publish, client, connected): object_list = [{ 'id': 'testey', 'nid': 1, 'data': { 'var': 1 } }, { 'id': 'testface', 'nid': 2, 'data': { 'val': 2 } }] objects = {'testey': {'var': 1}, 'testface': {'val': 2}} m_api.read_all_logged.return_value = object_list m_api.read_all.return_value = object_list b = broadcaster.Broadcaster(app) await b.prepare() await b.run() m_publish.assert_has_calls([ call(app, 'testcast/history/test_app', err=False, message={ 'key': 'test_app', 'data': objects, }), call(app, 'testcast/state/test_app', err=False, retain=True, message={ 'key': 'test_app', 'type': 'Spark.state', 'ttl': '60.0s', 'data': { 'status': ANY, 'blocks': object_list, }, }), ]) await b.before_shutdown(app) assert m_publish.call_count == 3
async def test_disabled(app, m_publish, client, synchronized): app['config']['broadcast_interval'] = 0 app['config']['volatile'] = False b = broadcaster.Broadcaster(app) with pytest.raises(repeater.RepeaterCancelled): await b.prepare()
async def test_disabled(app, m_api, m_publish, client, connected): app['config']['broadcast_interval'] = 0 b = broadcaster.Broadcaster(app) with pytest.raises(repeater.RepeaterCancelled): await b.prepare()