Example #1
0
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
    )
Example #2
0
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()
Example #3
0
            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()
Example #4
0
 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()
Example #5
0
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
Example #6
0
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
Example #7
0
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
Example #8
0
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)
Example #9
0
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()
Example #10
0
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)
Example #11
0
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)
Example #12
0
 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()