From f338f70e06a7450a53e8951d9385ac44fd1e668c Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Wed, 10 Dec 2014 15:52:22 -0800 Subject: [PATCH] Update WebAPI shim functional tests to use a header for payload The issue is that responses to HEAD cannot have a body. When running these tests on a real server, they break because the server throws when you try to write to the body. --- .../WebApiCompatShimActionSelectionTest.cs | 120 +++++++++--------- .../ActionSelectionFilter.cs | 18 ++- 2 files changed, 73 insertions(+), 65 deletions(-) diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/WebApiCompatShimActionSelectionTest.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/WebApiCompatShimActionSelectionTest.cs index 217f33aa06..4731677348 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/WebApiCompatShimActionSelectionTest.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/WebApiCompatShimActionSelectionTest.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests { public class WebApiCompatShimActionSelectionTest { - private readonly IServiceProvider _services = TestHelper.CreateServices(nameof(WebApiCompatShimWebSite)); + private readonly IServiceProvider _provider = TestHelper.CreateServices(nameof(WebApiCompatShimWebSite)); private readonly Action _app = new WebApiCompatShimWebSite.Startup().Configure; [Theory] @@ -28,7 +28,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_UnnamedAction(string httpMethod, string actionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -37,9 +37,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_NamedAction(string httpMethod, string actionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -66,9 +66,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_NamedAction_MismatchedVerb() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_UnnamedAction_DefaultVerbIsPost_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -106,9 +106,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_NamedAction_DefaultVerbIsPost_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -128,9 +128,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -141,7 +141,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_UnnamedAction_DefaultVerbIsPost_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromPrefix_NamedAction_DefaultVerbIsPost_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -177,7 +177,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromMethodName_NotActionName_UnnamedAction_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -186,9 +186,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -199,7 +199,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromMethodName_NotActionName_NamedAction_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -208,9 +208,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -221,7 +221,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromMethodName_NotActionName_UnnamedAction_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -239,7 +239,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_TakesHttpMethodFromMethodName_NotActionName_NamedAction_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -257,7 +257,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_HttpMethodOverride_UnnamedAction_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -266,9 +266,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -279,7 +279,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_HttpMethodOverride_NamedAction_Success() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -288,9 +288,9 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -301,7 +301,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_HttpMethodOverride_UnnamedAction_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -319,7 +319,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task WebAPIConvention_HttpMethodOverride_NamedAction_VerbMismatch() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage( @@ -368,16 +368,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_OverloadedAction_WithUnnamedAction(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -395,16 +395,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_OverloadedAction_NonIdRouteParameter(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -419,16 +419,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_OverloadedAction_Parameter_Casing(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -446,16 +446,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_RouteWithActionName(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -473,16 +473,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_RouteWithActionName_Casing(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -498,16 +498,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_RouteWithoutActionName(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -526,16 +526,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_ModelBindingParameterAttribute_AreAppliedWhenSelectingActions(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -550,16 +550,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_ActionsThatHaveSubsetOfRouteParameters_AreConsideredForSelection(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); @@ -572,7 +572,7 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_RequestToAmbiguousAction_OnDefaultRoute() { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod("POST"), "http://localhost/api/Admin/Test?name=mario"); @@ -589,16 +589,16 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests public async Task LegacyActionSelection_SelectAction_ReturnsActionDescriptor_ForEnumParameterOverloads(string httpMethod, string requestUrl, string expectedActionName) { // Arrange - var server = TestServer.Create(_services, _app); + var server = TestServer.Create(_provider, _app); var client = server.CreateClient(); var request = new HttpRequestMessage(new HttpMethod(httpMethod), "http://localhost/" + requestUrl); // Act var response = await client.SendAsync(request); - var body = await response.Content.ReadAsStringAsync(); - var result = JsonConvert.DeserializeObject(body); + var data = Assert.Single(response.Headers.GetValues("ActionSelection")); + var result = JsonConvert.DeserializeObject(data); //Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); diff --git a/test/WebSites/WebApiCompatShimWebSite/ActionSelectionFilter.cs b/test/WebSites/WebApiCompatShimWebSite/ActionSelectionFilter.cs index 875794108b..484980760c 100644 --- a/test/WebSites/WebApiCompatShimWebSite/ActionSelectionFilter.cs +++ b/test/WebSites/WebApiCompatShimWebSite/ActionSelectionFilter.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Mvc; +using Newtonsoft.Json; namespace WebApiCompatShimWebSite { @@ -10,11 +11,18 @@ namespace WebApiCompatShimWebSite public override void OnActionExecuted(ActionExecutedContext context) { var action = (ControllerActionDescriptor)context.ActionDescriptor; - context.Result = new JsonResult(new - { - ActionName = action.Name, - ControllerName = action.ControllerName - }); + context.HttpContext.Response.Headers.Add( + "ActionSelection", + new string[] + { + JsonConvert.SerializeObject(new + { + ActionName = action.Name, + ControllerName = action.ControllerName + }) + }); + + context.Result = new HttpStatusCodeResult(200); } } } \ No newline at end of file