Add test for metadata precedence (#8642)

This commit is contained in:
James Newton-King 2018-10-27 07:59:15 +13:00 committed by GitHub
parent 5656e7f455
commit 6bb292cfcc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 10 deletions

View File

@ -577,16 +577,16 @@ namespace Microsoft.AspNetCore.Mvc.Internal
bool suppressLinkGeneration,
bool suppressPathMatching)
{
var metadata = new List<object>
{
action
};
var metadata = new List<object>();
// Add action metadata first so it has a low precedence
if (action.EndpointMetadata != null)
{
metadata.AddRange(action.EndpointMetadata);
}
metadata.Add(action);
if (dataTokens != null)
{
metadata.Add(new DataTokensMetadata(dataTokens));

View File

@ -1305,6 +1305,36 @@ namespace Microsoft.AspNetCore.Mvc.Internal
});
}
[Fact]
public void Endpoints_AttributeRoutes_ActionMetadataDoesNotOverrideDataSourceMetadata()
{
// Arrange
var actionDescriptorCollection = GetActionDescriptorCollection(
CreateActionDescriptor(new { controller = "TestController", action = "TestAction" },
"{controller}/{action}/{id?}",
new List<object> { new RouteValuesAddressMetadata("fakeroutename", new RouteValueDictionary(new { fake = "Fake!" })) })
);
var dataSource = CreateMvcEndpointDataSource(actionDescriptorCollection);
// Act
var endpoints = dataSource.Endpoints;
// Assert
Assert.Collection(
endpoints,
(ep) =>
{
var matcherEndpoint = Assert.IsType<RouteEndpoint>(ep);
Assert.Equal("TestController/TestAction/{id?}", matcherEndpoint.RoutePattern.RawText);
Assert.Equal(0, matcherEndpoint.Order);
var routeValuesAddress = matcherEndpoint.Metadata.GetMetadata<IRouteValuesAddressMetadata>();
Assert.Equal("{controller}/{action}/{id?}", routeValuesAddress.RouteName);
Assert.Equal("TestController", routeValuesAddress.RequiredValues["controller"]);
Assert.Equal("TestAction", routeValuesAddress.RequiredValues["action"]);
});
}
private MvcEndpointDataSource CreateMvcEndpointDataSource(
IActionDescriptorCollectionProvider actionDescriptorCollectionProvider = null,
MvcEndpointInvokerFactory mvcEndpointInvokerFactory = null)
@ -1381,6 +1411,11 @@ namespace Microsoft.AspNetCore.Mvc.Internal
actionDescriptors.Add(CreateActionDescriptor(requiredValue, attributeRouteTemplate));
}
return GetActionDescriptorCollection(actionDescriptors.ToArray());
}
private IActionDescriptorCollectionProvider GetActionDescriptorCollection(params ActionDescriptor[] actionDescriptors)
{
var actionDescriptorCollectionProviderMock = new Mock<IActionDescriptorCollectionProvider>();
actionDescriptorCollectionProviderMock
.Setup(m => m.ActionDescriptors)
@ -1388,12 +1423,10 @@ namespace Microsoft.AspNetCore.Mvc.Internal
return actionDescriptorCollectionProviderMock.Object;
}
private ActionDescriptor CreateActionDescriptor(string controller, string action, string area = null)
{
return CreateActionDescriptor(new { controller = controller, action = action, area = area }, attributeRouteTemplate: null);
}
private ActionDescriptor CreateActionDescriptor(object requiredValues, string attributeRouteTemplate = null)
private ActionDescriptor CreateActionDescriptor(
object requiredValues,
string attributeRouteTemplate = null,
IList<object> metadata = null)
{
var actionDescriptor = new ActionDescriptor();
var routeValues = new RouteValueDictionary(requiredValues);
@ -1409,6 +1442,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
Template = attributeRouteTemplate
};
}
actionDescriptor.EndpointMetadata = metadata;
return actionDescriptor;
}