// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Routing.Constraints; using Microsoft.Extensions.DependencyInjection; using Moq; using Xunit; namespace Microsoft.AspNetCore.Builder { public class MvcAreaRouteBuilderExtensionsTest { [Fact] public void MapAreaRoute_Simple() { // Arrange var builder = CreateRouteBuilder(); // Act builder.MapAreaRoute(name: null, areaName: "admin", template: "site/Admin/"); // Assert var route = Assert.IsType((Assert.Single(builder.Routes))); Assert.Null(route.Name); Assert.Equal("site/Admin/", route.RouteTemplate); Assert.Collection( route.Constraints.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.IsType(kvp.Value); }); Assert.Empty(route.DataTokens); Assert.Collection( route.Defaults.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.Equal(kvp.Value, "admin"); }); } [Fact] public void MapAreaRoute_Defaults() { // Arrange var builder = CreateRouteBuilder(); // Act builder.MapAreaRoute( name: "admin_area", areaName: "admin", template: "site/Admin/", defaults: new { action = "Home" }); // Assert var route = Assert.IsType((Assert.Single(builder.Routes))); Assert.Equal("admin_area", route.Name); Assert.Equal("site/Admin/", route.RouteTemplate); Assert.Collection( route.Constraints.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.IsType(kvp.Value); }); Assert.Empty(route.DataTokens); Assert.Collection( route.Defaults.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "action"); Assert.Equal(kvp.Value, "Home"); }, kvp => { Assert.Equal(kvp.Key, "area"); Assert.Equal(kvp.Value, "admin"); }); } [Fact] public void MapAreaRoute_DefaultsAndConstraints() { // Arrange var builder = CreateRouteBuilder(); // Act builder.MapAreaRoute( name: "admin_area", areaName: "admin", template: "site/Admin/", defaults: new { action = "Home" }, constraints: new { id = new IntRouteConstraint() }); // Assert var route = Assert.IsType((Assert.Single(builder.Routes))); Assert.Equal("admin_area", route.Name); Assert.Equal("site/Admin/", route.RouteTemplate); Assert.Collection( route.Constraints.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.IsType(kvp.Value); }, kvp => { Assert.Equal(kvp.Key, "id"); Assert.IsType(kvp.Value); }); Assert.Empty(route.DataTokens); Assert.Collection( route.Defaults.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "action"); Assert.Equal(kvp.Value, "Home"); }, kvp => { Assert.Equal(kvp.Key, "area"); Assert.Equal(kvp.Value, "admin"); }); } [Fact] public void MapAreaRoute_DefaultsConstraintsAndDataTokens() { // Arrange var builder = CreateRouteBuilder(); // Act builder.MapAreaRoute( name: "admin_area", areaName: "admin", template: "site/Admin/", defaults: new { action = "Home" }, constraints: new { id = new IntRouteConstraint() }, dataTokens: new { some_token = "hello" }); // Assert var route = Assert.IsType((Assert.Single(builder.Routes))); Assert.Equal("admin_area", route.Name); Assert.Equal("site/Admin/", route.RouteTemplate); Assert.Collection( route.Constraints.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.IsType(kvp.Value); }, kvp => { Assert.Equal(kvp.Key, "id"); Assert.IsType(kvp.Value); }); Assert.Collection( route.DataTokens.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "some_token"); Assert.Equal(kvp.Value, "hello"); }); Assert.Collection( route.Defaults.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "action"); Assert.Equal(kvp.Value, "Home"); }, kvp => { Assert.Equal(kvp.Key, "area"); Assert.Equal(kvp.Value, "admin"); }); } [Fact] public void MapAreaRoute_ReplacesValuesForArea() { // Arrange var builder = CreateRouteBuilder(); // Act builder.MapAreaRoute( name: "admin_area", areaName: "admin", template: "site/Admin/", defaults: new { area = "Home" }, constraints: new { area = new IntRouteConstraint() }, dataTokens: new { some_token = "hello" }); // Assert var route = Assert.IsType((Assert.Single(builder.Routes))); Assert.Equal("admin_area", route.Name); Assert.Equal("site/Admin/", route.RouteTemplate); Assert.Collection( route.Constraints.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.IsType(kvp.Value); }); Assert.Collection( route.DataTokens.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "some_token"); Assert.Equal(kvp.Value, "hello"); }); Assert.Collection( route.Defaults.OrderBy(kvp => kvp.Key), kvp => { Assert.Equal(kvp.Key, "area"); Assert.Equal(kvp.Value, "admin"); }); } private IServiceProvider CreateServices() { var services = new ServiceCollection(); services.AddOptions(); services.AddRouting(); return services.BuildServiceProvider(); } private IRouteBuilder CreateRouteBuilder() { var builder = new Mock(); builder .SetupGet(b => b.ServiceProvider) .Returns(CreateServices()); builder .SetupGet(b => b.Routes) .Returns(new List()); builder .SetupGet(b => b.DefaultHandler) .Returns(Mock.Of()); return builder.Object; } } }