43 lines
1.9 KiB
Python
43 lines
1.9 KiB
Python
"""Unit tests for cohort filter helpers in estimator.py.
|
|
|
|
PR 10 (2026-05-24) — covers _target_cohort_range edge cases:
|
|
None, out-of-range, exact boundaries, first-match semantics.
|
|
"""
|
|
import os
|
|
|
|
# Settings requires DATABASE_URL at init time. Set dummy DSN before any app import.
|
|
os.environ.setdefault("DATABASE_URL", "postgresql://test:test@localhost/test_db")
|
|
|
|
import pytest
|
|
|
|
from app.services.estimator import _target_cohort_range
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("year", "expected"),
|
|
[
|
|
(None, None), # no year → no cohort
|
|
(1900, None), # out-of-range below → no cohort
|
|
(1954, None), # below khrushchev floor
|
|
(1955, (1955, 1969)), # khrushchev floor
|
|
(1960, (1955, 1969)), # khrushchev mid
|
|
(1969, (1955, 1969)), # khrushchev ceiling
|
|
(1970, (1970, 1989)), # brezhnev floor
|
|
(1978, (1970, 1989)), # brezhnev (target audit case)
|
|
(1988, (1970, 1989)), # brezhnev pre-overlap fix held
|
|
(1989, (1970, 1989)), # brezhnev ceiling
|
|
(1990, (1990, 1999)), # late_soviet floor (post-PR10 fix)
|
|
(1995, (1990, 1999)), # late_soviet mid
|
|
(1999, (1990, 1999)), # late_soviet ceiling
|
|
(2000, (2000, 2010)), # 2000s floor
|
|
(2010, (2000, 2010)), # 2000s ceiling
|
|
(2011, (2011, 2100)), # modern floor
|
|
(2024, (2011, 2100)), # modern current
|
|
(2100, (2011, 2100)), # modern ceiling
|
|
(2101, None), # above modern ceiling → no cohort
|
|
(2200, None), # far future → no cohort
|
|
],
|
|
)
|
|
def test_target_cohort_range(year, expected):
|
|
"""First-match cohort mapping; out-of-range and None → None."""
|
|
assert _target_cohort_range(year) == expected
|