from datetime import datetime, timedelta, timezone import pytest from api.types.colg import OfficialGold, RealTimeGold from api.utils.gold_time import half_hour_start, refresh_slot CHINA = timezone(timedelta(hours=8)) def stamp(hour, minute, second=0): return int(datetime(2026, 11, 4, hour, minute, second, tzinfo=CHINA).timestamp()) @pytest.mark.parametrize(('hour', 'minute', 'second', 'target_hour', 'target_minute'), [ (1, 24, 59, 1, 0), (1, 25, 0, 1, 30), (1, 29, 59, 1, 30), (1, 30, 0, 1, 30), (1, 54, 59, 1, 30), (1, 55, 0, 2, 0), (2, 0, 0, 2, 0), (23, 55, 0, 0, 0), ]) def test_refresh_slot_advances_five_minutes_before_boundary(hour, minute, second, target_hour, target_minute): expected = stamp(target_hour, target_minute) if hour == 23: expected += 24 * 60 * 60 assert refresh_slot(stamp(hour, minute, second)) == expected def test_response_types_round_price_values_and_keep_timestamp_types(): realtime = RealTimeGold(updataTime=stamp(1, 30), region='跨1', code='k1', goldPrice=105.26315789) assert realtime.goldPrice == 105.26 assert realtime.updataTime == stamp(1, 30) assert isinstance(realtime.updataTime, int) official = OfficialGold(updataTime=str(stamp(1, 30)), region='跨1', code='k1', goldDealRank=[125.556], goldTopDealRank=[250.123], max=79.64444, min=39.9876) assert official.goldDealRank == [125.56] assert official.goldTopDealRank == [250.12] assert official.max == 79.64 and official.min == 39.99 assert official.updataTime == str(stamp(1, 30)) assert half_hour_start(stamp(1, 29, 59)) == stamp(1, 0)