async def test_scheduled_time_is_less_than_sleep_time( pattern, now, dt, mocker, event_loop, create_mock_coro ): task = Task( pattern=pattern, func=mocker.Mock(), loop=event_loop, executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) # mocks task.get_now = mocker.Mock(return_value=now) task.get_next = mocker.Mock(return_value=(dt, now)) task.loop.call_at = mocker.Mock() task.loop.time = mocker.Mock(return_value=0.0) mock_sleep, _ = create_mock_coro("aiocrontab.core.asyncio.sleep") # run await task.complete_task_lifecycle() # asserts assert mock_sleep.call_args[0][0] > task.loop.call_at.call_args[0][0] assert ( mock_sleep.call_args[0][0] - task.loop.call_at.call_args[0][0] == task.buffer_time )
async def test_async_task_is_scheduled_in_event_loop( mocker, event_loop, create_mock_coro ): mock, coro = create_mock_coro() task = Task( pattern="* * * * *", func=coro, loop=event_loop, executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) task.buffer_time = 0.1 task.loop.create_task = mocker.Mock(wraps=task.loop.create_task) # run code task.schedule( at=datetime(2020, 5, 5, 0, 0, 0, 30), now=datetime(2020, 5, 5, 0, 0, 0, 0), ) await asyncio.sleep(0.5) assert task.loop.create_task.call_count == 1 # to check if the coroutine was actually run mock.assert_called_once_with()
async def mock_handle_cronjob(*args, **kwargs): for i in range(len(f_returns)): task = Task(*args, **kwargs) # important: reduce the buffer time for testing task.buffer_time = 0.1 await task.complete_task_lifecycle() await cron.shutdown()
async def _mock_handle_cronjob(pattern, func, loop, executor, logger): while True: task = Task( pattern, func=func, loop=loop, executor=executor, logger=logger, ) task.buffer_time = 0.1 await task.complete_task_lifecycle()
def test_get_now_returns_timezone_aware_datetime(mocker): task = Task( pattern="* * * * *", func=mocker.Mock(), loop=mocker.Mock(), executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) d = task.get_now() # how to check if the dt is timezone aware: # https://stackoverflow.com/questions/5802108/how-to-check-if-a-datetime-object-is-localized-with-pytz assert d.tzinfo is not None and d.tzinfo.utcoffset(d) is not None
def test_run_logs_messages(mocker, create_caplog, create_mock_coro): task1 = Task( pattern="* * * * *", func=mocker.Mock(), loop=mocker.Mock(run_in_executor=mocker.Mock()), executor=mocker.Mock(), logger=create_logger(), tz=timezone.utc, ) caplog = create_caplog(logging.DEBUG) task1.run() assert len(caplog.records) == 1 assert "Scheduling func: unknown in a Thread." == caplog.records[0].msg caplog.clear() assert len(caplog.records) == 0 mock, coro = create_mock_coro() task2 = Task( pattern="* * * * *", func=coro, loop=mocker.Mock(run_in_executor=mocker.Mock()), executor=mocker.Mock(), logger=create_logger(), tz=timezone.utc, ) task2.run() assert len(caplog.records) == 1 assert "Scheduling func: _coro in the Event Loop." == caplog.records[0].msg
def test_get_next_returns_task_datetime_and_current_datetime( now, pattern, expected, mocker ): task = Task( pattern=pattern, func=mocker.Mock(), loop=mocker.Mock(), executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) task.get_now = mocker.Mock(return_value=now) task_datetime, _now = task.get_next() assert _now == now assert task_datetime == expected
async def test_sleep_until_task_completion( now, dt, timestamp, event_loop, mocker, create_mock_coro, create_caplog ): caplog = create_caplog(logging.DEBUG) task = Task( pattern="* * * * *", func=mocker.Mock(), loop=event_loop, executor=mocker.Mock(), logger=create_logger(), tz=timezone.utc, ) task.get_now = mocker.Mock(return_value=now) mock, coro = create_mock_coro("aiocrontab.core.asyncio.sleep") await task.sleep_until_task_completion(till=dt) mock.assert_called_once_with(timestamp + task.buffer_time) assert 2 == len(caplog.records)
async def test_run_gets_called_from_the_schedule_call( at, now, mocker, event_loop ): task = Task( pattern="dummy", func=mocker.Mock(), loop=event_loop, executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) task.run = mocker.Mock() task.schedule(at, now) await asyncio.sleep(1.2) task.run.assert_called_once_with()
def test_schedule_next_loop_timestamp_is_calculated_correctly( at, now, expected, loop_time, mocker ): task = Task( pattern="* * * * *", func=mocker.Mock(), loop=mocker.Mock(run_in_executor=mocker.Mock()), executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) # mock task.loop.time = mocker.Mock(return_value=loop_time) task.loop.call_at = mocker.Mock() task.schedule(at, now) # asserts task.loop.call_at.assert_called_once_with(expected, task.run)
async def test_sync_task_is_scheduled_in_thread(mocker, event_loop): # mock task = Task( pattern="* * * * *", func=mocker.Mock(), loop=event_loop, executor=mocker.Mock(), logger=mocker.Mock(), tz=timezone.utc, ) task.buffer_time = 0.1 task.loop.run_in_executor = mocker.Mock() # run code task.schedule( at=datetime(2020, 5, 5, 0, 0, 0, 30), now=datetime(2020, 5, 5, 0, 0, 0, 0), ) # wait till the tasks gets executed await asyncio.sleep(0.5) # assert task.loop.run_in_executor.assert_called_once_with(task.executor, task.func)
async def mock_handle_cronjob(*args, **kwargs): while True: task = Task(*args, **kwargs) # important: reduce the buffer time for testing task.buffer_time = 0.1 await task.complete_task_lifecycle()