Ensure IPageApplicationModelProviders are invoked in the sequence of their Order

Fixes #6536
This commit is contained in:
Pranav K 2017-07-12 15:37:41 -07:00
parent f94605df47
commit 998547839e
2 changed files with 64 additions and 1 deletions

View File

@ -23,7 +23,9 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
IViewCompilerProvider viewCompilerProvider,
IOptions<RazorPagesOptions> pageOptions)
{
_applicationModelProviders = applicationModelProviders.ToArray();
_applicationModelProviders = applicationModelProviders
.OrderBy(p => p.Order)
.ToArray();
_viewCompilerProvider = viewCompilerProvider;
_conventions = pageOptions.Value.Conventions
.OfType<IPageApplicationModelConvention>()

View File

@ -81,6 +81,67 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
provider2.Verify();
}
[Fact]
public void Load_InvokesApplicationModelProviders_WithTheRightOrder()
{
// Arrange
var descriptor = new PageActionDescriptor();
var compilerProvider = GetCompilerProvider();
var options = new TestOptionsManager<RazorPagesOptions>();
var provider1 = new Mock<IPageApplicationModelProvider>();
provider1.SetupGet(p => p.Order).Returns(10);
var provider2 = new Mock<IPageApplicationModelProvider>();
provider2.SetupGet(p => p.Order).Returns(-5);
var sequence = 0;
provider1.Setup(p => p.OnProvidersExecuting(It.IsAny<PageApplicationModelProviderContext>()))
.Callback((PageApplicationModelProviderContext c) =>
{
Assert.Equal(1, sequence++);
c.PageApplicationModel = new PageApplicationModel(descriptor, typeof(object).GetTypeInfo(), new object[0]);
})
.Verifiable();
provider2.Setup(p => p.OnProvidersExecuting(It.IsAny<PageApplicationModelProviderContext>()))
.Callback((PageApplicationModelProviderContext c) =>
{
Assert.Equal(0, sequence++);
})
.Verifiable();
provider1.Setup(p => p.OnProvidersExecuted(It.IsAny<PageApplicationModelProviderContext>()))
.Callback((PageApplicationModelProviderContext c) =>
{
Assert.Equal(2, sequence++);
})
.Verifiable();
provider2.Setup(p => p.OnProvidersExecuted(It.IsAny<PageApplicationModelProviderContext>()))
.Callback((PageApplicationModelProviderContext c) =>
{
Assert.Equal(3, sequence++);
})
.Verifiable();
var providers = new[]
{
provider1.Object, provider2.Object
};
var loader = new DefaultPageLoader(
providers,
compilerProvider,
options);
// Act
var result = loader.Load(new PageActionDescriptor());
// Assert
provider1.Verify();
provider2.Verify();
}
[Fact]
public void Load_InvokesApplicationModelConventions()
{