public void NonAliasedMethodsProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); // Act AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Assert Assert.AreEqual(5, selector.NonAliasedMethods.Count); List <MethodInfo> sortedMethods = selector.NonAliasedMethods["foo"].OrderBy(methodInfo => methodInfo.GetParameters().Length).ToList(); Assert.AreEqual("Foo", sortedMethods[0].Name); Assert.AreEqual(0, sortedMethods[0].GetParameters().Length); Assert.AreEqual("Foo", sortedMethods[1].Name); Assert.AreEqual(typeof(string), sortedMethods[1].GetParameters()[0].ParameterType); Assert.AreEqual(1, selector.NonAliasedMethods["AsyncResultPattern"].Count()); Assert.AreEqual("BeginAsyncResultPattern", selector.NonAliasedMethods["AsyncResultPattern"].First().Name); Assert.AreEqual(1, selector.NonAliasedMethods["AsyncResultPatternEndNotFound"].Count()); Assert.AreEqual("BeginAsyncResultPatternEndNotFound", selector.NonAliasedMethods["AsyncResultPatternEndNotFound"].First().Name); Assert.AreEqual(1, selector.NonAliasedMethods["DelegatePattern"].Count()); Assert.AreEqual(1, selector.NonAliasedMethods["EventPattern"].Count()); Assert.AreEqual("EventPattern", selector.NonAliasedMethods["EventPattern"].First().Name); }
public void NonAliasedMethodsProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); // Act AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Assert Assert.Equal(6, selector.NonAliasedMethods.Count); List <MethodInfo> sortedMethods = selector.NonAliasedMethods["foo"].OrderBy(methodInfo => methodInfo.GetParameters().Length).ToList(); Assert.Equal("Foo", sortedMethods[0].Name); Assert.Empty(sortedMethods[0].GetParameters()); Assert.Equal("Foo", sortedMethods[1].Name); Assert.Equal(typeof(string), sortedMethods[1].GetParameters()[0].ParameterType); Assert.Equal(1, selector.NonAliasedMethods["EventPattern"].Count()); Assert.Equal("EventPatternAsync", selector.NonAliasedMethods["EventPattern"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["EventPatternAmbiguous"].Count()); Assert.Equal("EventPatternAmbiguousAsync", selector.NonAliasedMethods["EventPatternAmbiguous"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["EventPatternWithoutCompletionMethod"].Count()); Assert.Equal("EventPatternWithoutCompletionMethodAsync", selector.NonAliasedMethods["EventPatternWithoutCompletionMethod"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["TaskPattern"].Count()); Assert.Equal("TaskPattern", selector.NonAliasedMethods["TaskPattern"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["GenericTaskPattern"].Count()); Assert.Equal("GenericTaskPattern", selector.NonAliasedMethods["GenericTaskPattern"].First().Name); }
public void FindAction_ReturnsMatchingMethodIfOneMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction( new ControllerContext(), "OneMatch" ); ActionDescriptor actionDescriptor = creator( "someName", new Mock <ControllerDescriptor>().Object ); // Assert var castActionDescriptor = Assert.IsType <ReflectedActionDescriptor>(actionDescriptor); Assert.Equal("OneMatch", castActionDescriptor.MethodInfo.Name); Assert.Equal( typeof(string), castActionDescriptor.MethodInfo.GetParameters()[0].ParameterType ); }
public void ControllerTypeProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & Assert Assert.AreSame(controllerType, selector.ControllerType); }
private static ActionDescriptor CreateActionDescriptor(ControllerDescriptor controller, AsyncActionMethodSelector actionSelector, MethodInfo method) { string actionName = actionSelector.GetActionName(method); ActionDescriptorCreator creator = actionSelector.GetActionDescriptorDelegate(method); Debug.Assert(creator != null); return creator(actionName, controller); }
public void ControllerTypeProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & Assert Assert.Same(controllerType, selector.ControllerType); }
internal List <RouteEntry> MapMvcAttributeRoutes(ReflectedAsyncControllerDescriptor controllerDescriptor) { RoutePrefixAttribute prefixAttribute = GetPrefixFrom(controllerDescriptor); ValidatePrefixTemplate(prefixAttribute, controllerDescriptor); RouteAreaAttribute area = GetAreaFrom(controllerDescriptor); string areaName = GetAreaName(controllerDescriptor, area); string areaPrefix = area != null ? area.AreaPrefix ?? area.AreaName : null; ValidateAreaPrefixTemplate(areaPrefix, areaName, controllerDescriptor); string controllerName = controllerDescriptor.ControllerName; AsyncActionMethodSelector actionSelector = controllerDescriptor.Selector; IEnumerable <MethodInfo> actionMethodsInfo = actionSelector.AliasedMethods .Concat(actionSelector.NonAliasedMethods.SelectMany(x => x)) .Where(m => m.DeclaringType == controllerDescriptor.ControllerType); if (actionSelector.AllowLegacyAsyncActions) { // if the ActionAsync / ActionCompleted pattern is used, we need to remove the "Completed" methods // and not look up routing attributes on them actionMethodsInfo = actionMethodsInfo.Where(m => !m.Name.EndsWith("Completed", StringComparison.OrdinalIgnoreCase)); } List <RouteEntry> routeEntries = new List <RouteEntry>(); foreach (var method in actionMethodsInfo) { string actionName = GetCanonicalActionName(method, actionSelector.AllowLegacyAsyncActions); IEnumerable <IDirectRouteInfoProvider> routeAttributes = GetRouteAttributes(method); foreach (var routeAttribute in routeAttributes) { ValidateTemplate(routeAttribute, actionName, controllerDescriptor); string prefix = prefixAttribute != null ? prefixAttribute.Prefix : null; string template = CombinePrefixAndAreaWithTemplate(areaPrefix, prefix, routeAttribute.RouteTemplate); Route route = _routeBuilder.BuildDirectRoute(template, routeAttribute.Verbs, controllerName, actionName, method, areaName); RouteEntry entry = new RouteEntry { Name = routeAttribute.RouteName ?? template, Route = route, RouteTemplate = template, ParsedRoute = RouteParser.Parse(route.Url), Order = routeAttribute.RouteOrder }; routeEntries.Add(entry); } } return(routeEntries); }
public void FindAction_NullContext_Throws() { // Arrange Type controllerType = typeof(WithRoutingAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & Assert Assert.Throws <ArgumentNullException>(() => selector.FindAction(null, "Action")); }
public void FindActionMethod_Asynchronous_ThrowsIfCompletionMethodNotFound() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert Assert.Throws <InvalidOperationException>( delegate { ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "EventPatternWithoutCompletionMethod"); }, @"Could not locate a method named 'EventPatternWithoutCompletionMethodCompleted' on controller type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController."); }
public void FindAction_DoesNotMatchCompletedMethod() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "EventPatternCompleted"); // Assert Assert.IsNull(creator, "No method should have matched."); }
public void FindAction_DoesNotMatchCompletedMethod() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "EventPatternCompleted"); // Assert Assert.IsNull(creator, "No method should have matched."); }
public void FindAction_ReturnsNullIfNoMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "ZeroMatch"); // Assert Assert.IsNull(creator, "No method should have matched."); }
public void FindActionMethodDoesNotMatchBeginMethod() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindActionMethod(null, "BeginAsyncResultPattern"); // Assert Assert.IsNull(creator, "No method should have matched."); }
public void FindAction_DoesNotMatchAsyncMethod() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "EventPatternAsync"); // Assert Assert.Null(creator); }
public void FindAction_DoesNotMatchCompletedMethod() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "EventPatternCompleted"); // Assert Assert.Null(creator); }
public void FindAction_ReturnsNullIfNoMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "ZeroMatch"); // Assert Assert.Null(creator); }
public void FindAction_ThrowsIfMultipleMethodsMatch() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & veriy Assert.Throws <AmbiguousMatchException>( delegate { selector.FindAction(new ControllerContext(), "TwoMatch"); }, "The current request for action 'TwoMatch' on controller type 'SelectionAttributeController' is ambiguous between the following action methods:" + Environment.NewLine + "Void TwoMatch2() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController" + Environment.NewLine + "Void TwoMatch() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController"); }
public void FindActionMethodWithAsyncPatternTypeThrowsIfEndMethodNotFound() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert ExceptionHelper.ExpectInvalidOperationException( delegate { selector.FindActionMethod(null, "AsyncResultPatternEndNotFound"); }, @"Could not locate a method named 'EndAsyncResultPatternEndNotFound' on controller type 'Microsoft.Web.Mvc.Test.AsyncActionMethodSelectorTest+MethodLocatorController'."); }
public void FindActionMethod_Asynchronous_ThrowsIfMultipleCompletedMethodsMatched() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert Assert.Throws <AmbiguousMatchException>( delegate { ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "EventPatternAmbiguous"); }, "Lookup for method 'EventPatternAmbiguousCompleted' on controller type 'MethodLocatorController' failed because of an ambiguity between the following methods:" + Environment.NewLine + "Void EventPatternAmbiguousCompleted(Int32) on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController" + Environment.NewLine + "Void EventPatternAmbiguousCompleted(System.String) on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController"); }
public void FindAction_ThrowsIfMultipleMethodsMatch() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & veriy ExceptionHelper.ExpectException <AmbiguousMatchException>( delegate { selector.FindAction(null, "TwoMatch"); }, @"The current request for action 'TwoMatch' on controller type 'SelectionAttributeController' is ambiguous between the following action methods: Void TwoMatch2() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController Void TwoMatch() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController"); }
public void AliasedMethodsProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); // Act AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Assert Assert.AreEqual(3, selector.AliasedMethods.Length); List<MethodInfo> sortedAliasedMethods = selector.AliasedMethods.OrderBy(methodInfo => methodInfo.Name).ToList(); Assert.AreEqual("Bar", sortedAliasedMethods[0].Name); Assert.AreEqual("FooRenamed", sortedAliasedMethods[1].Name); Assert.AreEqual("Renamed", sortedAliasedMethods[2].Name); }
public void FindActionMethodWithAsyncPatternTypeThrowsIfEndMethodIsAmbiguous() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert ExceptionHelper.ExpectException <AmbiguousMatchException>( delegate { selector.FindActionMethod(null, "AsyncResultPatternWithConflict"); }, @"Lookup for method 'EndAsyncResultPatternWithRename2' on controller type 'MethodLocatorController' failed because of an ambiguity between the following methods: Void EndAsyncResultPatternWithRename2(System.IAsyncResult) on type Microsoft.Web.Mvc.Test.AsyncActionMethodSelectorTest+MethodLocatorController Void EndAsyncResultPatternWithRename2() on type Microsoft.Web.Mvc.Test.AsyncActionMethodSelectorTest+MethodLocatorController"); }
public void FindAction_ReturnsMatchingMethodIfOneMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "OneMatch"); ActionDescriptor actionDescriptor = creator("someName", new Mock<ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType<ReflectedActionDescriptor>(actionDescriptor); Assert.Equal("OneMatch", castActionDescriptor.MethodInfo.Name); Assert.Equal(typeof(string), castActionDescriptor.MethodInfo.GetParameters()[0].ParameterType); }
public void FindActionMethodWithDelegatePatternType() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindActionMethod(null, "DelegatePattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert Assert.IsInstanceOfType(actionDescriptor, typeof(ReflectedDelegatePatternActionDescriptor)); ReflectedDelegatePatternActionDescriptor castActionDescriptor = (ReflectedDelegatePatternActionDescriptor)actionDescriptor; Assert.AreEqual("DelegatePattern", castActionDescriptor.ActionMethod.Name); }
public void FindAction_ReturnsMatchingMethodIfOneMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "OneMatch"); ActionDescriptor actionDescriptor = creator("someName", new Mock<ControllerDescriptor>().Object); // Assert Assert.IsInstanceOfType(actionDescriptor, typeof(ReflectedActionDescriptor)); ReflectedActionDescriptor castActionDescriptor = (ReflectedActionDescriptor)actionDescriptor; Assert.AreEqual("OneMatch", castActionDescriptor.MethodInfo.Name, "Method named OneMatch() should have matched."); Assert.AreEqual(typeof(string), castActionDescriptor.MethodInfo.GetParameters()[0].ParameterType, "Method overload OneMatch(string) should have matched."); }
public void FindActionMethod_Asynchronous() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "EventPattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType <ReflectedAsyncActionDescriptor>(actionDescriptor); Assert.Equal("EventPatternAsync", castActionDescriptor.AsyncMethodInfo.Name); Assert.Equal("EventPatternCompleted", castActionDescriptor.CompletedMethodInfo.Name); }
public void FindActionMethod_GenericTask() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "GenericTaskPattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType <TaskAsyncActionDescriptor>(actionDescriptor); Assert.Equal("GenericTaskPattern", castActionDescriptor.TaskMethodInfo.Name); Assert.Equal(typeof(Task <string>), castActionDescriptor.TaskMethodInfo.ReturnType); }
public void FindActionMethod_Asynchronous() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "EventPattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert Assert.IsInstanceOfType(actionDescriptor, typeof(ReflectedAsyncActionDescriptor)); ReflectedAsyncActionDescriptor castActionDescriptor = (ReflectedAsyncActionDescriptor)actionDescriptor; Assert.AreEqual("EventPatternAsync", castActionDescriptor.AsyncMethodInfo.Name); Assert.AreEqual("EventPatternCompleted", castActionDescriptor.CompletedMethodInfo.Name); }
public void FindAction_ReturnsMatchingMethodIfOneMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "OneMatch"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert Assert.IsInstanceOfType(actionDescriptor, typeof(ReflectedActionDescriptor)); ReflectedActionDescriptor castActionDescriptor = (ReflectedActionDescriptor)actionDescriptor; Assert.AreEqual("OneMatch", castActionDescriptor.MethodInfo.Name, "Method named OneMatch() should have matched."); Assert.AreEqual(typeof(string), castActionDescriptor.MethodInfo.GetParameters()[0].ParameterType, "Method overload OneMatch(string) should have matched."); }
public void AliasedMethodsProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); // Act AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Assert Assert.Equal(3, selector.AliasedMethods.Length); List <MethodInfo> sortedAliasedMethods = selector.AliasedMethods.OrderBy(methodInfo => methodInfo.Name).ToList(); Assert.Equal("Bar", sortedAliasedMethods[0].Name); Assert.Equal("FooRenamed", sortedAliasedMethods[1].Name); Assert.Equal("Renamed", sortedAliasedMethods[2].Name); }
public void FindAction_ReturnsMethodWithActionSelectionAttributeIfMultipleMethodsMatchRequest() { // DevDiv Bugs 212062: If multiple action methods match a request, we should match only the methods with an // [ActionMethod] attribute since we assume those methods are more specific. // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(new ControllerContext(), "ShouldMatchMethodWithSelectionAttribute"); ActionDescriptor actionDescriptor = creator("someName", new Mock <ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType <ReflectedActionDescriptor>(actionDescriptor); Assert.Equal("MethodHasSelectionAttribute1", castActionDescriptor.MethodInfo.Name); }
public void FindAction_MultipleMethodsSameActionOneWithRouteAttributeAndRouteWasMatched_ReturnsMethodWithRoutingAttribute() { // Arrange Type controllerType = typeof(WithRoutingAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); var context = new ControllerContext(); context.RouteData = new RouteData(); context.RouteData.Route = DirectRouteTestHelpers.BuildDirectRouteStubsFrom <WithRoutingAttributeController>(c => c.Action())[0]; // Act ActionDescriptor matchedAction = selector.FindAction(context, "Action")("Action", new ReflectedAsyncControllerDescriptor(controllerType)); var matchedMethod = ((ReflectedActionDescriptor)matchedAction).MethodInfo; // Assert Assert.Equal(context.RouteData.GetTargetActionMethod(), matchedMethod); }
private static List <ActionDescriptor> GetActionDescriptors(ReflectedAsyncControllerDescriptor controller) { Contract.Assert(controller != null); AsyncActionMethodSelector actionSelector = controller.Selector; var actions = new List <ActionDescriptor>(); foreach (MethodInfo method in actionSelector.ActionMethods) { string actionName = actionSelector.GetActionName(method); ActionDescriptorCreator creator = actionSelector.GetActionDescriptorDelegate(method); Debug.Assert(creator != null); ActionDescriptor action = creator(actionName, controller); actions.Add(action); } return(actions); }
internal static void AddRouteEntries(SubRouteCollection collector, ReflectedAsyncControllerDescriptor controller, IInlineConstraintResolver constraintResolver) { string prefix = GetRoutePrefix(controller); RouteAreaAttribute area = controller.GetAreaFrom(); string areaName = controller.GetAreaName(area); string areaPrefix = area != null ? area.AreaPrefix ?? area.AreaName : null; ValidateAreaPrefixTemplate(areaPrefix, areaName, controller); AsyncActionMethodSelector actionSelector = controller.Selector; foreach (var method in actionSelector.DirectRouteMethods) { ActionDescriptor action = CreateActionDescriptor(controller, actionSelector, method); IEnumerable<IDirectRouteFactory> factories = GetRouteFactories(method, controller.ControllerType); AddRouteEntries(collector, areaPrefix, prefix, factories, new ActionDescriptor[] { action }, constraintResolver, targetIsAction: true); } // Check for controller-level routes. List<ActionDescriptor> actionsWithoutRoutes = new List<ActionDescriptor>(); foreach (var method in actionSelector.StandardRouteMethods) { ActionDescriptor action = CreateActionDescriptor(controller, actionSelector, method); actionsWithoutRoutes.Add(action); } IReadOnlyCollection<IDirectRouteFactory> controllerFactories = GetRouteFactories(controller); // If they exist and have not been overridden, create routes for controller-level route providers. if (controllerFactories.Count > 0 && actionsWithoutRoutes.Count > 0) { AddRouteEntries(collector, areaPrefix, prefix, controllerFactories, actionsWithoutRoutes, constraintResolver, targetIsAction: false); } }
public void FindAction_MultipleMethodsSameActionOneWithRouteAttributeAndRouteWasMatched_ReturnsMethodWithRoutingAttribute() { // Arrange Type controllerType = typeof(WithRoutingAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); var context = new ControllerContext(); context.RouteData = new RouteData(); context.RouteData.Route = DirectRouteTestHelpers.BuildDirectRouteStubsFrom<WithRoutingAttributeController>(c => c.Action())[0]; // Act ActionDescriptor matchedAction = selector.FindAction(context, "Action")("Action", new ReflectedAsyncControllerDescriptor(controllerType)); var matchedMethod = ((ReflectedActionDescriptor)matchedAction).MethodInfo; // Assert Assert.Equal(context.RouteData.GetTargetActionMethod(), matchedMethod); }
internal List <RouteEntry> MapMvcAttributeRoutes(ReflectedAsyncControllerDescriptor controllerDescriptor) { string prefix = controllerDescriptor.GetPrefixFrom(); ValidatePrefixTemplate(prefix, controllerDescriptor); RouteAreaAttribute area = controllerDescriptor.GetAreaFrom(); string areaName = controllerDescriptor.GetAreaName(area); string areaPrefix = area != null ? area.AreaPrefix ?? area.AreaName : null; ValidateAreaPrefixTemplate(areaPrefix, areaName, controllerDescriptor); AsyncActionMethodSelector actionSelector = controllerDescriptor.Selector; IEnumerable <MethodInfo> actionMethodsInfo = actionSelector.DirectRouteMethods; List <RouteEntry> routeEntries = new List <RouteEntry>(); foreach (var method in actionMethodsInfo) { string actionName = actionSelector.GetActionName(method); ActionDescriptorCreator creator = actionSelector.GetActionDescriptorDelegate(method); Debug.Assert(creator != null); ActionDescriptor actionDescriptor = creator(actionName, controllerDescriptor); IEnumerable <IRouteInfoProvider> routeAttributes = GetRouteAttributes(method, controllerDescriptor.ControllerType); foreach (var routeAttribute in routeAttributes) { ValidateTemplate(routeAttribute.Template, actionName, controllerDescriptor); string template = CombinePrefixAndAreaWithTemplate(areaPrefix, prefix, routeAttribute.Template); Route route = _routeBuilder.BuildDirectRoute(template, routeAttribute, controllerDescriptor, actionDescriptor); RouteEntry entry = new RouteEntry { Name = routeAttribute.Name, Route = route, Template = template, }; routeEntries.Add(entry); } } // Check for controller-level routes. IEnumerable <IRouteInfoProvider> controllerRouteAttributes = controllerDescriptor.GetDirectRoutes(); List <ActionDescriptor> actions = new List <ActionDescriptor>(); foreach (var actionMethod in actionSelector.StandardRouteMethods) { string actionName = actionSelector.GetActionName(actionMethod); ActionDescriptorCreator creator = actionSelector.GetActionDescriptorDelegate(actionMethod); Debug.Assert(creator != null); ActionDescriptor actionDescriptor = creator(actionName, controllerDescriptor); actions.Add(actionDescriptor); } // Don't create a route for the controller-level attributes if no actions could possibly match if (actions.Any()) { foreach (var routeAttribute in controllerRouteAttributes) { string template = CombinePrefixAndAreaWithTemplate(areaPrefix, prefix, routeAttribute.Template); Route route = _routeBuilder.BuildDirectRoute(template, routeAttribute, controllerDescriptor, actions); RouteEntry entry = new RouteEntry { Name = routeAttribute.Name, Route = route, Template = template, }; routeEntries.Add(entry); } } return(routeEntries); }
public void FindAction_NullContext_Throws() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & Assert Assert.Throws<ArgumentNullException>(() => selector.FindAction(null, "Action")); }
public void FindActionMethod_Asynchronous() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "EventPattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock<ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType<ReflectedAsyncActionDescriptor>(actionDescriptor); Assert.Equal("EventPatternAsync", castActionDescriptor.AsyncMethodInfo.Name); Assert.Equal("EventPatternCompleted", castActionDescriptor.CompletedMethodInfo.Name); }
public void FindAction_ThrowsIfMultipleMethodsMatch() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & veriy Assert.Throws<AmbiguousMatchException>( delegate { selector.FindAction(null, "TwoMatch"); }, @"The current request for action 'TwoMatch' on controller type 'SelectionAttributeController' is ambiguous between the following action methods: Void TwoMatch2() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController Void TwoMatch() on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+SelectionAttributeController"); }
public void FindActionMethod_GenericTask() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "GenericTaskPattern"); ActionDescriptor actionDescriptor = creator("someName", new Mock<ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType<TaskAsyncActionDescriptor>(actionDescriptor); Assert.Equal("GenericTaskPattern", castActionDescriptor.TaskMethodInfo.Name); Assert.Equal(typeof(Task<string>), castActionDescriptor.TaskMethodInfo.ReturnType); }
public void FindAction_ReturnsMethodWithActionSelectionAttributeIfMultipleMethodsMatchRequest() { // DevDiv Bugs 212062: If multiple action methods match a request, we should match only the methods with an // [ActionMethod] attribute since we assume those methods are more specific. // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "ShouldMatchMethodWithSelectionAttribute"); ActionDescriptor actionDescriptor = creator("someName", new Mock<ControllerDescriptor>().Object); // Assert var castActionDescriptor = Assert.IsType<ReflectedActionDescriptor>(actionDescriptor); Assert.Equal("MethodHasSelectionAttribute1", castActionDescriptor.MethodInfo.Name); }
public void FindActionMethod_Asynchronous_ThrowsIfCompletionMethodNotFound() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert Assert.Throws<InvalidOperationException>( delegate { ActionDescriptorCreator creator = selector.FindAction(null, "EventPatternWithoutCompletionMethod"); }, @"Could not locate a method named 'EventPatternWithoutCompletionMethodCompleted' on controller type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController."); }
public void FindActionMethod_Asynchronous_ThrowsIfMultipleCompletedMethodsMatched() { // Arrange Type controllerType = typeof(MethodLocatorController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act & assert Assert.Throws<AmbiguousMatchException>( delegate { ActionDescriptorCreator creator = selector.FindAction(null, "EventPatternAmbiguous"); }, @"Lookup for method 'EventPatternAmbiguousCompleted' on controller type 'MethodLocatorController' failed because of an ambiguity between the following methods: Void EventPatternAmbiguousCompleted(Int32) on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController Void EventPatternAmbiguousCompleted(System.String) on type System.Web.Mvc.Async.Test.AsyncActionMethodSelectorTest+MethodLocatorController"); }
public void NonAliasedMethodsProperty() { // Arrange Type controllerType = typeof(MethodLocatorController); // Act AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Assert Assert.Equal(6, selector.NonAliasedMethods.Count); List<MethodInfo> sortedMethods = selector.NonAliasedMethods["foo"].OrderBy(methodInfo => methodInfo.GetParameters().Length).ToList(); Assert.Equal("Foo", sortedMethods[0].Name); Assert.Empty(sortedMethods[0].GetParameters()); Assert.Equal("Foo", sortedMethods[1].Name); Assert.Equal(typeof(string), sortedMethods[1].GetParameters()[0].ParameterType); Assert.Equal(1, selector.NonAliasedMethods["EventPattern"].Count()); Assert.Equal("EventPatternAsync", selector.NonAliasedMethods["EventPattern"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["EventPatternAmbiguous"].Count()); Assert.Equal("EventPatternAmbiguousAsync", selector.NonAliasedMethods["EventPatternAmbiguous"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["EventPatternWithoutCompletionMethod"].Count()); Assert.Equal("EventPatternWithoutCompletionMethodAsync", selector.NonAliasedMethods["EventPatternWithoutCompletionMethod"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["TaskPattern"].Count()); Assert.Equal("TaskPattern", selector.NonAliasedMethods["TaskPattern"].First().Name); Assert.Equal(1, selector.NonAliasedMethods["GenericTaskPattern"].Count()); Assert.Equal("GenericTaskPattern", selector.NonAliasedMethods["GenericTaskPattern"].First().Name); }
public void FindAction_ReturnsNullIfNoMethodMatches() { // Arrange Type controllerType = typeof(SelectionAttributeController); AsyncActionMethodSelector selector = new AsyncActionMethodSelector(controllerType); // Act ActionDescriptorCreator creator = selector.FindAction(null, "ZeroMatch"); // Assert Assert.Null(creator); }
internal List <RouteEntry> MapMvcAttributeRoutes(ReflectedAsyncControllerDescriptor controllerDescriptor) { string prefix = controllerDescriptor.GetPrefixFrom(); ValidatePrefixTemplate(prefix, controllerDescriptor); RouteAreaAttribute area = controllerDescriptor.GetAreaFrom(); string areaName = controllerDescriptor.GetAreaName(area); string areaPrefix = area != null ? area.AreaPrefix ?? area.AreaName : null; ValidateAreaPrefixTemplate(areaPrefix, areaName, controllerDescriptor); string controllerName = controllerDescriptor.ControllerName; AsyncActionMethodSelector actionSelector = controllerDescriptor.Selector; IEnumerable <MethodInfo> actionMethodsInfo = actionSelector.DirectRouteMethods; List <RouteEntry> routeEntries = new List <RouteEntry>(); foreach (var method in actionMethodsInfo) { string actionName = actionSelector.GetActionName(method); IEnumerable <IRouteInfoProvider> routeAttributes = GetRouteAttributes(method, controllerDescriptor.ControllerType); IEnumerable <string> verbs = GetActionVerbs(method); foreach (var routeAttribute in routeAttributes) { ValidateTemplate(routeAttribute.Template, actionName, controllerDescriptor); string template = CombinePrefixAndAreaWithTemplate(areaPrefix, prefix, routeAttribute.Template); Route route = _routeBuilder.BuildDirectRoute(template, verbs, controllerName, actionName, method, areaName); RouteEntry entry = new RouteEntry { Name = routeAttribute.Name, Route = route, Template = template, ParsedRoute = RouteParser.Parse(route.Url), HasVerbs = verbs.Any() }; routeEntries.Add(entry); } } // Check for controller-level routes. IEnumerable <IRouteInfoProvider> controllerRouteAttributes = controllerDescriptor.GetDirectRoutes(); foreach (var routeAttribute in controllerRouteAttributes) { string template = CombinePrefixAndAreaWithTemplate(areaPrefix, prefix, routeAttribute.Template); Route route = _routeBuilder.BuildDirectRoute(template, controllerDescriptor); RouteEntry entry = new RouteEntry { Name = routeAttribute.Name, Route = route, Template = template, ParsedRoute = RouteParser.Parse(route.Url) }; routeEntries.Add(entry); } return(routeEntries); }