"""Tests for agent_teams.timefmt time-context rendering."""
import re
import pytest
from openjiuwen.agent_teams.i18n import get_language, set_language
from openjiuwen.agent_teams.timefmt import _relative_key_and_value, format_time_context
_NOW_MS = 1_700_000_000_000
_SECOND = 1000
_MINUTE = 60 * _SECOND
_HOUR = 60 * _MINUTE
_DAY = 24 * _HOUR
@pytest.fixture
def restore_language():
"""Restore the process language after a test mutates it."""
previous = get_language()
yield
set_language(previous)
@pytest.mark.level0
def test_relative_key_and_value_buckets():
"""Bucket selection is pure numeric logic, independent of language."""
assert _relative_key_and_value(-5 * _SECOND) == ("time.just_now", None)
assert _relative_key_and_value(0) == ("time.just_now", None)
assert _relative_key_and_value(9 * _SECOND) == ("time.just_now", None)
assert _relative_key_and_value(10 * _SECOND) == ("time.seconds_ago", 10)
assert _relative_key_and_value(59 * _SECOND) == ("time.seconds_ago", 59)
assert _relative_key_and_value(_MINUTE) == ("time.minutes_ago", 1)
assert _relative_key_and_value(3599 * _SECOND) == ("time.minutes_ago", 59)
assert _relative_key_and_value(_HOUR) == ("time.hours_ago", 1)
assert _relative_key_and_value(86399 * _SECOND) == ("time.hours_ago", 23)
assert _relative_key_and_value(_DAY) == ("time.days_ago", 1)
assert _relative_key_and_value(10 * _DAY) == ("time.days_ago", 10)
@pytest.mark.level0
def test_format_time_context_just_now_cn(restore_language):
"""Sub-threshold deltas collapse to the localized 'just now' bucket."""
set_language("cn")
out = format_time_context(_NOW_MS - 3 * _SECOND, _NOW_MS)
assert "刚刚" in out
@pytest.mark.level0
def test_format_time_context_minutes_ago_en(restore_language):
"""Minute-bucket diffs render the English relative wording."""
set_language("en")
out = format_time_context(_NOW_MS - 3 * _MINUTE, _NOW_MS)
assert "3m ago" in out
@pytest.mark.level0
def test_format_time_context_hours_and_days(restore_language):
"""Hour and day buckets pick the right localized unit."""
set_language("cn")
assert "2 小时前" in format_time_context(_NOW_MS - 2 * _HOUR, _NOW_MS)
assert "5 天前" in format_time_context(_NOW_MS - 5 * _DAY, _NOW_MS)
@pytest.mark.level0
def test_format_time_context_future_clock_skew(restore_language):
"""A future timestamp (clock skew) never renders a negative diff."""
set_language("en")
out = format_time_context(_NOW_MS + _MINUTE, _NOW_MS)
assert "just now" in out
@pytest.mark.level0
def test_format_time_context_none_is_unknown(restore_language):
"""A missing timestamp renders the localized 'unknown' string."""
set_language("en")
assert format_time_context(None, _NOW_MS) == "unknown time"
set_language("cn")
assert format_time_context(None, _NOW_MS) == "时间未知"
@pytest.mark.level0
def test_format_time_context_absolute_has_offset(restore_language):
"""The absolute part carries a date and a numeric ``±HH:MM`` tz offset."""
set_language("en")
out = format_time_context(_NOW_MS, _NOW_MS)
assert "2023-11-1" in out
assert re.search(r"[+-]\d{2}:\d{2}", out) is not None