Skip to content

Commit 37ed438

Browse files
authored
Merge pull request #895 from Muneer320/fix/datetime-fold-parameters
fix(abstractions): preserve datetime fold in request parameters
2 parents 1cc664f + cda2785 commit 37ed438

3 files changed

Lines changed: 20 additions & 5 deletions

File tree

‎packages/abstractions/kiota_abstractions/request_information.py‎

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,7 @@ def _get_sanitized_value(self, value: Any) -> Any:
315315
sanitized_value = value
316316
if isinstance(value, datetime):
317317
timezone_info = value.tzinfo if value.tzinfo is not None else timezone.utc
318-
temp_date_with_tz_info = datetime(
319-
value.year, value.month, value.day, value.hour, value.minute, value.second,
320-
value.microsecond, timezone_info
321-
)
322-
sanitized_value = temp_date_with_tz_info.isoformat("T")
318+
sanitized_value = value.replace(tzinfo=timezone_info).isoformat("T")
323319
elif isinstance(value, (UUID, date, time)):
324320
sanitized_value = str(value)
325321
return sanitized_value

‎packages/abstractions/requirements-dev.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@ pylint>=4.1.3,<5.0.0
55
mypy>=2.4.1,<3.0.0
66
pytest>=9.2.0,<10.0.0
77
pytest-asyncio>=1.4.1.post1,<1.5
8+
# Supply ZoneInfo data for the DST tests on systems without an IANA database.
9+
tzdata>=2026.6

‎packages/abstractions/tests/test_request_information.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from dataclasses import dataclass
33
from datetime import datetime
44
from typing import Optional
5+
from urllib.parse import parse_qs, unquote, urlsplit
56
from unittest.mock import Mock
7+
from zoneinfo import ZoneInfo
68

79
import pytest
810

@@ -262,6 +264,21 @@ def test_sets_datetime_values_in_path_parameters():
262264
assert request_info.url == "https://example.com/daysFrom/2020-08-01T00%3A20%3A00%2B00%3A00"
263265

264266

267+
@pytest.mark.parametrize("fold", [0, 1])
268+
@pytest.mark.parametrize("location", ["path", "query", "query_collection"])
269+
def test_datetime_parameters_preserve_fold(fold, location):
270+
value = datetime(2020, 11, 1, 1, 30, tzinfo=ZoneInfo("America/New_York"), fold=fold)
271+
if location == "path":
272+
request_info = RequestInformation(Method.GET, "https://example.com/events/{at}")
273+
request_info.path_parameters["at"] = value
274+
actual = unquote(urlsplit(request_info.url).path).rsplit("/", 1)[-1]
275+
else:
276+
request_info = RequestInformation(Method.GET, "https://example.com/events{?at}")
277+
request_info.query_parameters["at"] = [value] if location == "query_collection" else value
278+
actual = parse_qs(urlsplit(request_info.url).query)["at"][0]
279+
assert actual == value.isoformat()
280+
281+
265282
def test_sets_int_values_in_path_parameters():
266283
"""Tests setting int values values in path parameters
267284
"""

0 commit comments

Comments
 (0)