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
//
services.TryAddSingleton<RazorProject, DefaultRazorProject>();
services.TryAddSingleton<RazorProject, FileProviderRazorProject>();
services.TryAddSingleton<RazorTemplateEngine, MvcRazorTemplateEngine>();
services.TryAddSingleton<RazorCompiler>();
services.TryAddSingleton<LazyMetadataReferenceFeature>();

View File

@ -9,18 +9,17 @@ using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
public class DefaultRazorProject : RazorProject
public class FileProviderRazorProject : RazorProject
{
private const string RazorFileExtension = ".cshtml";
private readonly IFileProvider _provider;
public DefaultRazorProject(IRazorViewEngineFileProviderAccessor accessor)
public FileProviderRazorProject(IRazorViewEngineFileProviderAccessor accessor)
: this(accessor.FileProvider)
{
}
// Internal for unit testing
internal DefaultRazorProject(IFileProvider provider)
public FileProviderRazorProject(IFileProvider provider)
{
_provider = provider;
}
@ -29,7 +28,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
path = NormalizeAndEnsureValidPath(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)
@ -56,7 +55,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
}
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
{
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;
BasePath = basePath;

View File

@ -48,10 +48,18 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
public void GetOrAdd_ReturnsFileNotFoundResult_IfFileIsNotFoundInFileSystem()
{
// 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 cache = new CompilerCache(fileProvider);
var compilerCacheContext = new CompilerCacheContext(
new NotFoundProjectItem("", "/path"),
item.Object,
Enumerable.Empty<RazorProjectItem>(),
_ => throw new Exception("Shouldn't be called."));
@ -113,10 +121,20 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
// Arrange
var fileProvider = new TestFileProvider();
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 expected = new CompilationResult(typeof(TestView));
var projectItem = new DefaultRazorProjectItem(fileInfo, "", ViewPath);
var cacheContext = new CompilerCacheContext(projectItem, Enumerable.Empty<RazorProjectItem>(), _ => expected);
var cacheContext = new CompilerCacheContext(foundItem, Enumerable.Empty<RazorProjectItem>(), _ => expected);
// Act 1
var result1 = cache.GetOrAdd(ViewPath, _ => cacheContext);
@ -419,7 +437,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
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);
});
});
@ -429,7 +447,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
// Event 4
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);
});
});
@ -472,7 +490,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
{
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);
});
});
@ -607,7 +625,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
private CompilerCacheContext ThrowsIfCalled(string path, Exception exception)
{
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(
projectItem,
@ -622,12 +640,12 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
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>();
foreach (var importFilePath in _viewImportsPath)
{
var importProjectItem = new DefaultRazorProjectItem(new TestFileInfo(), "", importFilePath);
var importProjectItem = new FileProviderRazorProjectItem(new TestFileInfo(), "", importFilePath);
imports.Add(importProjectItem);
}

View File

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

View File

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

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var razorEngine = RazorEngine.Create();
var fileProvider = new TestFileProvider();
fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">");
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler(
@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var fileProvider = new TestFileProvider();
var file = fileProvider.AddFile(viewPath, "<span name=\"@(User.Id\">");
file.PhysicalPath = physicalPath;
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler(
@ -90,7 +90,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var razorEngine = RazorEngine.Create();
var fileProvider = new TestFileProvider();
fileProvider.AddFile(viewPath, fileContent);
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject);
var compiler = new RazorCompiler(
@ -122,7 +122,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
fileProvider.AddFile(viewPath, fileContent);
var importsFile = fileProvider.AddFile("/Views/_MyImports.cshtml", importsContent);
importsFile.PhysicalPath = importsFilePath;
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
var templateEngine = new MvcRazorTemplateEngine(razorEngine, razorProject)
{
@ -186,7 +186,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Internal
var compiler = new RazorCompiler(
Mock.Of<ICompilationService>(),
GetCompilerCacheProvider(fileProvider),
new MvcRazorTemplateEngine(RazorEngine.Create(), new DefaultRazorProject(fileProvider)));
new MvcRazorTemplateEngine(RazorEngine.Create(), new FileProviderRazorProject(fileProvider)));
// Act
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]));
var fileProvider = new TestFileProvider();
var razorProject = new DefaultRazorProject(fileProvider);
var razorProject = new FileProviderRazorProject(fileProvider);
var viewEngine = CreateViewEngine(pageFactory.Object, razorProject: razorProject);
var context = GetActionContext(_controllerTestContext);
@ -1349,7 +1349,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
Mock.Of<IRazorPageActivator>(),
new HtmlTestEncoder(),
GetOptionsAccessor(expanders: null),
new DefaultRazorProject(new TestFileProvider()),
new FileProviderRazorProject(new TestFileProvider()),
loggerFactory);
// Act
@ -1772,7 +1772,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
pageFactory = pageFactory ?? Mock.Of<IRazorPageFactoryProvider>();
if (razorProject == null)
{
razorProject = new DefaultRazorProject(new TestFileProvider());
razorProject = new FileProviderRazorProject(new TestFileProvider());
}
return new TestableRazorViewEngine(pageFactory, GetOptionsAccessor(expanders), razorProject);
}
@ -1873,7 +1873,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Test
public TestableRazorViewEngine(
IRazorPageFactoryProvider pageFactory,
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,
};
return new DefaultRazorProjectItem(testFileInfo, basePath, path);
return new FileProviderRazorProjectItem(testFileInfo, basePath, path);
}
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.Validation;
using Microsoft.AspNetCore.Mvc.Razor;
using Microsoft.AspNetCore.Mvc.Razor.Internal;
using Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
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("/_ViewStart.cshtml", "content2");
var defaultRazorProject = new TestRazorProject(fileProvider);
var defaultRazorProject = new FileProviderRazorProject(fileProvider);
var invokerProvider = CreateInvokerProvider(
loader.Object,

View File

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

View File

@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Razor.Language;
namespace RazorPageExecutionInstrumentationWebSite
{
public class TestRazorProject : DefaultRazorProject
public class TestRazorProject : FileProviderRazorProject
{
public TestRazorProject(IRazorViewEngineFileProviderAccessor fileProviderAccessor)
: base(fileProviderAccessor)
@ -17,13 +17,13 @@ namespace RazorPageExecutionInstrumentationWebSite
public override RazorProjectItem GetItem(string path)
{
var item = (DefaultRazorProjectItem)base.GetItem(path);
var item = (FileProviderRazorProjectItem)base.GetItem(path);
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)
{
}