Exemple #1
0
def test_timezone_aware_processor_doesnt_doesnt_bubble_internal_exceptions(
) -> None:
    # Note: the processor assumes that the callable they're passed won't raise,
    # because that is assumed to be `cron.process_job` which has its own error
    # handling. The processor does howver need to ensure that other errors it
    # may encounter while checking whether to run are handled.
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Etc/UTC')

    with freezegun.freeze_time('2019-08-01 01:00 UTC'):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    with freezegun.freeze_time('2019-08-01 11:00 UTC'):
        processor()

    mock_callable.assert_not_called()  # not yet

    with freezegun.freeze_time('2019-08-01 15:00 UTC'):
        processor()
        # Deliberately reproduce the impossible scenario which
        # test_timezone_aware_processor_doesnt_run_multiple_times carefully
        # avoids
        processor()

    mock_callable.assert_called_once_with()
Exemple #2
0
def _configure_schedule_for_state(
    scheduler: schedule.Scheduler,
    processor: StateSpecificCronProcessor,
    state: State,
) -> None:
    if isinstance(state, Action):
        scheduler.every().minute.do(
            processor,
            fn=process_action,
            label_provider=labels_in_state,
        )
    elif isinstance(state, Gate):
        for trigger in state.triggers:
            if isinstance(trigger, SystemTimeTrigger):
                scheduler.every().day.at(
                    f"{trigger.time.hour:02d}:{trigger.time.minute:02d}",
                ).do(
                    processor,
                    fn=process_gate,
                    label_provider=labels_in_state,
                )
            elif isinstance(trigger, TimezoneAwareTrigger):
                func = functools.partial(
                    processor,
                    fn=process_gate,
                    label_provider=labels_in_state,
                )
                scheduler.every().minute.do(
                    TimezoneAwareProcessor(func, trigger),
                )
            elif isinstance(trigger, MetadataTimezoneAwareTrigger):
                scheduler.every().minute.do(
                    MetadataTimezoneAwareProcessor(
                        functools.partial(processor, fn=process_gate),
                        trigger,
                    ),
                )
            elif isinstance(trigger, IntervalTrigger):
                scheduler.every(
                    trigger.interval.total_seconds(),
                ).seconds.do(
                    processor,
                    fn=process_gate,
                    label_provider=labels_in_state,
                )
            elif isinstance(trigger, MetadataTrigger):  # pragma: no branch
                label_provider = labels_needing_metadata_update_retry_in_gate
                scheduler.every().minute.do(
                    processor,
                    fn=process_gate,
                    label_provider=label_provider,
                )
            else:
                # We only care about time based triggers and retries here.
                pass  # pragma: no cover
    else:
        raise RuntimeError(  # pragma: no cover
            f"Unsupported state type {state}",
        )
Exemple #3
0
def test_timezone_aware_processor_repr() -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Etc/UTC')

    processor = TimezoneAwareProcessor(mock_callable, trigger)

    assert 'Etc/UTC' in repr(processor)
    assert '12:00' in repr(processor)
Exemple #4
0
def test_timezone_aware_processor_doesnt_run_at_wrong_time() -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Etc/UTC')

    with freezegun.freeze_time(recently()):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    processor()

    mock_callable.assert_not_called()
Exemple #5
0
def test_timezone_aware_processor_runs_on_time_other_timezone() -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(13, 0), 'Europe/London')

    with freezegun.freeze_time(recently()):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    processor()

    mock_callable.assert_called_once_with()
Exemple #6
0
def test_timezone_aware_processor_runs_if_delayed_since_construction() -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Etc/UTC')

    with freezegun.freeze_time('2019-08-01 11:00 UTC'):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    processor()

    mock_callable.assert_called_once_with()
Exemple #7
0
def test_timezone_aware_processor_doesnt_run_when_timezone_doesnt_match(
) -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Europe/London')

    with freezegun.freeze_time(recently()):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    processor()

    mock_callable.assert_not_called()
Exemple #8
0
def test_timezone_aware_processor_doesnt_run_multiple_times() -> None:
    mock_callable = mock.Mock()
    trigger = TimezoneAwareTrigger(datetime.time(12, 0), 'Etc/UTC')

    with freezegun.freeze_time('2019-08-01 01:00 UTC'):
        processor = TimezoneAwareProcessor(mock_callable, trigger)

    with freezegun.freeze_time('2019-08-01 11:00 UTC'):
        processor()

    mock_callable.assert_not_called()  # not yet

    with freezegun.freeze_time('2019-08-01 15:00 UTC') as frozen_time:
        processor()
        frozen_time.tick(delta=datetime.timedelta(microseconds=10))
        processor()

    mock_callable.assert_called_once_with()