gendesign/backend/tests/services/test_2464h_timing_overlap_formula.py
bot-backend 43c71a006d
All checks were successful
Deploy / changes (push) Successful in 7s
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy / build-backend (push) Successful in 2m4s
Deploy / build-worker (push) Successful in 3m9s
Deploy / deploy (push) Successful in 1m27s
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 9s
docs(ptica): три комментария, утверждавших не то, что делает код (#2464 кластер H) (#2943)
2026-08-19 17:09:24 +00:00

45 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""#2464 кластер H: докстринг `_timing_overlap` обещал не ту формулу.
Было записано `exp(|Δмесяцев| / half_life)` и тут же — «расхождение в half_life
мес → 0.5». Эти два утверждения несовместимы: `exp(1) ≈ 0.368`, а не 0.5.
Код при этом верен — он считает `0.5 ** (Δ/half_life)` и даёт ровно 0.5 на
половинном периоде. Расходился докстринг.
Тест закрепляет СВОЙСТВО, а не текст комментария: на Δ = half_life значение равно
0.5, и оно НЕ равно exp(1). Второе утверждение существенно — без него тест прошёл
бы и на экспоненциальной формуле, если бы кто-то «починил» код по старому
докстрингу.
"""
from __future__ import annotations
import math
from datetime import date
from app.services.forecasting.special_indices import _timing_overlap
def test_half_life_gives_exactly_one_half() -> None:
same = date(2026, 1, 1)
later = date(2026, 7, 1) # ровно 6 месяцев
value = _timing_overlap(later, same, half_life_months=6.0)
assert value is not None
assert abs(value - 0.5) < 1e-9, "на половинном периоде значение обязано быть 0.5"
assert abs(value - math.exp(-1)) > 0.1, (
"значение совпало с exp(1) — значит формула экспоненциальная, "
"а докстринг обещает половинное затухание"
)
def test_simultaneous_launch_is_one() -> None:
same = date(2026, 1, 1)
assert _timing_overlap(same, same, half_life_months=6.0) == 1.0
def test_missing_date_returns_none_not_a_number() -> None:
"""Контроль: недоступную ось не фабрикуем (обещание того же докстринга)."""
assert _timing_overlap(None, date(2026, 1, 1)) is None
assert _timing_overlap(date(2026, 1, 1), None) is None