Systematic rename of all semantic anchors (#region, [DEF], @RELATION) across 1400+ files — backend Python, frontend Svelte/TS, specs, docs: - Flat anchors become Namespace.Module.Entity - @RELATION references updated to match new anchor paths - Zero business logic changes
81 lines
3.6 KiB
Python
81 lines
3.6 KiB
Python
# #region Test.Scheduler.EnsureAware [C:2] [TYPE Module] [SEMANTICS test,scheduler,datetime,utc]
|
|
# @BRIEF Verify _ensure_aware contract — naive→UTC conversion, aware passthrough, None passthrough.
|
|
# @RELATION BINDS_TO -> [TranslationScheduler._ensure_aware]
|
|
# @TEST_EDGE naive_to_aware -> Naive datetime gets UTC tzinfo
|
|
# @TEST_EDGE already_aware -> Aware datetime returned unchanged
|
|
# @TEST_EDGE none_passthrough -> None returns None
|
|
# @TEST_EDGE subtraction_works -> Conversion enables subtraction with datetime.now(UTC)
|
|
#
|
|
# @RATIONALE SQLAlchemy DateTime (without timezone=True) returns naive datetimes
|
|
# even when stored as UTC. This module verifies the normalization
|
|
# helper used throughout execute_scheduled_translation for safe
|
|
# datetime arithmetic.
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
from datetime import UTC, datetime, timedelta
|
|
|
|
|
|
# #region Test.Scheduler.TestEnsureAware [C:2] [TYPE Class] [SEMANTICS test,scheduler,datetime]
|
|
# @BRIEF Tests for _ensure_aware() — naive-to-UTC conversion and edge cases.
|
|
class TestEnsureAware:
|
|
"""_ensure_aware — convert naive DB datetime to UTC-aware for safe arithmetic."""
|
|
|
|
# #region Test.Scheduler.TestNaiveToAware [C:2] [TYPE Function] [SEMANTICS test,datetime,naive]
|
|
# @BRIEF Naive datetime gets UTC tzinfo attached.
|
|
def test_naive_to_aware(self):
|
|
from src.plugins.translate.scheduler import _ensure_aware
|
|
|
|
naive = datetime(2024, 6, 15, 10, 30, 0)
|
|
result = _ensure_aware(naive)
|
|
|
|
assert result.tzinfo is not None
|
|
assert result.tzinfo == UTC
|
|
assert result == naive.replace(tzinfo=UTC)
|
|
assert result.hour == 10 # no offset shift
|
|
# #endregion Test.Scheduler.TestNaiveToAware
|
|
|
|
# #region Test.Scheduler.TestAlreadyAwarePassthrough [C:2] [TYPE Function] [SEMANTICS test,datetime,aware]
|
|
# @BRIEF Already UTC-aware datetime returned unchanged (same object).
|
|
def test_already_aware_passthrough(self):
|
|
from src.plugins.translate.scheduler import _ensure_aware
|
|
|
|
aware = datetime(2024, 6, 15, 10, 30, 0, tzinfo=UTC)
|
|
result = _ensure_aware(aware)
|
|
|
|
assert result is aware # same object identity
|
|
assert result.tzinfo == UTC
|
|
# #endregion Test.Scheduler.TestAlreadyAwarePassthrough
|
|
|
|
# #region Test.Scheduler.TestNoneReturnsNone [C:2] [TYPE Function] [SEMANTICS test,datetime,none]
|
|
# @BRIEF None input returns None.
|
|
def test_none_returns_none(self):
|
|
from src.plugins.translate.scheduler import _ensure_aware
|
|
|
|
result = _ensure_aware(None)
|
|
assert result is None
|
|
# #endregion Test.Scheduler.TestNoneReturnsNone
|
|
|
|
# #region Test.Scheduler.TestSubtractionWorks [C:2] [TYPE Function] [SEMANTICS test,datetime,arithmetic]
|
|
# @BRIEF Naive→aware conversion enables subtraction with datetime.now(UTC)
|
|
# without TypeError (the original problem this function solves).
|
|
def test_subtraction_works(self):
|
|
from src.plugins.translate.scheduler import _ensure_aware
|
|
|
|
naive = datetime(2024, 6, 15, 10, 0, 0)
|
|
aware = _ensure_aware(naive)
|
|
now = datetime.now(UTC)
|
|
|
|
# This would raise TypeError without _ensure_aware:
|
|
# TypeError: can't subtract offset-naive and offset-aware datetimes
|
|
elapsed = now - aware
|
|
assert isinstance(elapsed, timedelta)
|
|
assert elapsed.total_seconds() > 0 # always positive vs past date
|
|
# #endregion Test.Scheduler.TestSubtractionWorks
|
|
|
|
# #endregion Test.Scheduler.TestEnsureAware
|
|
# #endregion Test.Scheduler.EnsureAware
|