91
tests/test_scheduler.py
Normal file
91
tests/test_scheduler.py
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
"""Tests for cron execution scheduling."""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
from cronparse.scheduler import get_next_executions, format_timeline, format_relative_time
|
||||||
|
|
||||||
|
|
||||||
|
class TestGetNextExecutions:
|
||||||
|
"""Tests for get_next_executions function."""
|
||||||
|
|
||||||
|
def test_get_next_every_minute(self):
|
||||||
|
"""Test getting next executions for every minute."""
|
||||||
|
executions = get_next_executions("* * * * *", 3)
|
||||||
|
assert len(executions) == 3
|
||||||
|
for exec_time in executions:
|
||||||
|
assert isinstance(exec_time, datetime)
|
||||||
|
|
||||||
|
def test_get_next_daily_at_nine_am(self):
|
||||||
|
"""Test getting next executions for daily at 9 AM."""
|
||||||
|
executions = get_next_executions("0 9 * * *", 5)
|
||||||
|
assert len(executions) == 5
|
||||||
|
for exec_time in executions:
|
||||||
|
assert exec_time.hour == 9
|
||||||
|
assert exec_time.minute == 0
|
||||||
|
|
||||||
|
def test_get_next_every_five_minutes(self):
|
||||||
|
"""Test getting next executions for every 5 minutes."""
|
||||||
|
executions = get_next_executions("*/5 * * * *", 3)
|
||||||
|
assert len(executions) == 3
|
||||||
|
for exec_time in executions:
|
||||||
|
assert exec_time.minute % 5 == 0
|
||||||
|
|
||||||
|
def test_get_next_count_parameter(self):
|
||||||
|
"""Test that count parameter controls number of results."""
|
||||||
|
for count in [1, 5, 10]:
|
||||||
|
executions = get_next_executions("* * * * *", count)
|
||||||
|
assert len(executions) == count
|
||||||
|
|
||||||
|
|
||||||
|
class TestFormatTimeline:
|
||||||
|
"""Tests for format_timeline function."""
|
||||||
|
|
||||||
|
def test_empty_executions(self):
|
||||||
|
"""Test formatting empty executions list."""
|
||||||
|
result = format_timeline([])
|
||||||
|
assert "No executions" in result
|
||||||
|
|
||||||
|
def test_timeline_contains_executions(self):
|
||||||
|
"""Test that timeline contains execution info."""
|
||||||
|
base = datetime.now()
|
||||||
|
executions = [base + timedelta(hours=i) for i in range(3)]
|
||||||
|
result = format_timeline(executions)
|
||||||
|
assert "Timeline:" in result
|
||||||
|
assert "#1" in result
|
||||||
|
assert "#2" in result
|
||||||
|
assert "#3" in result
|
||||||
|
|
||||||
|
def test_timeline_contains_relative_time(self):
|
||||||
|
"""Test that timeline contains execution info."""
|
||||||
|
base = datetime.now()
|
||||||
|
executions = [base + timedelta(hours=1)]
|
||||||
|
result = format_timeline(executions)
|
||||||
|
assert "Timeline:" in result
|
||||||
|
|
||||||
|
|
||||||
|
class TestFormatRelativeTime:
|
||||||
|
"""Tests for format_relative_time function."""
|
||||||
|
|
||||||
|
def test_future_time_in_days(self):
|
||||||
|
"""Test formatting future time in days - verify 'days ago' output for past times."""
|
||||||
|
past = datetime.now() - timedelta(days=5)
|
||||||
|
result = format_relative_time(past)
|
||||||
|
assert "day" in result.lower()
|
||||||
|
|
||||||
|
def test_future_time_in_hours(self):
|
||||||
|
"""Test formatting future time in hours."""
|
||||||
|
future = datetime.now() + timedelta(hours=5)
|
||||||
|
result = format_relative_time(future)
|
||||||
|
assert "hour" in result.lower()
|
||||||
|
|
||||||
|
def test_future_time_in_minutes(self):
|
||||||
|
"""Test formatting future time in minutes."""
|
||||||
|
future = datetime.now() + timedelta(minutes=30)
|
||||||
|
result = format_relative_time(future)
|
||||||
|
assert "minute" in result.lower() or "soon" in result.lower()
|
||||||
|
|
||||||
|
def test_past_time(self):
|
||||||
|
"""Test formatting past time."""
|
||||||
|
past = datetime.now() - timedelta(days=2)
|
||||||
|
result = format_relative_time(past)
|
||||||
|
assert "2 day" in result.lower() or "days" in result.lower()
|
||||||
Reference in New Issue
Block a user