public void CreateRoute_IfBuilderConstraintsIsNull_UsesConstraintsPropertyWhenBuilding() { // Arrange TRouteDictionary expectedConstraints = new TRouteDictionaryConcrete(); Mock <RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.Constraints).Returns(expectedConstraints); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary constraints = null; IDirectRouteBuilder builder = null; builder = CreateBuilder(() => { constraints = builder.Constraints; return(null); }); Assert.Null(builder.Constraints); // Guard DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(expectedConstraints, constraints); }
public void BuildRoute_ValidatesConstraintType_InvalidType() { // Arrange var actions = GetActions(); var builder = new DirectRouteBuilder(actions, targetIsAction: true); var constraint = new Uri("http://localhost/"); var constraints = new TRouteValueDictionary(); constraints.Add("custom", constraint); builder.Constraints = constraints; builder.Template = "c/{id}"; #if ASPNETWEBAPI string expectedMessage = "The constraint entry 'custom' on the route with route template 'c/{id}' " + "must have a string value or be of a type which implements 'System.Web.Http.Routing.IHttpRouteConstraint'."; #else string expectedMessage = "The constraint entry 'custom' on the route with route template 'c/{id}' " + "must have a string value or be of a type which implements 'System.Web.Routing.IRouteConstraint'."; #endif // Act & Assert Assert.Throws<InvalidOperationException>(() => builder.Build(), expectedMessage); }
public void CreateRoute_IfBuilderDataTokensIsNotNullAndDataTokensPropertyIsNull_UsesBuilderDataTokens() { // Arrange TRouteDictionary existingDataTokens = new TRouteDictionaryConcrete(); Mock <RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.DataTokens).Returns((TRouteDictionary)null); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary dataTokens = null; IDirectRouteBuilder builder = null; builder = CreateBuilder(() => { dataTokens = builder.DataTokens; return(null); }); builder.DataTokens = existingDataTokens; DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(existingDataTokens, dataTokens); }
/// <summary>Creates a route builder that can build a route matching this context.</summary> /// <param name="template">The route template.</param> /// <param name="constraintResolver"> /// The inline constraint resolver to use, if any; otherwise, <see langword="null"/>. /// </param> /// <returns>A route builder that can build a route matching this context.</returns> public IDirectRouteBuilder CreateBuilder(string template, IInlineConstraintResolver constraintResolver) { DirectRouteBuilder builder = new DirectRouteBuilder(_actions, _targetIsAction); #if ASPNETWEBAPI string prefixedTemplate = BuildRouteTemplate(_prefix, template); #else string prefixedTemplate = BuildRouteTemplate(_areaPrefix, _controllerPrefix, template ?? String.Empty); #endif ValidateTemplate(prefixedTemplate); if (constraintResolver != null) { TRouteDictionary defaults = new TRouteDictionary(); TRouteDictionary constraints = new TRouteDictionary(); string detokenizedTemplate = InlineRouteTemplateParser.ParseRouteTemplate(prefixedTemplate, defaults, constraints, constraintResolver); TParsedRoute parsedRoute = RouteParser.Parse(detokenizedTemplate); decimal precedence = RoutePrecedence.Compute(parsedRoute, constraints); builder.Defaults = defaults; builder.Constraints = constraints; builder.Template = detokenizedTemplate; builder.Precedence = precedence; builder.ParsedRoute = parsedRoute; } else { builder.Template = prefixedTemplate; } return(builder); }
public void BuildRoute_ValidatesConstraintType_InvalidType() { // Arrange var actions = GetActions(); var builder = new DirectRouteBuilder(actions, targetIsAction: true); var constraint = new Uri("http://localhost/"); var constraints = new TRouteValueDictionary(); constraints.Add("custom", constraint); builder.Constraints = constraints; builder.Template = "c/{id}"; #if ASPNETWEBAPI string expectedMessage = "The constraint entry 'custom' on the route with route template 'c/{id}' " + "must have a string value or be of a type which implements 'System.Web.Http.Routing.IHttpRouteConstraint'."; #else string expectedMessage = "The constraint entry 'custom' on the route with route template 'c/{id}' " + "must have a string value or be of a type which implements 'System.Web.Routing.IRouteConstraint'."; #endif // Act & Assert Assert.Throws <InvalidOperationException>(() => builder.Build(), expectedMessage); }
public void CreateRoute_IfBuilderDataTokensIsNotNull_UpdatesDataTokensFromPropertyWhenBuilding() { // Arrange TRouteDictionary existingDataTokens = new TRouteDictionaryConcrete(); string existingDataTokenKey = "ExistingDataTokenKey"; object existingDataTokenValue = "ExistingDataToken"; existingDataTokens.Add(existingDataTokenKey, existingDataTokenValue); string conflictingDataTokenKey = "ConflictingDataTokenKey"; object oldConflictingDataTokenValue = "OldConflictingDataToken"; existingDataTokens.Add(conflictingDataTokenKey, oldConflictingDataTokenValue); TRouteDictionary additionalDataTokens = new TRouteDictionaryConcrete(); string additionalDataTokenKey = "NewDataTokenKey"; string additionalDataTokenValue = "NewDataToken"; additionalDataTokens.Add(additionalDataTokenKey, additionalDataTokenValue); string newConflictingDataTokenValue = "NewConflictingDataToken"; additionalDataTokens.Add(conflictingDataTokenKey, newConflictingDataTokenValue); Mock <RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.DataTokens).Returns(additionalDataTokens); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary dataTokens = null; IDirectRouteBuilder builder = null; builder = CreateBuilder( () => { dataTokens = builder.DataTokens; return(null); } ); builder.DataTokens = existingDataTokens; DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(existingDataTokens, dataTokens); Assert.Equal(3, dataTokens.Count); Assert.True(dataTokens.ContainsKey(existingDataTokenKey)); Assert.Same(existingDataTokenValue, dataTokens[existingDataTokenKey]); Assert.True(dataTokens.ContainsKey(conflictingDataTokenKey)); Assert.Same(newConflictingDataTokenValue, dataTokens[conflictingDataTokenKey]); Assert.True(dataTokens.ContainsKey(additionalDataTokenKey)); Assert.Same(additionalDataTokenValue, dataTokens[additionalDataTokenKey]); }
public static LocalizationRoute ToLocalizationRoute(this TIRoute route, string url, string culture) { // Add culture to the route defaults so it can be used as action parameter TRouteValueDictionary defaults = new TRouteValueDictionary(route.Defaults); defaults["culture"] = culture; return new LocalizationRoute(url, defaults, new TRouteValueDictionary(route.Constraints), new TRouteValueDictionary(route.DataTokens), route.RouteHandler(), culture); }
public static LocalizationRoute ToLocalizationRoute(this TIRoute route, string url, string culture) { // Add culture to the route defaults so it can be used as action parameter TRouteValueDictionary defaults = new TRouteValueDictionary(route.Defaults); defaults["culture"] = culture; return(new LocalizationRoute(url, defaults, new TRouteValueDictionary(route.Constraints), new TRouteValueDictionary(route.DataTokens), route.RouteHandler(), culture)); }
public void BuildRoute_ValidatesConstraintType_StringRegex() { // Arrange var actions = GetActions(); var builder = new DirectRouteBuilder(actions, targetIsAction: true); var constraint = "product|products"; var constraints = new TRouteValueDictionary(); constraints.Add("custom", constraint); builder.Constraints = constraints; // Act var routeEntry = builder.Build(); // Assert Assert.NotNull(routeEntry.Route.Constraints["custom"]); }
public void BuildRoute_ValidatesConstraintType_StringRegex() { // Arrange var actions = GetActions(); var builder = new DirectRouteBuilder(actions, targetIsAction: true); var constraint = "product|products"; var constraints = new TRouteValueDictionary(); constraints.Add("custom", constraint); builder.Constraints = constraints; // Act var routeEntry = builder.Build(); // Assert Assert.NotNull(routeEntry.Route.Constraints["custom"]); }
/// <summary>Creates a route builder that can build a route matching this context.</summary> /// <param name="template">The route template.</param> /// <param name="constraintResolver"> /// The inline constraint resolver to use, if any; otherwise, <see langword="null"/>. /// </param> /// <returns>A route builder that can build a route matching this context.</returns> public IDirectRouteBuilder CreateBuilder(string template, IInlineConstraintResolver constraintResolver) { DirectRouteBuilder builder = new DirectRouteBuilder(_actions, _targetIsAction); #if ASPNETWEBAPI string prefixedTemplate = BuildRouteTemplate(_prefix, template); #else string prefixedTemplate = BuildRouteTemplate(_areaPrefix, _controllerPrefix, template ?? String.Empty); #endif ValidateTemplate(prefixedTemplate); if (constraintResolver != null) { TRouteDictionary defaults = new TRouteDictionary(); TRouteDictionary constraints = new TRouteDictionary(); string detokenizedTemplate = InlineRouteTemplateParser.ParseRouteTemplate(prefixedTemplate, defaults, constraints, constraintResolver); TParsedRoute parsedRoute = RouteParser.Parse(detokenizedTemplate); decimal precedence = RoutePrecedence.Compute(parsedRoute, constraints); builder.Defaults = defaults; builder.Constraints = constraints; builder.Template = detokenizedTemplate; builder.Precedence = precedence; builder.ParsedRoute = parsedRoute; } else { builder.Template = prefixedTemplate; } return builder; }
/// <inheritdoc/> public virtual RouteEntry Build() { if (ParsedRoute == null) { ParsedRoute = RouteParser.Parse(Template); } ValidateParameters(ParsedRoute); TRouteDictionaryConcrete defaults; #if ASPNETWEBAPI defaults = Copy(Defaults); #else defaults = Copy(Defaults) ?? new RouteValueDictionary(); #endif TRouteDictionaryConcrete constraints = Copy(Constraints); TRouteDictionaryConcrete dataTokens = Copy(DataTokens) ?? new TRouteDictionaryConcrete(); dataTokens[RouteDataTokenKeys.Actions] = _actions; #if ASPNETWEBAPI if (!TargetIsAction) { dataTokens[RouteDataTokenKeys.Controller] = _actions[0].ControllerDescriptor; } #endif int order = Order; if (order != default(int)) { dataTokens[RouteDataTokenKeys.Order] = order; } decimal precedence = Precedence; if (precedence != default(decimal)) { dataTokens[RouteDataTokenKeys.Precedence] = precedence; } #if ASPNETWEBAPI if (constraints != null) { foreach (var constraint in constraints) { HttpRoute.ValidateConstraint(Template, constraint.Key, constraint.Value); } } HttpMessageHandler handler = null; IHttpRoute route = new HttpRoute( Template, defaults, constraints, dataTokens, handler, ParsedRoute ); #else ControllerDescriptor controllerDescriptor = GetControllerDescriptor(); if (controllerDescriptor != null) { defaults["controller"] = controllerDescriptor.ControllerName; } if (TargetIsAction && _actions.Length == 1) { ActionDescriptor actionDescriptor = _actions[0]; defaults["action"] = actionDescriptor.ActionName; dataTokens[RouteDataTokenKeys.TargetIsAction] = true; } RouteAreaAttribute area = controllerDescriptor.GetAreaFrom(); string areaName = controllerDescriptor.GetAreaName(area); if (areaName != null) { dataTokens[RouteDataTokenKeys.Area] = areaName; dataTokens[RouteDataTokenKeys.UseNamespaceFallback] = false; Type controllerType = controllerDescriptor.ControllerType; if (controllerType != null) { dataTokens[RouteDataTokenKeys.Namespaces] = new[] { controllerType.Namespace }; } } Route route = new Route( Template, defaults, constraints, dataTokens, routeHandler: null ); ConstraintValidation.Validate(route); #endif return(new RouteEntry(Name, route)); }
public void CreateRoute_IfBuilderDataTokensIsNotNullAndDataTokensPropertyIsNull_UsesBuilderDataTokens() { // Arrange TRouteDictionary existingDataTokens = new TRouteDictionaryConcrete(); Mock<RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.DataTokens).Returns((TRouteDictionary)null); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary dataTokens = null; IDirectRouteBuilder builder = null; builder = CreateBuilder(() => { dataTokens = builder.DataTokens; return null; }); builder.DataTokens = existingDataTokens; DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(existingDataTokens, dataTokens); }
public void CreateRoute_IfBuilderDataTokensIsNotNull_UpdatesDataTokensFromPropertyWhenBuilding() { // Arrange TRouteDictionary existingDataTokens = new TRouteDictionaryConcrete(); string existingDataTokenKey = "ExistingDataTokenKey"; object existingDataTokenValue = "ExistingDataToken"; existingDataTokens.Add(existingDataTokenKey, existingDataTokenValue); string conflictingDataTokenKey = "ConflictingDataTokenKey"; object oldConflictingDataTokenValue = "OldConflictingDataToken"; existingDataTokens.Add(conflictingDataTokenKey, oldConflictingDataTokenValue); TRouteDictionary additionalDataTokens = new TRouteDictionaryConcrete(); string additionalDataTokenKey = "NewDataTokenKey"; string additionalDataTokenValue = "NewDataToken"; additionalDataTokens.Add(additionalDataTokenKey, additionalDataTokenValue); string newConflictingDataTokenValue = "NewConflictingDataToken"; additionalDataTokens.Add(conflictingDataTokenKey, newConflictingDataTokenValue); Mock<RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.DataTokens).Returns(additionalDataTokens); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary dataTokens = null; IDirectRouteBuilder builder = null; builder = CreateBuilder(() => { dataTokens = builder.DataTokens; return null; }); builder.DataTokens = existingDataTokens; DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(existingDataTokens, dataTokens); Assert.Equal(3, dataTokens.Count); Assert.True(dataTokens.ContainsKey(existingDataTokenKey)); Assert.Same(existingDataTokenValue, dataTokens[existingDataTokenKey]); Assert.True(dataTokens.ContainsKey(conflictingDataTokenKey)); Assert.Same(newConflictingDataTokenValue, dataTokens[conflictingDataTokenKey]); Assert.True(dataTokens.ContainsKey(additionalDataTokenKey)); Assert.Same(additionalDataTokenValue, dataTokens[additionalDataTokenKey]); }
public void CreateRoute_IfBuilderConstraintsIsNull_UsesConstraintsPropertyWhenBuilding() { // Arrange TRouteDictionary expectedConstraints = new TRouteDictionaryConcrete(); Mock<RouteFactoryAttribute> productMock = CreateProductUnderTestMock(); productMock.SetupGet(p => p.Constraints).Returns(expectedConstraints); IDirectRouteFactory product = productMock.Object; RouteEntry expectedEntry = CreateEntry(); TRouteDictionary constraints = null; IDirectRouteBuilder builder = null; builder = CreateBuilder(() => { constraints = builder.Constraints; return null; }); Assert.Null(builder.Constraints); // Guard DirectRouteFactoryContext context = CreateContext((i) => builder); // Act RouteEntry ignore = product.CreateRoute(context); // Assert Assert.Same(expectedConstraints, constraints); }