Skip to content
This repository has been archived by the owner on Dec 14, 2018. It is now read-only.

Add test for metadata precedence #8642

Merged
merged 1 commit into from Oct 26, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -577,16 +577,16 @@ private bool MatchRouteValue(ActionDescriptor action, MvcEndpointInfo endpointIn
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));
Expand Down
Expand Up @@ -1305,6 +1305,36 @@ public void Endpoints_AttributeRoutes_DefaultDifferentCaseFromRouteValue_UseDefa
});
}

[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)
Expand Down Expand Up @@ -1381,19 +1411,22 @@ private IActionDescriptorCollectionProvider GetActionDescriptorCollection(string
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)
.Returns(new ActionDescriptorCollection(actionDescriptors, version: 0));
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);
Expand All @@ -1409,6 +1442,7 @@ private ActionDescriptor CreateActionDescriptor(object requiredValues, string at
Template = attributeRouteTemplate
};
}
actionDescriptor.EndpointMetadata = metadata;
return actionDescriptor;
}

Expand Down