From 1f978d98d0c0c8f744401ce91323ad5d12a1adc0 Mon Sep 17 00:00:00 2001 From: Kennedy Kang'ethe Date: Fri, 5 May 2023 10:35:06 +0300 Subject: [PATCH] Make CreatedODataResult inherit from ObjectResult (#906) --- .../Results/CreatedODataResult.cs | 3 +- .../AutoExpand/AutoExpandController.cs | 6 ++++ .../AutoExpand/AutoExpandTests.cs | 31 +++++++++++++++++++ ...rosoft.AspNetCore.OData.PublicApi.Net6.bsl | 2 +- ...t.AspNetCore.OData.PublicApi.NetCore31.bsl | 2 +- 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.OData/Results/CreatedODataResult.cs b/src/Microsoft.AspNetCore.OData/Results/CreatedODataResult.cs index 6566f1d40..0bcbe4f59 100644 --- a/src/Microsoft.AspNetCore.OData/Results/CreatedODataResult.cs +++ b/src/Microsoft.AspNetCore.OData/Results/CreatedODataResult.cs @@ -22,13 +22,14 @@ namespace Microsoft.AspNetCore.OData.Results /// This action result handles content negotiation and the HTTP prefer header. It generates a location /// header containing the edit link of the created entity and, if response has status code: NoContent, also /// generates an OData-EntityId header. - public class CreatedODataResult : ActionResult + public class CreatedODataResult : ObjectResult { /// /// Initializes a new instance of the class. /// /// The created entity. public CreatedODataResult(T entity) + : base(entity) { Entity = entity ?? throw Error.ArgumentNull(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 fe7da29dc..ba701d0fc 100644 --- a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs +++ b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandController.cs @@ -45,6 +45,12 @@ public IActionResult GetHomeAddress(int key) return Ok(c.HomeAddress); } + + [EnableQuery] + public IActionResult Post([FromBody] Customer customer) + { + return Created(customer); + } } 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 32d22c832..9ca5c5dd5 100644 --- a/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs +++ b/test/Microsoft.AspNetCore.OData.E2E.Tests/AutoExpand/AutoExpandTests.cs @@ -9,6 +9,7 @@ using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.OData.E2E.Tests.Extensions; using Microsoft.AspNetCore.OData.TestCommon; @@ -422,5 +423,35 @@ public async Task NonDefaultMaxExpansionDepthAppliesToAutoExpand(string entitySe "}", content); } + + [Fact] + public async Task PostCustomer_AutoExpandNavigationProperties() + { + //Arrange + string requestUri = "autoexpand/Customers"; + + var content = @"{ + 'Id':88, + 'Order':{ 'Id':1, 'Choice' : {'Id': 101, 'Amount': 10}}, + 'Friend':{'Id': 99, 'HomeAddress': {'Street': 'Street 1', 'City': 'City 1'}} + }"; + + HttpClient client = CreateClient(); + + StringContent stringContent = new StringContent(content: content, encoding: Encoding.UTF8, mediaType: "application/json"); + + var expectedOrder = "Order\":{\"Id\":1,\"Choice\":{\"Id\":101,\"Amount\":10.0}}"; + var expectedFriend = "Friend\":{\"Id\":99,\"HomeAddress\":{\"Street\":\"Street 1\",\"City\":\"City 1\",\"CountryOrRegion\":null},\"Order\":null,\"Friend\":null}"; + + //Act & Assert + using (HttpRequestMessage requestForPost = new HttpRequestMessage(HttpMethod.Post, requestUri) { Content = stringContent }) + using (HttpResponseMessage response = await client.SendAsync(requestForPost)) + { + Assert.Equal(HttpStatusCode.Created, 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 97b8eec37..705e5e129 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 @@ -1648,7 +1648,7 @@ public class Microsoft.AspNetCore.OData.Results.ConflictODataResult : Microsoft. public virtual System.Threading.Tasks.Task ExecuteResultAsync (Microsoft.AspNetCore.Mvc.ActionContext context) } -public class Microsoft.AspNetCore.OData.Results.CreatedODataResult`1 : Microsoft.AspNetCore.Mvc.ActionResult, IActionResult { +public class Microsoft.AspNetCore.OData.Results.CreatedODataResult`1 : Microsoft.AspNetCore.Mvc.ObjectResult, IActionResult, IStatusCodeActionResult { public CreatedODataResult`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 97b8eec37..705e5e129 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 @@ -1648,7 +1648,7 @@ public class Microsoft.AspNetCore.OData.Results.ConflictODataResult : Microsoft. public virtual System.Threading.Tasks.Task ExecuteResultAsync (Microsoft.AspNetCore.Mvc.ActionContext context) } -public class Microsoft.AspNetCore.OData.Results.CreatedODataResult`1 : Microsoft.AspNetCore.Mvc.ActionResult, IActionResult { +public class Microsoft.AspNetCore.OData.Results.CreatedODataResult`1 : Microsoft.AspNetCore.Mvc.ObjectResult, IActionResult, IStatusCodeActionResult { public CreatedODataResult`1 (T entity) T Entity { public virtual get; }