init
This commit is contained in:
commit
ac93e6074b
38 changed files with 7162 additions and 0 deletions
97
tests/test_reports.py
Normal file
97
tests/test_reports.py
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
from datetime import date
|
||||
|
||||
from common_cents.screens.reports import (
|
||||
_date_range,
|
||||
_month_options,
|
||||
_months_in_range,
|
||||
)
|
||||
|
||||
|
||||
def test_months_in_range_same_month():
|
||||
assert _months_in_range("2026-05-01", "2026-05-31") == 1
|
||||
|
||||
|
||||
def test_months_in_range_multi_month():
|
||||
assert _months_in_range("2026-01-01", "2026-12-31") == 12
|
||||
|
||||
|
||||
def test_months_in_range_year_crossover():
|
||||
assert _months_in_range("2025-11-01", "2026-02-15") == 4
|
||||
|
||||
|
||||
def test_date_range_this_month():
|
||||
import calendar
|
||||
|
||||
start, end, label = _date_range("this-month")
|
||||
today = date.today()
|
||||
last_day = calendar.monthrange(today.year, today.month)[1]
|
||||
assert start == today.replace(day=1).isoformat()
|
||||
assert end == today.replace(day=last_day).isoformat()
|
||||
assert "This Month" in label
|
||||
|
||||
|
||||
def test_date_range_last_month():
|
||||
start, end, _label = _date_range("last-month")
|
||||
today = date.today()
|
||||
end_d = date.fromisoformat(end)
|
||||
# last day of previous month
|
||||
assert end_d < today.replace(day=1)
|
||||
assert date.fromisoformat(start).day == 1
|
||||
assert end_d.month == date.fromisoformat(start).month
|
||||
|
||||
|
||||
def test_date_range_ytd():
|
||||
start, end, _label = _date_range("ytd")
|
||||
today = date.today()
|
||||
assert start == date(today.year, 1, 1).isoformat()
|
||||
assert end == today.isoformat()
|
||||
|
||||
|
||||
def test_date_range_last_12_months():
|
||||
"""Trailing 12 months = current month + 11 prior, so spans 12 distinct months."""
|
||||
start, end, _label = _date_range("last-12")
|
||||
assert _months_in_range(start, end) == 12
|
||||
|
||||
|
||||
def test_date_range_custom_month_bounds():
|
||||
"""Custom range expands YYYY-MM to first/last day of the chosen months."""
|
||||
start, end, label = _date_range("custom", "2026-03", "2026-05")
|
||||
assert start == "2026-03-01"
|
||||
assert end == "2026-05-31"
|
||||
assert "Mar 2026" in label and "May 2026" in label
|
||||
|
||||
|
||||
def test_date_range_custom_single_month():
|
||||
start, end, label = _date_range("custom", "2026-02", "2026-02")
|
||||
assert start == "2026-02-01"
|
||||
assert end == "2026-02-28"
|
||||
assert label == "Custom (Feb 2026)"
|
||||
|
||||
|
||||
def test_date_range_custom_swaps_when_inverted():
|
||||
start, end, _label = _date_range("custom", "2026-12", "2026-01")
|
||||
assert start == "2026-01-01"
|
||||
assert end == "2026-12-31"
|
||||
|
||||
|
||||
def test_date_range_custom_falls_back_to_current_month_when_blank():
|
||||
start, end, _label = _date_range("custom", "", "")
|
||||
today = date.today()
|
||||
assert start.startswith(today.strftime("%Y-%m"))
|
||||
assert start.endswith("-01")
|
||||
assert end.startswith(today.strftime("%Y-%m"))
|
||||
|
||||
|
||||
def test_month_options_descending_and_inclusive():
|
||||
opts = _month_options(date(2026, 3, 1), date(2026, 5, 15))
|
||||
# latest first, three months, label = abbr month + year, value = YYYY-MM
|
||||
assert opts == [
|
||||
("May 2026", "2026-05"),
|
||||
("Apr 2026", "2026-04"),
|
||||
("Mar 2026", "2026-03"),
|
||||
]
|
||||
|
||||
|
||||
def test_month_options_year_crossover():
|
||||
opts = _month_options(date(2025, 11, 1), date(2026, 1, 31))
|
||||
assert [v for _, v in opts] == ["2026-01", "2025-12", "2025-11"]
|
||||
Loading…
Add table
Add a link
Reference in a new issue