1 // Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. 2 3 using System.Net; 4 using System.Net.Http; 5 using System.Web.Http.Controllers; 6 using Xunit.Extensions; 7 using Assert = Microsoft.TestCommon.AssertEx; 8 9 namespace System.Web.Http 10 { 11 [CLSCompliant(false)] 12 public class ActionAttributesTest 13 { 14 [Theory] 15 [InlineData("GET", "ActionAttributeTest/RetriveUsers", "RetriveUsers")] 16 [InlineData("POST", "ActionAttributeTest/AddUsers", "AddUsers")] 17 [InlineData("PUT", "ActionAttributeTest/UpdateUsers", "UpdateUsers")] 18 [InlineData("DELETE", "ActionAttributeTest/DeleteUsers", "DeleteUsers")] 19 [InlineData("PATCH", "ActionAttributeTest/Users", "Users")] 20 [InlineData("HEAD", "ActionAttributeTest/Users", "Users")] SelectAction_OnRouteWithActionParameter(string httpMethod, string requestUrl, string expectedActionName)21 public void SelectAction_OnRouteWithActionParameter(string httpMethod, string requestUrl, string expectedActionName) 22 { 23 string routeUrl = "{controller}/{action}/{id}"; 24 object routeDefault = new { id = RouteParameter.Optional }; 25 26 HttpControllerContext controllerContext = ApiControllerHelper.CreateControllerContext(httpMethod, requestUrl, routeUrl, routeDefault); 27 controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ActionAttributeTestController)); 28 HttpActionDescriptor descriptor = ApiControllerHelper.SelectAction(controllerContext); 29 30 Assert.Equal<string>(expectedActionName, descriptor.ActionName); 31 } 32 33 [Theory] 34 [InlineData("POST", "ActionAttributeTest/RetriveUsers")] 35 [InlineData("DELETE", "ActionAttributeTest/RetriveUsers")] 36 [InlineData("WHATEVER", "ActionAttributeTest/RetriveUsers")] 37 [InlineData("GET", "ActionAttributeTest/AddUsers")] 38 [InlineData("PUT", "ActionAttributeTest/AddUsers")] 39 [InlineData("WHATEVER", "ActionAttributeTest/AddUsers")] 40 [InlineData("GET", "ActionAttributeTest/UpdateUsers")] 41 [InlineData("WHATEVER", "ActionAttributeTest/UpdateUsers")] 42 [InlineData("POST", "ActionAttributeTest/DeleteUsers")] 43 [InlineData("DELETEME", "ActionAttributeTest/DeleteUsers")] 44 [InlineData("GET", "ActionAttributeTest/Users")] 45 [InlineData("POST", "ActionAttributeTest/Users")] 46 [InlineData("PATCHING", "ActionAttributeTest/Users")] 47 [InlineData("NonAction", "ActionAttributeTest/NonAction")] 48 [InlineData("GET", "ActionAttributeTest/NonAction")] SelectAction_ThrowsMethodNotSupported_OnRouteWithActionParameter(string httpMethod, string requestUrl)49 public void SelectAction_ThrowsMethodNotSupported_OnRouteWithActionParameter(string httpMethod, string requestUrl) 50 { 51 string routeUrl = "{controller}/{action}/{id}"; 52 object routeDefault = new { id = RouteParameter.Optional }; 53 HttpControllerContext controllerContext = ApiControllerHelper.CreateControllerContext(httpMethod, requestUrl, routeUrl, routeDefault); 54 Type controllerType = typeof(ActionAttributeTestController); 55 controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, controllerType.Name, controllerType); 56 57 var exception = Assert.Throws<HttpResponseException>(() => 58 { 59 HttpActionDescriptor descriptor = ApiControllerHelper.SelectAction(controllerContext); 60 }); 61 62 Assert.Equal(HttpStatusCode.MethodNotAllowed, exception.Response.StatusCode); 63 var content = Assert.IsType<ObjectContent<string>>(exception.Response.Content); 64 Assert.Equal("The requested resource does not support http method '" + httpMethod + "'.", content.Value); 65 } 66 67 [Theory] 68 [InlineData("POST", "ActionAttributeTest/NonAction")] 69 [InlineData("ACTION", "ActionAttributeTest/NonActionWitHttpMethod")] SelectAction_ThrowsNotFound_OnRouteWithActionParameter(string httpMethod, string requestUrl)70 public void SelectAction_ThrowsNotFound_OnRouteWithActionParameter(string httpMethod, string requestUrl) 71 { 72 string routeUrl = "{controller}/{action}/{id}"; 73 object routeDefault = new { id = RouteParameter.Optional }; 74 HttpControllerContext controllerContext = ApiControllerHelper.CreateControllerContext(httpMethod, requestUrl, routeUrl, routeDefault); 75 Type controllerType = typeof(ActionAttributeTestController); 76 controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, controllerType.Name, controllerType); 77 78 var exception = Assert.Throws<HttpResponseException>(() => 79 { 80 HttpActionDescriptor descriptor = ApiControllerHelper.SelectAction(controllerContext); 81 }); 82 83 Assert.Equal(HttpStatusCode.NotFound, exception.Response.StatusCode); 84 var content = Assert.IsType<ObjectContent<string>>(exception.Response.Content); 85 Assert.Equal("No action was found on the controller 'ActionAttributeTestController' that matches the request.", content.Value); 86 } 87 88 [Theory] 89 [InlineData("GET", "ActionAttributeTest/", "RetriveUsers")] 90 [InlineData("GET", "ActionAttributeTest/3", "RetriveUsers")] 91 [InlineData("GET", "ActionAttributeTest/4?ssn=12345", "RetriveUsers")] 92 [InlineData("POST", "ActionAttributeTest/1", "AddUsers")] 93 [InlineData("PUT", "ActionAttributeTest", "UpdateUsers")] 94 [InlineData("PUT", "ActionAttributeTest/4", "UpdateUsers")] 95 [InlineData("PUT", "ActionAttributeTest/4?extra=thing", "UpdateUsers")] 96 [InlineData("DELETE", "ActionAttributeTest", "DeleteUsers")] 97 [InlineData("PATCH", "ActionAttributeTest", "PatchUsers")] 98 [InlineData("HEAD", "ActionAttributeTest/", "Head")] 99 [InlineData("PATCH", "ActionAttributeTest?key=2", "Users")] 100 [InlineData("HEAD", "ActionAttributeTest?key=2", "Users")] 101 [InlineData("OPTIONS", "ActionAttributeTest", "Options")] 102 [InlineData("PATCH", "ActionAttributeTest/2", "Update")] 103 [InlineData("HEAD", "ActionAttributeTest/2", "Ping")] 104 [InlineData("OPTIONS", "ActionAttributeTest/2", "Help")] SelectAction_OnDefaultRoute(string httpMethod, string requestUrl, string expectedActionName)105 public void SelectAction_OnDefaultRoute(string httpMethod, string requestUrl, string expectedActionName) 106 { 107 string routeUrl = "{controller}/{id}"; 108 object routeDefault = new { id = RouteParameter.Optional }; 109 110 HttpControllerContext controllerContext = ApiControllerHelper.CreateControllerContext(httpMethod, requestUrl, routeUrl, routeDefault); 111 controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "test", typeof(ActionAttributeTestController)); 112 HttpActionDescriptor descriptor = ApiControllerHelper.SelectAction(controllerContext); 113 114 Assert.Equal<string>(expectedActionName, descriptor.ActionName); 115 } 116 117 [Theory] 118 [InlineData("CONNECT", "ActionAttributeTest")] 119 [InlineData("TRACE", "ActionAttributeTest")] 120 [InlineData("NonAction", "ActionAttributeTest/")] 121 [InlineData("DENY", "ActionAttributeTest")] 122 [InlineData("APP", "ActionAttributeTest")] SelectAction_ThrowsMethodNotSupported_OnDefaultRoute(string httpMethod, string requestUrl)123 public void SelectAction_ThrowsMethodNotSupported_OnDefaultRoute(string httpMethod, string requestUrl) 124 { 125 string routeUrl = "{controller}/{id}"; 126 object routeDefault = new { id = RouteParameter.Optional }; 127 HttpControllerContext controllerContext = ApiControllerHelper.CreateControllerContext(httpMethod, requestUrl, routeUrl, routeDefault); 128 Type controllerType = typeof(ActionAttributeTestController); 129 controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, controllerType.Name, controllerType); 130 131 var exception = Assert.Throws<HttpResponseException>(() => 132 { 133 HttpActionDescriptor descriptor = ApiControllerHelper.SelectAction(controllerContext); 134 }); 135 136 Assert.Equal(HttpStatusCode.MethodNotAllowed, exception.Response.StatusCode); 137 var content = Assert.IsType<ObjectContent<string>>(exception.Response.Content); 138 Assert.Equal("The requested resource does not support http method '" + httpMethod + "'.", content.Value); 139 } 140 } 141 } 142