Remove usage of NotFoundProjectItem

We're making this type internal in Razor, using a mock here is fine.

Also renamed some types with a generic name. The actual 'default'
RazorProject class lives in Razor and is internal.
This commit is contained in:
Ryan Nowak 2017-05-12 14:07:19 -07:00
parent 8f52507e9d
commit b2d95ffb21
12 changed files with 60 additions and 40 deletions

View File

@ -158,7 +158,7 @@ namespace Microsoft.Extensions.DependencyInjection
// //
// Razor compilation infrastructure // Razor compilation infrastructure
// //
services.TryAddSingleton<RazorProject, DefaultRazorProject>(); services.TryAddSingleton<RazorProject, FileProviderRazorProject>();
services.TryAddSingleton<RazorTemplateEngine, MvcRazorTemplateEngine>(); services.TryAddSingleton<RazorTemplateEngine, MvcRazorTemplateEngine>();
services.TryAddSingleton<RazorCompiler>(); services.TryAddSingleton<RazorCompiler>();
services.TryAddSingleton<LazyMetadataReferenceFeature>(); services.TryAddSingleton<LazyMetadataReferenceFeature>();

View File

@ -9,18 +9,17 @@ using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Mvc.Razor.Internal namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
public class DefaultRazorProject : RazorProject public class FileProviderRazorProject : RazorProject
{ {
private const string RazorFileExtension = ".cshtml"; private const string RazorFileExtension = ".cshtml";
private readonly IFileProvider _provider; private readonly IFileProvider _provider;
public DefaultRazorProject(IRazorViewEngineFileProviderAccessor accessor) public FileProviderRazorProject(IRazorViewEngineFileProviderAccessor accessor)
: this(accessor.FileProvider) : this(accessor.FileProvider)
{ {
} }
// Internal for unit testing public FileProviderRazorProject(IFileProvider provider)
internal DefaultRazorProject(IFileProvider provider)
{ {
_provider = provider; _provider = provider;
} }
@ -29,7 +28,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
path = NormalizeAndEnsureValidPath(path); path = NormalizeAndEnsureValidPath(path);
var fileInfo = _provider.GetFileInfo(path); var fileInfo = _provider.GetFileInfo(path);
return new DefaultRazorProjectItem(fileInfo, basePath: string.Empty, path: path); return new FileProviderRazorProjectItem(fileInfo, basePath: string.Empty, path: path);
} }
public override IEnumerable<RazorProjectItem> EnumerateItems(string path) public override IEnumerable<RazorProjectItem> EnumerateItems(string path)
@ -56,7 +55,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
} }
else if (string.Equals(RazorFileExtension, Path.GetExtension(file.Name), StringComparison.OrdinalIgnoreCase)) else if (string.Equals(RazorFileExtension, Path.GetExtension(file.Name), StringComparison.OrdinalIgnoreCase))
{ {
yield return new DefaultRazorProjectItem(file, basePath, prefix + "/" + file.Name); yield return new FileProviderRazorProjectItem(file, basePath, prefix + "/" + file.Name);
} }
} }
} }

View File

@ -7,9 +7,9 @@ using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Mvc.Razor.Internal namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
public class DefaultRazorProjectItem : RazorProjectItem public class FileProviderRazorProjectItem : RazorProjectItem
{ {
public DefaultRazorProjectItem(IFileInfo fileInfo, string basePath, string path) public FileProviderRazorProjectItem(IFileInfo fileInfo, string basePath, string path)
{ {
FileInfo = fileInfo; FileInfo = fileInfo;
BasePath = basePath; BasePath = basePath;

View File

@ -48,10 +48,18 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
public void GetOrAdd_ReturnsFileNotFoundResult_IfFileIsNotFoundInFileSystem() public void GetOrAdd_ReturnsFileNotFoundResult_IfFileIsNotFoundInFileSystem()
{ {
// Arrange // Arrange
var item = new Mock<RazorProjectItem>();
item
.SetupGet(i => i.Path)
.Returns("/path");
item
.SetupGet(i => i.Exists)
.Returns(false);
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
var cache = new CompilerCache(fileProvider); var cache = new CompilerCache(fileProvider);
var compilerCacheContext = new CompilerCacheContext( var compilerCacheContext = new CompilerCacheContext(
new NotFoundProjectItem("", "/path"), item.Object,
Enumerable.Empty<RazorProjectItem>(), Enumerable.Empty<RazorProjectItem>(),
_ => throw new Exception("Shouldn't be called.")); _ => throw new Exception("Shouldn't be called."));
@ -113,10 +121,20 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
// Arrange // Arrange
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
var fileInfo = fileProvider.AddFile(ViewPath, "some content"); var fileInfo = fileProvider.AddFile(ViewPath, "some content");
var foundItem = new FileProviderRazorProjectItem(fileInfo, "", ViewPath);
var notFoundItem = new Mock<RazorProjectItem>();
notFoundItem
.SetupGet(i => i.Path)
.Returns(ViewPath);
notFoundItem
.SetupGet(i => i.Exists)
.Returns(false);
var cache = new CompilerCache(fileProvider); var cache = new CompilerCache(fileProvider);
var expected = new CompilationResult(typeof(TestView)); var expected = new CompilationResult(typeof(TestView));
var projectItem = new DefaultRazorProjectItem(fileInfo, "", ViewPath); var cacheContext = new CompilerCacheContext(foundItem, Enumerable.Empty<RazorProjectItem>(), _ => expected);
var cacheContext = new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), _ => expected);
// Act 1 // Act 1
var result1 = cache.GetOrAdd(ViewPath, _ => cacheContext); var result1 = cache.GetOrAdd(ViewPath, _ => cacheContext);
@ -419,7 +437,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
return cache.GetOrAdd("/Views/Home/Index.cshtml", path => return cache.GetOrAdd("/Views/Home/Index.cshtml", path =>
{ {
var projectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", path); var projectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", path);
return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile1); return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile1);
}); });
}); });
@ -429,7 +447,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
// Event 4 // Event 4
return cache.GetOrAdd("/Views/Home/About.cshtml", path => return cache.GetOrAdd("/Views/Home/About.cshtml", path =>
{ {
var projectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", path); var projectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", path);
return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile2); return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile2);
}); });
}); });
@ -472,7 +490,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
return cache.GetOrAdd(ViewPath, path => return cache.GetOrAdd(ViewPath, path =>
{ {
var projectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", path); var projectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", path);
return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile); return new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), compile);
}); });
}); });
@ -607,7 +625,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
private CompilerCacheContext ThrowsIfCalled(string path, Exception exception) private CompilerCacheContext ThrowsIfCalled(string path, Exception exception)
{ {
exception = exception ?? new Exception("Shouldn't be called"); exception = exception ?? new Exception("Shouldn't be called");
var projectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", path); var projectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", path);
return new CompilerCacheContext( return new CompilerCacheContext(
projectItem, projectItem,
@ -622,12 +640,12 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
private CompilerCacheContext CreateCacheContext(CompilationResult compile, string path = ViewPath) private CompilerCacheContext CreateCacheContext(CompilationResult compile, string path = ViewPath)
{ {
var projectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", path); var projectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", path);
var imports = new List<RazorProjectItem>(); var imports = new List<RazorProjectItem>();
foreach (var importFilePath in _viewImportsPath) foreach (var importFilePath in _viewImportsPath)
{ {
var importProjectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", importFilePath); var importProjectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", importFilePath);
imports.Add(importProjectItem); imports.Add(importProjectItem);
} }

View File

@ -95,7 +95,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
return new RazorCompiler( return new RazorCompiler(
Mock.Of<ICompilationService>(), Mock.Of<ICompilationService>(),
compilerCacheProvider.Object, compilerCacheProvider.Object,
new MvcRazorTemplateEngine(RazorEngine.Create(), new DefaultRazorProject(new TestFileProvider()))); new MvcRazorTemplateEngine(RazorEngine.Create(), new FileProviderRazorProject(new TestFileProvider())));
} }
private class TestRazorPage : RazorPage private class TestRazorPage : RazorPage

View File

@ -7,7 +7,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Mvc.Razor.Internal namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{ {
public class DefaultRazorProjectTest public class FileProviderRazorProjectTest
{ {
[Fact] [Fact]
public void EnumerateFiles_ReturnsEmptySequenceIfNoCshtmlFilesArePresent() public void EnumerateFiles_ReturnsEmptySequenceIfNoCshtmlFilesArePresent()
@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var file2 = fileProvider.AddFile("File2.js", "content"); var file2 = fileProvider.AddFile("File2.js", "content");
fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2 }); fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2 });
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
// Act // Act
var razorFiles = razorProject.EnumerateItems("/"); var razorFiles = razorProject.EnumerateItems("/");
@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var file3 = fileProvider.AddFile("File3.cshtml", "content"); var file3 = fileProvider.AddFile("File3.cshtml", "content");
fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2, file3 }); fileProvider.AddDirectoryContent("/", new IFileInfo[] { file1, file2, file3 });
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
// Act // Act
var razorFiles = razorProject.EnumerateItems("/"); var razorFiles = razorProject.EnumerateItems("/");
@ -75,7 +75,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var file5 = fileProvider.AddFile("Level1-Dir2/File5.cshtml", "content"); var file5 = fileProvider.AddFile("Level1-Dir2/File5.cshtml", "content");
fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 }); fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 });
fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]); fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]);
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
// Act // Act
var razorFiles = razorProject.EnumerateItems("/"); var razorFiles = razorProject.EnumerateItems("/");
@ -115,7 +116,8 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var file5 = fileProvider.AddFile("Level1-Dir2/File5.cshtml", "content"); var file5 = fileProvider.AddFile("Level1-Dir2/File5.cshtml", "content");
fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 }); fileProvider.AddDirectoryContent("/Level1-Dir2", new IFileInfo[] { file5 });
fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]); fileProvider.AddDirectoryContent("/Level1/Level2", new IFileInfo[0]);
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
// Act // Act
var razorFiles = razorProject.EnumerateItems("/Level1-Dir1"); var razorFiles = razorProject.EnumerateItems("/Level1-Dir1");

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var razorEngine = RazorEngine.Create(); var razorEngine = RazorEngine.Create();
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">"); fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">");
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject); var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler( var compiler = new RazorCompiler(
@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
var file = fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">"); var file = fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">");
file.PhysicalPath = physicalPath; file.PhysicalPath = physicalPath;
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject); var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler( var compiler = new RazorCompiler(
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var razorEngine = RazorEngine.Create(); var razorEngine = RazorEngine.Create();
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
fileProvider.AddFile(viewPath, fileContent); fileProvider.AddFile(viewPath, fileContent);
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject); var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler( var compiler = new RazorCompiler(
@ -122,7 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
fileProvider.AddFile(viewPath, fileContent); fileProvider.AddFile(viewPath, fileContent);
var importsFile = fileProvider.AddFile("/Views/_MyImports.cshtml", importsContent); var importsFile = fileProvider.AddFile("/Views/_MyImports.cshtml", importsContent);
importsFile.PhysicalPath = importsFilePath; importsFile.PhysicalPath = importsFilePath;
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject) var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject)
{ {
@ -186,7 +186,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var compiler = new RazorCompiler( var compiler = new RazorCompiler(
Mock.Of<ICompilationService>(), Mock.Of<ICompilationService>(),
GetCompilerCacheProvider(fileProvider), GetCompilerCacheProvider(fileProvider),
new MvcRazorTemplateEngine(RazorEngine.Create(), new DefaultRazorProject(fileProvider))); new MvcRazorTemplateEngine(RazorEngine.Create(), new FileProviderRazorProject(fileProvider)));
// Act // Act
var result = compiler.GetCompilationFailedResult(codeDocument, diagnostics); var result = compiler.GetCompilationFailedResult(codeDocument, diagnostics);

View File

@ -901,7 +901,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
.Returns(new RazorPageFactoryResult(() => viewStart, new IChangeToken[0])); .Returns(new RazorPageFactoryResult(() => viewStart, new IChangeToken[0]));
var fileProvider = new TestFileProvider(); var fileProvider = new TestFileProvider();
var razorProject = new DefaultRazorProject(fileProvider); var razorProject = new FileProviderRazorProject(fileProvider);
var viewEngine = CreateViewEngine(pageFactory.Object, razorProject: razorProject); var viewEngine = CreateViewEngine(pageFactory.Object, razorProject: razorProject);
var context = GetActionContext(_controllerTestContext); var context = GetActionContext(_controllerTestContext);
@ -1349,7 +1349,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
Mock.Of<IRazorPageActivator>(), Mock.Of<IRazorPageActivator>(),
new HtmlTestEncoder(), new HtmlTestEncoder(),
GetOptionsAccessor(expanders: null), GetOptionsAccessor(expanders: null),
new DefaultRazorProject(new TestFileProvider()), new FileProviderRazorProject(new TestFileProvider()),
loggerFactory); loggerFactory);
// Act // Act
@ -1772,7 +1772,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
pageFactory = pageFactory ?? Mock.Of<IRazorPageFactoryProvider>(); pageFactory = pageFactory ?? Mock.Of<IRazorPageFactoryProvider>();
if (razorProject == null) if (razorProject == null)
{ {
razorProject = new DefaultRazorProject(new TestFileProvider()); razorProject = new FileProviderRazorProject(new TestFileProvider());
} }
return new TestableRazorViewEngine(pageFactory, GetOptionsAccessor(expanders), razorProject); return new TestableRazorViewEngine(pageFactory, GetOptionsAccessor(expanders), razorProject);
} }
@ -1873,7 +1873,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
public TestableRazorViewEngine( public TestableRazorViewEngine(
IRazorPageFactoryProvider pageFactory, IRazorPageFactoryProvider pageFactory,
IOptions<RazorViewEngineOptions> optionsAccessor) IOptions<RazorViewEngineOptions> optionsAccessor)
: this(pageFactory, optionsAccessor, new DefaultRazorProject(new TestFileProvider())) : this(pageFactory, optionsAccessor, new FileProviderRazorProject(new TestFileProvider()))
{ {
} }

View File

@ -347,7 +347,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure
Content = content, Content = content,
}; };
return new DefaultRazorProjectItem(testFileInfo, basePath, path); return new FileProviderRazorProjectItem(testFileInfo, basePath, path);
} }
private class TestPageApplicationModelProvider : IPageApplicationModelProvider private class TestPageApplicationModelProvider : IPageApplicationModelProvider

View File

@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using Microsoft.AspNetCore.Mvc.Razor; using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Razor.Internal;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure; using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal; using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
@ -175,7 +176,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Internal
fileProvider.AddFile("/Home/Path1/_ViewStart.cshtml", "content1"); fileProvider.AddFile("/Home/Path1/_ViewStart.cshtml", "content1");
fileProvider.AddFile("/_ViewStart.cshtml", "content2"); fileProvider.AddFile("/_ViewStart.cshtml", "content2");
var defaultRazorProject = new TestRazorProject(fileProvider); var defaultRazorProject = new FileProviderRazorProject(fileProvider);
var invokerProvider = CreateInvokerProvider( var invokerProvider = CreateInvokerProvider(
loader.Object, loader.Object,

View File

@ -7,7 +7,7 @@ using Moq;
namespace Microsoft.AspNetCore.Mvc.RazorPages namespace Microsoft.AspNetCore.Mvc.RazorPages
{ {
public class TestRazorProject : DefaultRazorProject public class TestRazorProject : FileProviderRazorProject
{ {
public TestRazorProject(IFileProvider fileProvider) public TestRazorProject(IFileProvider fileProvider)
:base(GetAccessor(fileProvider)) :base(GetAccessor(fileProvider))

View File

@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Razor.Language;
namespace RazorPageExecutionInstrumentationWebSite namespace RazorPageExecutionInstrumentationWebSite
{ {
public class TestRazorProject : DefaultRazorProject public class TestRazorProject : FileProviderRazorProject
{ {
public TestRazorProject(IRazorViewEngineFileProviderAccessor fileProviderAccessor) public TestRazorProject(IRazorViewEngineFileProviderAccessor fileProviderAccessor)
: base(fileProviderAccessor) : base(fileProviderAccessor)
@ -17,13 +17,13 @@ namespace RazorPageExecutionInstrumentationWebSite
public override RazorProjectItem GetItem(string path) public override RazorProjectItem GetItem(string path)
{ {
var item = (DefaultRazorProjectItem)base.GetItem(path); var item = (FileProviderRazorProjectItem)base.GetItem(path);
return new TestRazorProjectItem(item); return new TestRazorProjectItem(item);
} }
private class TestRazorProjectItem : DefaultRazorProjectItem private class TestRazorProjectItem : FileProviderRazorProjectItem
{ {
public TestRazorProjectItem(DefaultRazorProjectItem projectItem) public TestRazorProjectItem(FileProviderRazorProjectItem projectItem)
: base(projectItem.FileInfo, projectItem.BasePath, projectItem.Path) : base(projectItem.FileInfo, projectItem.BasePath, projectItem.Path)
{ {
} }