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