from datetime import date, datetime, timezone import pytest from slz_config.entities import DSPConfig from slz_job_manager.helpers import uow_config from slz_job_manager.helpers.uow_config import generate_timeframes @pytest.mark.parametrize( 'schedule, now, skip, expected_next_date', [ ( '*/30 * * * *', datetime(2019, 9, 1, 0, 20, 0, tzinfo=timezone.utc), 0, datetime(2019, 9, 1, 0, 30, 0, tzinfo=timezone.utc) ), ( '*/30 * * * *', datetime(2019, 9, 1, 0, 35, 0, tzinfo=timezone.utc), 0, datetime(2019, 9, 1, 1, 0, 0, tzinfo=timezone.utc) ), ( '*/30 5-23 * * *', datetime(2019, 9, 1, 0, 35, 0, tzinfo=timezone.utc), 0, datetime(2019, 9, 1, 5, 0, 0, tzinfo=timezone.utc) ), ( '*/30 5-23 * * *', datetime(2019, 9, 1, 0, 35, 0, tzinfo=timezone.utc), 3, datetime(2019, 9, 1, 6, 30, 0, tzinfo=timezone.utc) ), ( '*/30 * * * *', datetime(2019, 9, 1, 0, 35, 0, tzinfo=timezone.utc), 3, datetime(2019, 9, 1, 2, 30, 0, tzinfo=timezone.utc) ), ( '*/30 5-23 * * *', datetime(2019, 9, 1, 7, 35, 0, tzinfo=timezone.utc), 0, datetime(2019, 9, 1, 8, 0, 0, tzinfo=timezone.utc) ), ( '*/15 * * * *', datetime(2019, 9, 1, 0, 20, 0, tzinfo=timezone.utc), 0, datetime(2019, 9, 1, 0, 30, 0, tzinfo=timezone.utc) ), ] ) def test_schedule_get_next(schedule, now, skip, expected_next_date): result = uow_config.schedule_get_next(schedule=schedule, start_time=now, skip=skip) assert result == expected_next_date @pytest.mark.parametrize( 'valid_from, valid_until, expected_is_valid', [ (None, None, True), (None, datetime(2021, 10, 1, tzinfo=timezone.utc), True), (datetime(2019, 10, 1, tzinfo=timezone.utc), None, True), (None, datetime(2020, 9, 3, tzinfo=timezone.utc), True), (None, datetime(2020, 9, 2, tzinfo=timezone.utc), False), (datetime(2020, 9, 4, tzinfo=timezone.utc), None, False), ] ) def test_config_is_valid_no_frequency(valid_from, valid_until, expected_is_valid): now = date(2020, 9, 3) config = DSPConfig.empty() config.args.valid_from = valid_from config.args.valid_until = valid_until result = uow_config.check_config_is_valid(config, now) assert result == expected_is_valid @pytest.mark.parametrize( 'valid_from, valid_until, frequency, now, expected_is_valid', [ ( datetime(2020, 1, 1, tzinfo=timezone.utc), datetime(2021, 1, 1, tzinfo=timezone.utc), '0 0 L * *', date(2020, 1, 31), True, ), ( datetime(2020, 1, 1, tzinfo=timezone.utc), datetime(2021, 1, 1, tzinfo=timezone.utc), '0 0 L * *', date(2020, 1, 25), False, ), ( datetime(2020, 1, 1, tzinfo=timezone.utc), datetime(2021, 1, 1, tzinfo=timezone.utc), '0 0 */3 * *', date(2020, 2, 22), True, ), ( datetime(2020, 1, 1, tzinfo=timezone.utc), datetime(2021, 1, 1, tzinfo=timezone.utc), '0 0 24 * *', date(2020, 2, 22), False, ), ] ) def test_config_is_valid_with_frequency(valid_from, valid_until, frequency, now, expected_is_valid): config = DSPConfig.empty() config.frequency = frequency config.args.valid_from = valid_from config.args.valid_until = valid_until result = uow_config.check_config_is_valid(config, now) assert result == expected_is_valid def test_config_is_valid_should_raise_exc(): now = date(2020, 2, 22) config = DSPConfig.empty() config.frequency = 'invalid' with pytest.raises(ValueError): uow_config.check_config_is_valid(config, now) @pytest.mark.parametrize( 'timeframe_hours, expected', [ ( 4, [ [datetime(2021, 3, 15, 0, 0, 0), datetime(2021, 3, 15, 3, 59, 59)], [datetime(2021, 3, 15, 4, 0, 0), datetime(2021, 3, 15, 7, 59, 59)], [datetime(2021, 3, 15, 8, 0, 0), datetime(2021, 3, 15, 11, 59, 59)], [datetime(2021, 3, 15, 12, 0, 0), datetime(2021, 3, 15, 15, 59, 59)], [datetime(2021, 3, 15, 16, 0, 0), datetime(2021, 3, 15, 19, 59, 59)], [datetime(2021, 3, 15, 20, 0, 0), datetime(2021, 3, 15, 23, 59, 59)], ] ), ( 7, [ [datetime(2021, 3, 15, 0, 0, 0), datetime(2021, 3, 15, 6, 59, 59)], [datetime(2021, 3, 15, 7, 0, 0), datetime(2021, 3, 15, 13, 59, 59)], [datetime(2021, 3, 15, 14, 0, 0), datetime(2021, 3, 15, 20, 59, 59)], [datetime(2021, 3, 15, 21, 0, 0), datetime(2021, 3, 15, 23, 59, 59)], ] ), ( 13, [ [datetime(2021, 3, 15, 0, 0, 0), datetime(2021, 3, 15, 12, 59, 59)], [datetime(2021, 3, 15, 13, 0, 0), datetime(2021, 3, 15, 23, 59, 59)], ] ), ] ) def test_generate_timeframes(timeframe_hours, expected): report_date = datetime(2021, 3, 15).date() actual = generate_timeframes(report_date, timeframe_hours) assert actual == expected