From ea3a24aa23b1056e699924e6bc595dee8cbecaa0 Mon Sep 17 00:00:00 2001 From: Carter Maisel Date: Wed, 18 Jun 2025 14:56:30 -0400 Subject: [PATCH 1/4] fix BatchRequestItem now properly serializes the header and body fields --- src/msgraph_core/requests/batch_request_item.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/msgraph_core/requests/batch_request_item.py b/src/msgraph_core/requests/batch_request_item.py index d7818736..608da1a9 100644 --- a/src/msgraph_core/requests/batch_request_item.py +++ b/src/msgraph_core/requests/batch_request_item.py @@ -258,19 +258,16 @@ def serialize(self, writer: SerializationWriter) -> None: writer.write_str_value('method', self.method) writer.write_str_value('url', self.url) writer.write_collection_of_primitive_values('depends_on', self._depends_on) - writer.write_collection_of_object_values( - 'headers', - self._headers # type: ignore # need method to serialize dicts + writer.write_additional_data_value( + {'headers': self._headers} # need proper method to serialize dicts ) if self._body: json_object = json.loads(self._body) is_json_string = json_object and isinstance(json_object, dict) # /$batch API expects JSON object or base 64 encoded value for the body if is_json_string: - writer.write_collection_of_object_values( # type: ignore - # need method to serialize dicts - 'body', - json_object + writer.write_additional_data_value( + {'body': json_object} # need proper method to serialize dicts ) else: writer.write_str_value('body', base64.b64encode(self._body).decode('utf-8')) From ad632ab226d8cb97c90eed91a94299d2fbd86c9a Mon Sep 17 00:00:00 2001 From: Carter Maisel Date: Fri, 20 Jun 2025 14:43:30 -0400 Subject: [PATCH 2/4] test Added a test for BatchRequestItem's serialize method. Adding this test required fixing the request_info fixture and the test_initialization test because they were using a BytesIO object when the content field should just be bytes. --- tests/requests/test_batch_request_item.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/requests/test_batch_request_item.py b/tests/requests/test_batch_request_item.py index 1f3dd971..77639360 100644 --- a/tests/requests/test_batch_request_item.py +++ b/tests/requests/test_batch_request_item.py @@ -1,7 +1,10 @@ import pytest +import json from io import BytesIO +from unittest.mock import Mock from urllib.request import Request from kiota_abstractions.request_information import RequestInformation +from kiota_abstractions.serialization.serialization_writer import SerializationWriter from kiota_abstractions.method import Method from kiota_abstractions.headers_collection import HeadersCollection as RequestHeaders from msgraph_core.requests.batch_request_item import BatchRequestItem @@ -15,7 +18,7 @@ def request_info(): request_info.http_method = "GET" request_info.url = "f{base_url}/me" request_info.headers = RequestHeaders() - request_info.content = BytesIO(b'{"key": "value"}') + request_info.content = b'{"key": "value"}' return request_info @@ -27,7 +30,7 @@ def batch_request_item(request_info): def test_initialization(batch_request_item, request_info): assert batch_request_item.method == "GET" assert batch_request_item.url == "f{base_url}/me" - assert batch_request_item.body.read() == b'{"key": "value"}' + assert batch_request_item.body == b'{"key": "value"}' def test_create_with_urllib_request(): @@ -123,3 +126,11 @@ def test_batch_request_item_method_enum(): def test_depends_on_property(batch_request_item): batch_request_item.set_depends_on(["request1", "request2"]) assert batch_request_item.depends_on == ["request1", "request2"] + + +def test_serialize(batch_request_item): + writer = Mock(spec=SerializationWriter) + batch_request_item.serialize(writer) + writer.write_additional_data_value.assert_any_call({'headers': batch_request_item._headers}) + json_object = json.loads(batch_request_item._body) + writer.write_additional_data_value.assert_called_with({'body': json_object}) From cf4fce6d4e9c6d0503116df5841bc2a860c6e160 Mon Sep 17 00:00:00 2001 From: Carter Maisel Date: Wed, 25 Jun 2025 11:56:29 -0400 Subject: [PATCH 3/4] test Serialize test for batch_request_item now uses the JsonSerializationWriter to test the result of serialization --- requirements-dev.txt | 2 ++ tests/requests/test_batch_request_item.py | 26 +++++++++++++++-------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 2cc19133..878f8173 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -151,6 +151,8 @@ microsoft-kiota-authentication-azure==1.9.3 microsoft-kiota-http==1.9.3 +microsoft-kiota-serialization-json==1.9.3 + multidict==6.5.0 ; python_version >= '3.7' uritemplate==4.2.0 ; python_version >= '3.6' diff --git a/tests/requests/test_batch_request_item.py b/tests/requests/test_batch_request_item.py index 77639360..433cce09 100644 --- a/tests/requests/test_batch_request_item.py +++ b/tests/requests/test_batch_request_item.py @@ -7,6 +7,7 @@ from kiota_abstractions.serialization.serialization_writer import SerializationWriter from kiota_abstractions.method import Method from kiota_abstractions.headers_collection import HeadersCollection as RequestHeaders +from kiota_serialization_json.json_serialization_writer_factory import JsonSerializationWriterFactory from msgraph_core.requests.batch_request_item import BatchRequestItem base_url = "https://graph.microsoft.com/v1.0/me" @@ -14,22 +15,25 @@ @pytest.fixture def request_info(): - request_info = RequestInformation() + request_info = RequestInformation() request_info.http_method = "GET" - request_info.url = "f{base_url}/me" + request_info.url = base_url request_info.headers = RequestHeaders() + request_info.headers.add("Content-Type", "application/json") request_info.content = b'{"key": "value"}' return request_info @pytest.fixture def batch_request_item(request_info): - return BatchRequestItem(request_information=request_info) + return BatchRequestItem(request_information=request_info, id="123") def test_initialization(batch_request_item, request_info): + assert batch_request_item.id == "123" assert batch_request_item.method == "GET" - assert batch_request_item.url == "f{base_url}/me" + assert batch_request_item.url == base_url + assert batch_request_item.headers == {"content-type": "application/json"} assert batch_request_item.body == b'{"key": "value"}' @@ -128,9 +132,13 @@ def test_depends_on_property(batch_request_item): assert batch_request_item.depends_on == ["request1", "request2"] -def test_serialize(batch_request_item): - writer = Mock(spec=SerializationWriter) +def test_serialize_json(batch_request_item): + writer = JsonSerializationWriterFactory().get_serialization_writer('application/json') batch_request_item.serialize(writer) - writer.write_additional_data_value.assert_any_call({'headers': batch_request_item._headers}) - json_object = json.loads(batch_request_item._body) - writer.write_additional_data_value.assert_called_with({'body': json_object}) + content = json.loads(writer.get_serialized_content()) + assert content["id"] == "123" + assert content["method"] == "GET" + assert content["url"] == base_url + assert content["headers"] == {"content-type": "application/json"} + assert content["body"] == {"key": "value"} + From f07b5b8f9673a391e85d2fead013e70fb5fd4766 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Fri, 27 Jun 2025 11:44:54 -0400 Subject: [PATCH 4/4] chore: formatting --- src/msgraph_core/requests/batch_request_item.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/msgraph_core/requests/batch_request_item.py b/src/msgraph_core/requests/batch_request_item.py index 608da1a9..716a8a22 100644 --- a/src/msgraph_core/requests/batch_request_item.py +++ b/src/msgraph_core/requests/batch_request_item.py @@ -259,7 +259,7 @@ def serialize(self, writer: SerializationWriter) -> None: writer.write_str_value('url', self.url) writer.write_collection_of_primitive_values('depends_on', self._depends_on) writer.write_additional_data_value( - {'headers': self._headers} # need proper method to serialize dicts + {'headers': self._headers} # need proper method to serialize dicts ) if self._body: json_object = json.loads(self._body) @@ -267,7 +267,7 @@ def serialize(self, writer: SerializationWriter) -> None: # /$batch API expects JSON object or base 64 encoded value for the body if is_json_string: writer.write_additional_data_value( - {'body': json_object} # need proper method to serialize dicts + {'body': json_object} # need proper method to serialize dicts ) else: writer.write_str_value('body', base64.b64encode(self._body).decode('utf-8'))