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

Commit

Permalink
Add test for metadata precedence (#8642)
Browse files Browse the repository at this point in the history
  • Loading branch information
JamesNK committed Oct 26, 2018
1 parent 5656e7f commit 6bb292c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 10 deletions.
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

0 comments on commit 6bb292c

Please sign in to comment.