From e8f1e241521039855e4de1b921e3bd8f4a453724 Mon Sep 17 00:00:00 2001 From: John Gathogo Date: Wed, 5 Jul 2023 17:02:17 +0300 Subject: [PATCH] Make UpdateODataResult inherit from ObjectResult (#981) --- .../Results/UpdatedODataResult.cs | 3 +- .../AutoExpand/AutoExpandController.cs | 13 +++++++ .../AutoExpand/AutoExpandTests.cs | 35 +++++++++++++++++++ ...rosoft.AspNetCore.OData.PublicApi.Net6.bsl | 2 +- ...t.AspNetCore.OData.PublicApi.NetCore31.bsl | 2 +- 5 files changed, 52 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.OData/Results/UpdatedODataResult.cs b/src/Microsoft.AspNetCore.OData/Results/UpdatedODataResult.cs index b99799895..d5eea0d0d 100644 --- a/src/Microsoft.AspNetCore.OData/Results/UpdatedODataResult.cs +++ b/src/Microsoft.AspNetCore.OData/Results/UpdatedODataResult.cs @@ -20,13 +20,14 @@ namespace Microsoft.AspNetCore.OData.Results /// /// The entity type. /// This action result handles content negotiation and the HTTP prefer header. - public class UpdatedODataResult : ActionResult + public class UpdatedODataResult : ObjectResult { /// /// Initializes a new instance of the class. /// /// The updated entity. public UpdatedODataResult(T entity) + : base(entity) { Entity = entity ?? throw new ArgumentNullException(nameof(entity)); } diff --git a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs index ba701d0fc..f64588633 100644 --- a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs +++ b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs @@ -51,6 +51,19 @@ public IActionResult Post([FromBody] Customer customer) { return Created(customer); } + + [EnableQuery] + public IActionResult Put(int key, [FromBody] Customer customer) + { + var existingCustomer = AutoExpandDataSource.Customers.FirstOrDefault(d => d.Id == key); + + if (existingCustomer == null) + { + return BadRequest(); + } + + return Updated(existingCustomer); + } } public class PeopleController : ODataController diff --git a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs index 9ca5c5dd5..691c8df5a 100644 --- a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs +++ b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs @@ -453,5 +453,40 @@ public async Task PostCustomer_AutoExpandNavigationProperties() Assert.Contains(expectedOrder, json); } } + + [Fact] + public async Task PutCustomer_AutoExpandNavigationProperties() + { + //Arrange + var requestUri = "autoexpand/Customers(2)"; + var content = "{\"Id\":2}"; + var client = CreateClient(); + var stringContent = new StringContent(content: content, encoding: Encoding.UTF8, mediaType: "application/json"); + + var expectedOrder = "\"Order\":{\"Id\":2,\"Choice\":{\"Id\":2,\"Amount\":2000.0}}"; + var expectedFriend = "\"Friend\":{" + + "\"Id\":1," + + "\"HomeAddress\":{" + + "\"@odata.type\":\"#Microsoft.AspNetCore.OData.E2E.Tests.AutoExpand.UsAddress\"," + + "\"Street\":\"UsStreet 1\"," + + "\"City\":\"UsCity 1\"," + + "\"CountryOrRegion\":{\"Id\":101,\"Name\":\"C and R 101\"}," + + "\"ZipCode\":{\"Id\":2001,\"Code\":\"Code 1\"}}," + + "\"Order\":{\"Id\":1}," + + "\"Friend\":null}}"; + + //Act & Assert + using (var request = new HttpRequestMessage(HttpMethod.Put, requestUri) { Content = stringContent }) + { + request.Headers.Add("Prefer", "return=representation"); + using (var response = await client.SendAsync(request)) + { + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + var json = response.Content.ReadAsStringAsync().Result; + Assert.Contains(expectedFriend, json); + Assert.Contains(expectedOrder, json); + } + } + } } } diff --git a/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.Net6.bsl b/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.Net6.bsl index a89294453..f5c40287a 100644 --- a/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.Net6.bsl +++ b/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.Net6.bsl @@ -1726,7 +1726,7 @@ public class Microsoft.AspNetCore.OData.Results.UnprocessableEntityODataResult : public virtual System.Threading.Tasks.Task ExecuteResultAsync (Microsoft.AspNetCore.Mvc.ActionContext context) } -public class Microsoft.AspNetCore.OData.Results.UpdatedODataResult`1 : Microsoft.AspNetCore.Mvc.ActionResult, IActionResult { +public class Microsoft.AspNetCore.OData.Results.UpdatedODataResult`1 : Microsoft.AspNetCore.Mvc.ObjectResult, IActionResult, IStatusCodeActionResult { public UpdatedODataResult`1 (T entity) T Entity { public virtual get; } diff --git a/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.NetCore31.bsl b/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.NetCore31.bsl index a89294453..f5c40287a 100644 --- a/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.NetCore31.bsl +++ b/test/Microsoft.AspNetCore.OData.Tests/PublicApi/Microsoft.AspNetCore.OData.PublicApi.NetCore31.bsl @@ -1726,7 +1726,7 @@ public class Microsoft.AspNetCore.OData.Results.UnprocessableEntityODataResult : public virtual System.Threading.Tasks.Task ExecuteResultAsync (Microsoft.AspNetCore.Mvc.ActionContext context) } -public class Microsoft.AspNetCore.OData.Results.UpdatedODataResult`1 : Microsoft.AspNetCore.Mvc.ActionResult, IActionResult { +public class Microsoft.AspNetCore.OData.Results.UpdatedODataResult`1 : Microsoft.AspNetCore.Mvc.ObjectResult, IActionResult, IStatusCodeActionResult { public UpdatedODataResult`1 (T entity) T Entity { public virtual get; }