You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SoulSync/tests/test_release_dates.py

68 lines
2.6 KiB

"""#705 release-date gate: unreleased tracks stay out of hot paths.
Watchlist scans add announced albums on purpose; the gate keeps their
future-dated tracks out of the wishlist search cycle and the Fresh Tape
radar until release day. Conservative by design: only a CONFIDENTLY
future date gates; bad/missing dates never block anything.
"""
from __future__ import annotations
from datetime import date
from core.metadata.release_dates import (
is_future_release,
split_released_unreleased,
track_release_date,
)
TODAY = date(2026, 6, 7)
def test_full_dates():
assert is_future_release('2026-06-08', today=TODAY) is True
assert is_future_release('2026-06-07', today=TODAY) is False # release DAY = released
assert is_future_release('2026-06-06', today=TODAY) is False
assert is_future_release('2027-01-01', today=TODAY) is True
def test_partial_dates_are_conservative():
# Year-only: future only when the YEAR is future.
assert is_future_release('2027', today=TODAY) is True
assert is_future_release('2026', today=TODAY) is False
# Year-month: future only when the MONTH is future.
assert is_future_release('2026-07', today=TODAY) is True
assert is_future_release('2026-06', today=TODAY) is False
assert is_future_release('2026-05', today=TODAY) is False
def test_garbage_never_blocks():
for bad in ('', None, 'unknown', 'soon', '20xx-01-01', '2026-13-45', 123, {}):
assert is_future_release(bad, today=TODAY) is False
def test_invalid_day_falls_back_to_month_precision():
# 2026-06-99 is unparseable as a date but month precision says "not future".
assert is_future_release('2026-06-99', today=TODAY) is False
assert is_future_release('2026-07-99', today=TODAY) is True
def test_track_release_date_shapes():
assert track_release_date({'album': {'release_date': '2026-10-03'}}) == '2026-10-03'
assert track_release_date({'release_date': '2026'}) == '2026'
assert track_release_date({'album': 'a-string'}) == ''
assert track_release_date({}) == ''
assert track_release_date(None) == ''
def test_split_partitions_and_preserves_order():
tracks = [
{'name': 'out', 'album': {'release_date': '2026-01-01'}},
{'name': 'tomorrow', 'album': {'release_date': '2026-06-08'}},
{'name': 'no-date', 'album': {}},
{'name': 'next-year', 'release_date': '2027'},
]
released, unreleased = split_released_unreleased(tracks, today=TODAY)
assert [t['name'] for t in released] == ['out', 'no-date']
assert [t['name'] for t in unreleased] == ['tomorrow', 'next-year']