From 8976d24f0298602ed6d6d258cfaa2cd44f5691d2 Mon Sep 17 00:00:00 2001 From: Elizabeth Okerio Date: Tue, 7 Mar 2023 10:36:14 +0300 Subject: [PATCH] update the CreateODataDeltaResourceSetReaderAsync method (#2752) * update the CreateODataDeltaResourceSetReaderAsync method * update version * update version --- .../AspNetODataSample.Web.csproj | 14 +-- samples/AspNetODataSample.Web/packages.config | 6 +- .../ODataResourceSetDeserializer.cs | 6 +- .../Microsoft.AspNet.OData.csproj | 12 +-- src/Microsoft.AspNet.OData/packages.config | 6 +- .../Microsoft.AspNetCore.OData.csproj | 6 +- .../Microsoft.Test.E2E.AspNet.OData.csproj | 16 ++-- .../Build.AspNet/packages.config | 8 +- ...Microsoft.Test.E2E.AspNetCore.OData.csproj | 16 ++-- .../Build.AspNetCore/packages.config | 8 +- ...crosoft.Test.E2E.AspNetCore3x.OData.csproj | 2 +- .../BulkOperation/BulkOperationTest.cs | 88 +++++++++++++++++++ .../Query/Expressions/FilterBinderTests.cs | 4 +- .../Microsoft.AspNet.OData.Test.csproj | 12 +-- .../packages.config | 6 +- .../Microsoft.AspNetCore.OData.Test.csproj | 12 +-- 16 files changed, 156 insertions(+), 66 deletions(-) diff --git a/samples/AspNetODataSample.Web/AspNetODataSample.Web.csproj b/samples/AspNetODataSample.Web/AspNetODataSample.Web.csproj index a7250f286c..a2bf3e7175 100644 --- a/samples/AspNetODataSample.Web/AspNetODataSample.Web.csproj +++ b/samples/AspNetODataSample.Web/AspNetODataSample.Web.csproj @@ -88,20 +88,20 @@ True - - ..\..\sln\packages\Microsoft.OData.Core.7.13.0\lib\net45\Microsoft.OData.Core.dll + + ..\..\sln\packages\Microsoft.OData.Core.7.15.0\lib\net45\Microsoft.OData.Core.dll True - - ..\..\sln\packages\Microsoft.OData.Edm.7.13.0\lib\net45\Microsoft.OData.Edm.dll + + ..\..\sln\packages\Microsoft.OData.Edm.7.15.0\lib\net45\Microsoft.OData.Edm.dll True - - ..\..\sln\packages\Microsoft.Spatial.7.13.0\lib\net45\Microsoft.Spatial.dll + + ..\..\sln\packages\Microsoft.Spatial.7.15.0\lib\net45\Microsoft.Spatial.dll True - ..\..\sln\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + ..\..\sln\packages\Newtonsoft.Json.15.0.1\lib\net45\Newtonsoft.Json.dll True diff --git a/samples/AspNetODataSample.Web/packages.config b/samples/AspNetODataSample.Web/packages.config index e5bb9b4020..2dd4c1d031 100644 --- a/samples/AspNetODataSample.Web/packages.config +++ b/samples/AspNetODataSample.Web/packages.config @@ -15,9 +15,9 @@ - - - + + + diff --git a/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs b/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs index 9046973992..57f7fe0da8 100644 --- a/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs +++ b/src/Microsoft.AspNet.OData.Shared/Formatter/Deserialization/ODataResourceSetDeserializer.cs @@ -54,7 +54,8 @@ public override object Read(ODataMessageReader messageReader, Type type, ODataDe throw Error.Argument("edmType", SRResources.ArgumentMustBeOfType, EdmTypeKind.Complex + " or " + EdmTypeKind.Entity); } - ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? messageReader.CreateODataDeltaResourceSetReader() : messageReader.CreateODataResourceSetReader(); + // If we want to support '#$delta' context URL, then we need to pass the EntitySet and StructuredType params to the CreateODataDeltaResourceSetReader method. + ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? messageReader.CreateODataDeltaResourceSetReader(readContext.Path?.NavigationSource as IEdmEntitySetBase, edmType.AsEntity() as IEdmStructuredType) : messageReader.CreateODataResourceSetReader(); object resourceSet = resourceSetReader.ReadResourceOrResourceSet(); return ReadInline(resourceSet, edmType, readContext); } @@ -76,7 +77,8 @@ public override async Task ReadAsync(ODataMessageReader messageReader, T throw Error.Argument("edmType", SRResources.ArgumentMustBeOfType, EdmTypeKind.Complex + " or " + EdmTypeKind.Entity); } - ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? await messageReader.CreateODataDeltaResourceSetReaderAsync() : await messageReader.CreateODataResourceSetReaderAsync(); + // If we want to support '#$delta' context URL, then we need to pass the EntitySet and StructuredType params to the CreateODataDeltaResourceSetReaderAsync method. + ODataReader resourceSetReader = readContext.IsChangedObjectCollection ? await messageReader.CreateODataDeltaResourceSetReaderAsync(readContext.Path?.NavigationSource as IEdmEntitySetBase, edmType.AsEntity() as IEdmStructuredType) : await messageReader.CreateODataResourceSetReaderAsync(); object resourceSet = await resourceSetReader.ReadResourceOrResourceSetAsync(); return ReadInline(resourceSet, edmType, readContext); } diff --git a/src/Microsoft.AspNet.OData/Microsoft.AspNet.OData.csproj b/src/Microsoft.AspNet.OData/Microsoft.AspNet.OData.csproj index f4a0d74f56..86f0f1ae99 100644 --- a/src/Microsoft.AspNet.OData/Microsoft.AspNet.OData.csproj +++ b/src/Microsoft.AspNet.OData/Microsoft.AspNet.OData.csproj @@ -33,16 +33,16 @@ ..\..\sln\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.0.0\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll True - - ..\..\sln\packages\Microsoft.OData.Core.7.13.0\lib\net45\Microsoft.OData.Core.dll + + ..\..\sln\packages\Microsoft.OData.Core.7.15.0\lib\net45\Microsoft.OData.Core.dll True - - ..\..\sln\packages\Microsoft.OData.Edm.7.13.0\lib\net45\Microsoft.OData.Edm.dll + + ..\..\sln\packages\Microsoft.OData.Edm.7.15.0\lib\net45\Microsoft.OData.Edm.dll True - - ..\..\sln\packages\Microsoft.Spatial.7.13.0\lib\net45\Microsoft.Spatial.dll + + ..\..\sln\packages\Microsoft.Spatial.7.15.0\lib\net45\Microsoft.Spatial.dll True diff --git a/src/Microsoft.AspNet.OData/packages.config b/src/Microsoft.AspNet.OData/packages.config index 196ba8899f..a3f7c6437b 100644 --- a/src/Microsoft.AspNet.OData/packages.config +++ b/src/Microsoft.AspNet.OData/packages.config @@ -6,10 +6,10 @@ - - + + - + \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.OData/Microsoft.AspNetCore.OData.csproj b/src/Microsoft.AspNetCore.OData/Microsoft.AspNetCore.OData.csproj index 02bc647729..5f2a433805 100644 --- a/src/Microsoft.AspNetCore.OData/Microsoft.AspNetCore.OData.csproj +++ b/src/Microsoft.AspNetCore.OData/Microsoft.AspNetCore.OData.csproj @@ -42,9 +42,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/Microsoft.Test.E2E.AspNet.OData.csproj b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/Microsoft.Test.E2E.AspNet.OData.csproj index 2b7416ef0a..37eaf2773b 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/Microsoft.Test.E2E.AspNet.OData.csproj +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/Microsoft.Test.E2E.AspNet.OData.csproj @@ -46,16 +46,16 @@ ..\..\..\..\sln\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.0.0\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll True - - ..\..\..\..\sln\packages\Microsoft.OData.Client.7.13.0\lib\net45\Microsoft.OData.Client.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Client.7.15.0\lib\net45\Microsoft.OData.Client.dll True - - ..\..\..\..\sln\packages\Microsoft.OData.Core.7.13.0\lib\net45\Microsoft.OData.Core.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Core.7.15.0\lib\net45\Microsoft.OData.Core.dll True - - ..\..\..\..\sln\packages\Microsoft.OData.Edm.7.13.0\lib\net45\Microsoft.OData.Edm.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Edm.7.15.0\lib\net45\Microsoft.OData.Edm.dll True @@ -70,8 +70,8 @@ ..\..\..\..\sln\packages\Microsoft.Owin.Hosting.2.0.2\lib\net45\Microsoft.Owin.Hosting.dll True - - ..\..\..\..\sln\packages\Microsoft.Spatial.7.13.0\lib\net45\Microsoft.Spatial.dll + + ..\..\..\..\sln\packages\Microsoft.Spatial.7.15.0\lib\net45\Microsoft.Spatial.dll True diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/packages.config b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/packages.config index 8d3e4de41a..28f488fea7 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/packages.config +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNet/packages.config @@ -13,13 +13,13 @@ - - - + + + - + diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/Microsoft.Test.E2E.AspNetCore.OData.csproj b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/Microsoft.Test.E2E.AspNetCore.OData.csproj index 5a79d73f82..5bedbb79d0 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/Microsoft.Test.E2E.AspNetCore.OData.csproj +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/Microsoft.Test.E2E.AspNetCore.OData.csproj @@ -1858,20 +1858,20 @@ ..\..\..\..\sln\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll - - ..\..\..\..\sln\packages\Microsoft.OData.Client.7.13.0\lib\net45\Microsoft.OData.Client.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Client.7.15.0\lib\net45\Microsoft.OData.Client.dll True - - ..\..\..\..\sln\packages\Microsoft.OData.Core.7.13.0\lib\net45\Microsoft.OData.Core.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Core.7.15.0\lib\net45\Microsoft.OData.Core.dll True - - ..\..\..\..\sln\packages\Microsoft.OData.Edm.7.13.0\lib\net45\Microsoft.OData.Edm.dll + + ..\..\..\..\sln\packages\Microsoft.OData.Edm.7.15.0\lib\net45\Microsoft.OData.Edm.dll True - - ..\..\..\..\sln\packages\Microsoft.Spatial.7.13.0\lib\net45\Microsoft.Spatial.dll + + ..\..\..\..\sln\packages\Microsoft.Spatial.7.15.0\lib\net45\Microsoft.Spatial.dll True diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/packages.config b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/packages.config index 26eba61acf..9db35a96c3 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/packages.config +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore/packages.config @@ -65,10 +65,10 @@ - - - - + + + + diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore3x/Microsoft.Test.E2E.AspNetCore3x.OData.csproj b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore3x/Microsoft.Test.E2E.AspNetCore3x.OData.csproj index 26108477a2..173cfe5836 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore3x/Microsoft.Test.E2E.AspNetCore3x.OData.csproj +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/Build.AspNetCore3x/Microsoft.Test.E2E.AspNetCore3x.OData.csproj @@ -27,7 +27,7 @@ - + diff --git a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/BulkOperation/BulkOperationTest.cs b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/BulkOperation/BulkOperationTest.cs index 1be4f2828e..fc276b4ecc 100644 --- a/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/BulkOperation/BulkOperationTest.cs +++ b/test/E2ETest/Microsoft.Test.E2E.AspNet.OData/BulkOperation/BulkOperationTest.cs @@ -164,6 +164,94 @@ public async Task PatchEmployee_WithUpdates_Friends() } } + [Fact] + public async Task PatchEmployee_WithUpdates_Friends_WithRelativeContextURL() + { + //Arrange + string requestUri = this.BaseAddress + "/convention/Employees(1)/Friends"; + + var content = @"{ + '@odata.context':'Employees(1)/Friends/$delta', + 'value':[{ 'Id':1,'Name':'Friend1'}, { 'Id':2,'Name':'Friend2'}] + }"; + + var requestForPatch = new HttpRequestMessage(new HttpMethod("PATCH"), requestUri); + requestForPatch.Headers.Add("OData-Version", "4.01"); + + StringContent stringContent = new StringContent(content: content, encoding: Encoding.UTF8, mediaType: "application/json"); + requestForPatch.Content = stringContent; + Client.DefaultRequestHeaders.Add("Prefer", @"odata.include-annotations=""*"""); + + //Act & Assert + var expected = "$delta\",\"value\":[{\"Id\":1,\"Name\":\"Friend1\",\"Age\":0}," + + "{\"Id\":2,\"Name\":\"Friend2\",\"Age\":0}]}"; + + using (HttpResponseMessage response = await this.Client.SendAsync(requestForPatch)) + { + var json = response.Content.ReadAsStringAsync().Result; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains(expected, json.ToString()); + } + + //Act & Assert + requestUri = this.BaseAddress + "/convention/Employees(1)/Friends"; + using (HttpResponseMessage response = await this.Client.GetAsync(requestUri)) + { + response.EnsureSuccessStatusCode(); + + var json = await response.Content.ReadAsObject(); + var result = json.GetValue("value") as JArray; + + Assert.Equal(2, result.Count); + Assert.Contains("Friend1", result.ToString()); + Assert.Contains("Friend2", result.ToString()); + } + } + + [Fact] + public async Task PatchEmployee_WithUpdates_Friends_WithOnlyDeltaContextURL() + { + //Arrange + string requestUri = this.BaseAddress + "/convention/Employees(1)/Friends"; + + var content = @"{ + '@odata.context':'#$delta', + 'value':[{ 'Id':1,'Name':'Friend1'}, { 'Id':2,'Name':'Friend2'}] + }"; + + var requestForPatch = new HttpRequestMessage(new HttpMethod("PATCH"), requestUri); + requestForPatch.Headers.Add("OData-Version", "4.01"); + + StringContent stringContent = new StringContent(content: content, encoding: Encoding.UTF8, mediaType: "application/json"); + requestForPatch.Content = stringContent; + Client.DefaultRequestHeaders.Add("Prefer", @"odata.include-annotations=""*"""); + + //Act & Assert + var expected = "$delta\",\"value\":[{\"Id\":1,\"Name\":\"Friend1\",\"Age\":0}," + + "{\"Id\":2,\"Name\":\"Friend2\",\"Age\":0}]}"; + + using (HttpResponseMessage response = await this.Client.SendAsync(requestForPatch)) + { + var json = response.Content.ReadAsStringAsync().Result; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Contains(expected, json.ToString()); + } + + //Act & Assert + requestUri = this.BaseAddress + "/convention/Employees(1)/Friends"; + using (HttpResponseMessage response = await this.Client.GetAsync(requestUri)) + { + response.EnsureSuccessStatusCode(); + + var json = await response.Content.ReadAsObject(); + var result = json.GetValue("value") as JArray; + + Assert.Equal(2, result.Count); + Assert.Contains("Friend1", result.ToString()); + Assert.Contains("Friend2", result.ToString()); + } + } + [Fact] public async Task PatchEmployee_WithDeletes_Friends() { diff --git a/test/UnitTest/Microsoft.AspNet.OData.Test.Shared/Query/Expressions/FilterBinderTests.cs b/test/UnitTest/Microsoft.AspNet.OData.Test.Shared/Query/Expressions/FilterBinderTests.cs index 46480f700e..bd85e9ee75 100644 --- a/test/UnitTest/Microsoft.AspNet.OData.Test.Shared/Query/Expressions/FilterBinderTests.cs +++ b/test/UnitTest/Microsoft.AspNet.OData.Test.Shared/Query/Expressions/FilterBinderTests.cs @@ -2363,10 +2363,10 @@ public void Isof_WithNullTypeName_ThrowsArgumentNullException(string filter) // Arrange & Act & Assert #if NETCOREAPP3_1 ExceptionAssert.Throws(() => Bind(filter), - "Value cannot be null. (Parameter 'qualifiedName')"); + "Value cannot be null. (Parameter 'typeName')"); #else ExceptionAssert.Throws(() => Bind(filter), - "Value cannot be null.\r\nParameter name: qualifiedName"); + "Value cannot be null.\r\nParameter name: typeName"); #endif } diff --git a/test/UnitTest/Microsoft.AspNet.OData.Test/Microsoft.AspNet.OData.Test.csproj b/test/UnitTest/Microsoft.AspNet.OData.Test/Microsoft.AspNet.OData.Test.csproj index 0b7dec5954..5d56740757 100644 --- a/test/UnitTest/Microsoft.AspNet.OData.Test/Microsoft.AspNet.OData.Test.csproj +++ b/test/UnitTest/Microsoft.AspNet.OData.Test/Microsoft.AspNet.OData.Test.csproj @@ -24,16 +24,16 @@ True - - ..\..\..\sln\packages\Microsoft.OData.Core.7.13.0\lib\net45\Microsoft.OData.Core.dll + + ..\..\..\sln\packages\Microsoft.OData.Core.7.15.0\lib\net45\Microsoft.OData.Core.dll True - - ..\..\..\sln\packages\Microsoft.OData.Edm.7.13.0\lib\net45\Microsoft.OData.Edm.dll + + ..\..\..\sln\packages\Microsoft.OData.Edm.7.15.0\lib\net45\Microsoft.OData.Edm.dll True - - ..\..\..\sln\packages\Microsoft.Spatial.7.13.0\lib\net45\Microsoft.Spatial.dll + + ..\..\..\sln\packages\Microsoft.Spatial.7.15.0\lib\net45\Microsoft.Spatial.dll True diff --git a/test/UnitTest/Microsoft.AspNet.OData.Test/packages.config b/test/UnitTest/Microsoft.AspNet.OData.Test/packages.config index e8f3a06814..bd71076ad7 100644 --- a/test/UnitTest/Microsoft.AspNet.OData.Test/packages.config +++ b/test/UnitTest/Microsoft.AspNet.OData.Test/packages.config @@ -8,9 +8,9 @@ - - - + + + diff --git a/test/UnitTest/Microsoft.AspNetCore.OData.Test/Microsoft.AspNetCore.OData.Test.csproj b/test/UnitTest/Microsoft.AspNetCore.OData.Test/Microsoft.AspNetCore.OData.Test.csproj index 41e014625b..b5fa8f2f92 100644 --- a/test/UnitTest/Microsoft.AspNetCore.OData.Test/Microsoft.AspNetCore.OData.Test.csproj +++ b/test/UnitTest/Microsoft.AspNetCore.OData.Test/Microsoft.AspNetCore.OData.Test.csproj @@ -16,9 +16,9 @@ - - - + + + @@ -33,9 +33,9 @@ - - - + + +