diff --git a/PanoramicData.OData.Client.Test/UnitTests/NestedExpandExpressionTests.cs b/PanoramicData.OData.Client.Test/UnitTests/NestedExpandExpressionTests.cs index 58b4707..1066e8f 100644 --- a/PanoramicData.OData.Client.Test/UnitTests/NestedExpandExpressionTests.cs +++ b/PanoramicData.OData.Client.Test/UnitTests/NestedExpandExpressionTests.cs @@ -50,7 +50,7 @@ public void Expand_WithSingleNestedProperty_ProducesNestedExpandSyntax() /// Tests that multiple independent expands still work correctly. /// [Fact] - public void Expand_WithMultipleIndependentProperties_ProducesCommaSepa­ratedExpands() + public void Expand_WithMultipleIndependentProperties_ProducesCommaSeparatedExpands() { // Arrange var builder = new ODataQueryBuilder("People", NullLogger.Instance); diff --git a/PanoramicData.OData.Client.Test/UnitTests/ODataBatchBuilderTests.cs b/PanoramicData.OData.Client.Test/UnitTests/ODataBatchBuilderTests.cs index 061750a..79712fd 100644 --- a/PanoramicData.OData.Client.Test/UnitTests/ODataBatchBuilderTests.cs +++ b/PanoramicData.OData.Client.Test/UnitTests/ODataBatchBuilderTests.cs @@ -1,3 +1,5 @@ +using System.Net.Http.Headers; + namespace PanoramicData.OData.Client.Test.UnitTests; /// @@ -36,6 +38,30 @@ public void Dispose() GC.SuppressFinalize(this); } + /// + /// Verifies that the HTTP content written to the stream includes the required headers + /// + [Fact] + public async Task WriteToStreamAsync_ShouldIncludeRequiredHeaders() + { + using var request = new HttpRequestMessage(HttpMethod.Post, "http://test.org/Customers"); + request.Content = new StringContent("{\"Name\":\"Test\"}"); + request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); + + using var content = new HttpMessageContent(request); + + // Act + var resultString = await content.ReadAsStringAsync(TestContext.Current.CancellationToken); + + // Assert: Check the HttpContent headers specifically + content.Headers.TryGetValues("Content-Transfer-Encoding", out var values); + values.Should().Contain("binary"); + + // Assert: Check the serialized string content + resultString.Should().Contain("POST /Customers HTTP/1.1"); + resultString.Should().Contain("Content-Type: application/json"); + } + #region Get Operation Tests /// diff --git a/PanoramicData.OData.Client.Test/UnitTests/ODataCrossJoinTests.cs b/PanoramicData.OData.Client.Test/UnitTests/ODataCrossJoinTests.cs index 4036682..657e2b6 100644 --- a/PanoramicData.OData.Client.Test/UnitTests/ODataCrossJoinTests.cs +++ b/PanoramicData.OData.Client.Test/UnitTests/ODataCrossJoinTests.cs @@ -113,7 +113,7 @@ public void CrossJoin_MultipleEntitySets_ShouldIncludeAll() } [Fact] - public async Task CrossJoin_LessThanTwoEntitySets_ShouldThrow() + public Task CrossJoin_LessThanTwoEntitySets_ShouldThrow() { // Arrange var logger = NullLogger.Instance; @@ -121,6 +121,7 @@ public async Task CrossJoin_LessThanTwoEntitySets_ShouldThrow() // Act & Assert var act = () => new ODataCrossJoinBuilder(["Products"], logger); act.Should().ThrowExactly(); + return Task.CompletedTask; } [Fact] diff --git a/PanoramicData.OData.Client.Test/UnitTests/ODataDateTimeConverterTests.cs b/PanoramicData.OData.Client.Test/UnitTests/ODataDateTimeConverterTests.cs index 9fb8f0c..6c74915 100644 --- a/PanoramicData.OData.Client.Test/UnitTests/ODataDateTimeConverterTests.cs +++ b/PanoramicData.OData.Client.Test/UnitTests/ODataDateTimeConverterTests.cs @@ -101,7 +101,7 @@ public void Read_InvalidDate_ReturnsDefault() public void Read_SimpleDateFormat_ParsesCorrectly() { // Arrange - var json = "\"2024-01-15\""; + var json = "\"2024-01-15Z\""; // Act var result = JsonSerializer.Deserialize(json, _options); diff --git a/PanoramicData.OData.Client/HttpMessageContent.cs b/PanoramicData.OData.Client/HttpMessageContent.cs index d2bdbdb..dbcff90 100644 --- a/PanoramicData.OData.Client/HttpMessageContent.cs +++ b/PanoramicData.OData.Client/HttpMessageContent.cs @@ -41,14 +41,14 @@ private async Task BuildContentAsync() var sb = new StringBuilder(); // Request line: METHOD path HTTP/1.1 - var requestUri = _request.RequestUri?.PathAndQuery ?? "/"; sb.Append(_request.Method.ToString()); sb.Append(' '); + var requestUri = (_request.RequestUri?.IsAbsoluteUri == true ? _request.RequestUri.PathAndQuery : _request.RequestUri?.ToString()) ?? "/"; sb.Append(requestUri); sb.AppendLine(" HTTP/1.1"); // Host header - if (_request.RequestUri?.Host is not null) + if (_request.RequestUri is { IsAbsoluteUri: true }) { sb.Append("Host: "); sb.AppendLine(_request.RequestUri.Host); diff --git a/PanoramicData.OData.Client/ODataClient.Batch.cs b/PanoramicData.OData.Client/ODataClient.Batch.cs index f518154..51fb105 100644 --- a/PanoramicData.OData.Client/ODataClient.Batch.cs +++ b/PanoramicData.OData.Client/ODataClient.Batch.cs @@ -109,8 +109,6 @@ private HttpMessageContent BuildOperationContent(ODataBatchOperation operation) } var content = new HttpMessageContent(innerRequest); - content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/http"); - content.Headers.TryAddWithoutValidation("Content-Transfer-Encoding", "binary"); return content; } diff --git a/PanoramicData.OData.Client/PanoramicData.OData.Client.csproj b/PanoramicData.OData.Client/PanoramicData.OData.Client.csproj index fc38907..d69aede 100644 --- a/PanoramicData.OData.Client/PanoramicData.OData.Client.csproj +++ b/PanoramicData.OData.Client/PanoramicData.OData.Client.csproj @@ -39,4 +39,8 @@ + + + +