Напоминалки: чистая логика расчёта дат (reminders.py)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
from datetime import datetime
|
||||
from reminders import parse_reminder_datetime, compute_next_occurrence
|
||||
|
||||
|
||||
def test_parse_reminder_datetime_valid():
|
||||
dt = parse_reminder_datetime("15.03.2027 09:00")
|
||||
assert dt == datetime(2027, 3, 15, 9, 0)
|
||||
|
||||
|
||||
def test_parse_reminder_datetime_invalid():
|
||||
assert parse_reminder_datetime("не дата") is None
|
||||
assert parse_reminder_datetime("2027-03-15 09:00") is None
|
||||
assert parse_reminder_datetime("32.13.2027 09:00") is None
|
||||
|
||||
|
||||
def test_compute_next_weekly():
|
||||
anchor = datetime(2026, 9, 2, 9, 0)
|
||||
nxt = compute_next_occurrence(anchor, "weekly", after=anchor)
|
||||
assert nxt == datetime(2026, 9, 9, 9, 0)
|
||||
|
||||
|
||||
def test_compute_next_monthly_end_of_month_clamp_no_drift():
|
||||
"""31.01 -> 28.02 (2026 не високосный), а дальше 31.03 — не 28.03 (без дрейфа)."""
|
||||
anchor = datetime(2026, 1, 31, 9, 0)
|
||||
first = compute_next_occurrence(anchor, "monthly", after=anchor)
|
||||
assert first == datetime(2026, 2, 28, 9, 0)
|
||||
second = compute_next_occurrence(anchor, "monthly", after=first)
|
||||
assert second == datetime(2026, 3, 31, 9, 0)
|
||||
|
||||
|
||||
def test_compute_next_yearly_leap_day():
|
||||
anchor = datetime(2024, 2, 29, 9, 0)
|
||||
nxt = compute_next_occurrence(anchor, "yearly", after=anchor)
|
||||
assert nxt == datetime(2025, 2, 28, 9, 0)
|
||||
|
||||
|
||||
def test_compute_next_skips_missed_periods_during_downtime():
|
||||
"""Бот стоял два месяца — пропущенные периоды пропускаются, берём ближайшее будущее."""
|
||||
anchor = datetime(2026, 1, 1, 9, 0)
|
||||
after = datetime(2026, 3, 15, 0, 0)
|
||||
nxt = compute_next_occurrence(anchor, "monthly", after=after)
|
||||
assert nxt == datetime(2026, 4, 1, 9, 0)
|
||||
|
||||
|
||||
def test_compute_next_unknown_recurrence_raises():
|
||||
import pytest
|
||||
with pytest.raises(ValueError):
|
||||
compute_next_occurrence(datetime(2026, 1, 1, 9, 0), "daily", after=datetime(2026, 1, 1, 9, 0))
|
||||
Reference in New Issue
Block a user