public void CreateRoute_DelegatesToContextCreateBuilderBuild() { // Arrange string expectedTemplate = "RouteTemplate"; IDirectRouteProvider product = CreateProductUnderTest(expectedTemplate); HttpRouteEntry expectedEntry = CreateEntry(); DirectRouteBuilder builder = CreateBuilder(() => expectedEntry); DirectRouteProviderContext context = CreateContext((template) => template == expectedTemplate ? builder : new DirectRouteBuilder(new ReflectedHttpActionDescriptor[0])); // Act HttpRouteEntry entry = product.CreateRoute(context); // Assert Assert.Same(expectedEntry, entry); }
private static RouteEntry CreateRouteEntry( string prefix, IDirectRouteFactory factory, IReadOnlyCollection <HttpActionDescriptor> actions, IInlineConstraintResolver constraintResolver, bool targetIsAction) { Contract.Assert(factory != null); DirectRouteFactoryContext context = new DirectRouteFactoryContext(prefix, actions, constraintResolver, targetIsAction); RouteEntry entry = factory.CreateRoute(context); if (entry == null) { throw Error.InvalidOperation(SRResources.TypeMethodMustNotReturnNull, typeof(IDirectRouteFactory).Name, "CreateRoute"); } DirectRouteBuilder.ValidateRouteEntry(entry); return(entry); }
public void CreateRoute_UsesNamePropertyWhenBuilding() { // Arrange string expectedName = "RouteName"; RouteProviderAttribute product = CreateProductUnderTest(); product.Name = expectedName; string name = null; DirectRouteBuilder builder = null; builder = CreateBuilder(() => { name = builder.Name; return(null); }); DirectRouteProviderContext context = CreateContext((i) => builder); // Act HttpRouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(expectedName, name); }
public void CreateRoute_UsesOrderPropertyWhenBuilding() { // Arrange int expectedOrder = 123; RouteProviderAttribute product = CreateProductUnderTest(); product.Order = expectedOrder; int order = 0; DirectRouteBuilder builder = null; builder = CreateBuilder(() => { order = builder.Order; return(null); }); DirectRouteProviderContext context = CreateContext((i) => builder); // Act HttpRouteEntry ignore = product.CreateRoute(context); // Assert Assert.Equal(expectedOrder, order); }
private static void AddRouteEntries( SubRouteCollection collector, HttpConfiguration configuration, IInlineConstraintResolver constraintResolver, IDirectRouteProvider directRouteProvider) { Contract.Assert(configuration != null); Contract.Assert(directRouteProvider != null); IHttpControllerSelector controllerSelector = configuration.Services.GetHttpControllerSelector(); IDictionary <string, HttpControllerDescriptor> controllerMap = controllerSelector.GetControllerMapping(); if (controllerMap != null) { foreach (HttpControllerDescriptor controllerDescriptor in controllerMap.Values) { IHttpActionSelector actionSelector = controllerDescriptor.Configuration.Services.GetActionSelector(); ILookup <string, HttpActionDescriptor> actionsByName = actionSelector.GetActionMapping(controllerDescriptor); if (actionsByName == null) { continue; } List <HttpActionDescriptor> actions = actionsByName.SelectMany(g => g).ToList(); IReadOnlyCollection <RouteEntry> newEntries = directRouteProvider.GetDirectRoutes(controllerDescriptor, actions, constraintResolver); if (newEntries == null) { throw Error.InvalidOperation( SRResources.TypeMethodMustNotReturnNull, typeof(IDirectRouteProvider).Name, "GetDirectRoutes"); } foreach (RouteEntry entry in newEntries) { if (entry == null) { throw Error.InvalidOperation( SRResources.TypeMethodMustNotReturnNull, typeof(IDirectRouteProvider).Name, "GetDirectRoutes"); } DirectRouteBuilder.ValidateRouteEntry(entry); // We need to mark each action as only reachable by direct routes so that traditional routes // don't accidentally hit them. HttpControllerDescriptor routeControllerDescriptor = entry.Route.GetTargetControllerDescriptor(); if (routeControllerDescriptor == null) { HttpActionDescriptor[] actionDescriptors = entry.Route.GetTargetActionDescriptors(); foreach (var actionDescriptor in actionDescriptors) { actionDescriptor.SetIsAttributeRouted(true); } } else { routeControllerDescriptor.SetIsAttributeRouted(true); } } collector.AddRange(newEntries); } } }