Merge pull request #1399 from Fr1ngg/m7z0jw-bedolaga/fix-datetime-error-in-payment-processing

Fix WATA datetime timezone handling
This commit is contained in:
Egor
2025-10-19 01:25:15 +03:00
committed by GitHub
2 changed files with 27 additions and 4 deletions

View File

@@ -102,8 +102,11 @@ class WataService:
@staticmethod
def _format_datetime(value: datetime) -> str:
aware = value.astimezone(timezone.utc)
return aware.replace(tzinfo=timezone.utc).isoformat().replace("+00:00", "Z")
if value.tzinfo is None:
aware = value.replace(tzinfo=timezone.utc)
else:
aware = value.astimezone(timezone.utc)
return aware.isoformat().replace("+00:00", "Z")
@staticmethod
def _parse_datetime(raw: Optional[str]) -> Optional[datetime]:
@@ -111,7 +114,10 @@ class WataService:
return None
try:
normalized = raw.replace("Z", "+00:00")
return datetime.fromisoformat(normalized)
parsed = datetime.fromisoformat(normalized)
if parsed.tzinfo is None:
return parsed
return parsed.astimezone(timezone.utc).replace(tzinfo=None)
except (ValueError, TypeError):
logger.debug("Failed to parse WATA datetime: %s", raw)
return None

View File

@@ -2,7 +2,7 @@
from __future__ import annotations
from datetime import datetime
from datetime import datetime, timezone
from pathlib import Path
import sys
from typing import Any, Dict, Optional
@@ -16,6 +16,7 @@ if str(ROOT_DIR) not in sys.path:
import app.services.payment_service as payment_service_module # noqa: E402
from app.config import settings # noqa: E402
from app.services.payment_service import PaymentService # noqa: E402
from app.services.wata_service import WataService # noqa: E402
@pytest.fixture
@@ -76,6 +77,22 @@ def _make_service(stub: Optional[StubWataService]) -> PaymentService:
return service
def test_wata_service_format_datetime_accepts_naive_utc() -> None:
value = datetime(2024, 5, 20, 12, 30, 0)
formatted = WataService._format_datetime(value)
assert formatted == "2024-05-20T12:30:00Z"
def test_wata_service_parse_datetime_returns_naive_utc() -> None:
parsed = WataService._parse_datetime("2024-05-20T12:30:00Z")
assert parsed == datetime(2024, 5, 20, 12, 30, 0)
assert parsed.tzinfo is None
parsed_with_offset = WataService._parse_datetime("2024-05-20T15:30:00+03:00")
assert parsed_with_offset == datetime(2024, 5, 20, 12, 30, 0)
assert parsed_with_offset.tzinfo is None
@pytest.mark.anyio("asyncio")
async def test_create_wata_payment_success(monkeypatch: pytest.MonkeyPatch) -> None:
response = {