public void GetChangeToken_WatchesFilesUnderAreaRoot() { // Arrange var fileProvider = new Mock <IFileProvider>(); fileProvider.Setup(f => f.Watch(It.IsAny <string>())) .Returns(Mock.Of <IChangeToken>()); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider.Object); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var templateEngine = new RazorTemplateEngine( RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine, fileSystem); var options = Options.Create(new RazorPagesOptions { AllowAreas = true }); var razorViewEngineOptions = Options.Create(new RazorViewEngineOptions { AllowRecompilingViewsOnFileChange = true }); var changeProvider = new PageActionDescriptorChangeProvider(templateEngine, accessor, options, razorViewEngineOptions); // Act var changeToken = changeProvider.GetChangeToken(); // Assert fileProvider.Verify(f => f.Watch("/Areas/**/*.cshtml")); }
public void GetChangeToken_WatchesViewImportsOutsidePagesRoot_WhenAreaFeatureIsDisabled() { // Arrange var fileProvider = new TestFileProvider(); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var templateEngine = new RazorTemplateEngine( RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine, fileSystem); templateEngine.Options.ImportsFileName = "_ViewImports.cshtml"; var options = Options.Create(new RazorPagesOptions { AllowAreas = false }); var razorViewEngineOptions = Options.Create(new RazorViewEngineOptions { AllowRecompilingViewsOnFileChange = true }); var changeProvider = new PageActionDescriptorChangeProvider(templateEngine, accessor, options, razorViewEngineOptions); // Act & Assert var compositeChangeToken = Assert.IsType <CompositeChangeToken>(changeProvider.GetChangeToken()); Assert.Collection(compositeChangeToken.ChangeTokens, changeToken => Assert.Same(fileProvider.GetChangeToken("/_ViewImports.cshtml"), changeToken), changeToken => Assert.Same(fileProvider.GetChangeToken("/Pages/**/*.cshtml"), changeToken)); }
private static TestRazorViewCompiler GetViewCompiler( TestFileProvider fileProvider = null, RazorReferenceManager referenceManager = null, IList <CompiledViewDescriptor> precompiledViews = null, CSharpCompiler csharpCompiler = null) { fileProvider = fileProvider ?? new TestFileProvider(); var options = Options.Create(new MvcRazorRuntimeCompilationOptions { FileProviders = { fileProvider } }); var compilationFileProvider = new RuntimeCompilationFileProvider(options); referenceManager = referenceManager ?? CreateReferenceManager(); precompiledViews = precompiledViews ?? Array.Empty <CompiledViewDescriptor>(); var hostingEnvironment = Mock.Of <IWebHostEnvironment>(e => e.ContentRootPath == "BasePath"); var fileSystem = new FileProviderRazorProjectFileSystem(compilationFileProvider, hostingEnvironment); var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder => { RazorExtensions.Register(builder); }); csharpCompiler = csharpCompiler ?? new CSharpCompiler(referenceManager, hostingEnvironment); return(new TestRazorViewCompiler( fileProvider, projectEngine, csharpCompiler, precompiledViews)); }
public void GetChangeToken_WatchesViewImportsOutsidePagesRoot_WhenPagesRootIsNested() { // Arrange var fileProvider = new TestFileProvider(); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var templateEngine = new RazorTemplateEngine( RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine, fileSystem); templateEngine.Options.ImportsFileName = "_ViewImports.cshtml"; var options = Options.Create(new RazorPagesOptions()); options.Value.RootDirectory = "/dir1/dir2"; var changeProvider = new PageActionDescriptorChangeProvider(templateEngine, accessor, options); // Act & Assert var compositeChangeToken = Assert.IsType <CompositeChangeToken>(changeProvider.GetChangeToken()); Assert.Collection(compositeChangeToken.ChangeTokens, changeToken => Assert.Same(fileProvider.GetChangeToken("/dir1/_ViewImports.cshtml"), changeToken), changeToken => Assert.Same(fileProvider.GetChangeToken("/_ViewImports.cshtml"), changeToken), changeToken => Assert.Same(fileProvider.GetChangeToken("/dir1/dir2/**/*.cshtml"), changeToken)); }
public void GetChangeToken_WatchesAllCshtmlFilesUnderSpecifiedRootDirectory(string rootDirectory) { // Arrange var fileProvider = new Mock <IFileProvider>(); fileProvider.Setup(f => f.Watch(It.IsAny <string>())) .Returns(Mock.Of <IChangeToken>()); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider.Object); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var templateEngine = new RazorTemplateEngine( RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine, fileSystem); var options = Options.Create(new RazorPagesOptions()); options.Value.RootDirectory = rootDirectory; var changeProvider = new PageActionDescriptorChangeProvider(templateEngine, accessor, options); // Act var changeToken = changeProvider.GetChangeToken(); // Assert fileProvider.Verify(f => f.Watch("/pages-base-dir/**/*.cshtml")); }
public void OnProvidersExecuting_CachesViewStartFactories() { // Arrange var descriptor = new PageActionDescriptor { RelativePath = "/Home/Path1/File.cshtml", ViewEnginePath = "/Home/Path1/File.cshtml", FilterDescriptors = new FilterDescriptor[0], }; var loader = new Mock <IPageLoader>(); loader .Setup(l => l.Load(It.IsAny <PageActionDescriptor>())) .Returns(CreateCompiledPageActionDescriptor(descriptor, pageType: typeof(PageWithModel))); var razorPageFactoryProvider = new Mock <IRazorPageFactoryProvider>(); Func <IRazorPage> factory1 = () => null; Func <IRazorPage> factory2 = () => null; razorPageFactoryProvider .Setup(f => f.CreateFactory("/Home/Path1/_ViewStart.cshtml")) .Returns(new RazorPageFactoryResult(new CompiledViewDescriptor(), factory1)); razorPageFactoryProvider .Setup(f => f.CreateFactory("/_ViewStart.cshtml")) .Returns(new RazorPageFactoryResult(new CompiledViewDescriptor(), factory2)); var fileProvider = new TestFileProvider(); fileProvider.AddFile("/Home/Path1/_ViewStart.cshtml", "content1"); fileProvider.AddFile("/_ViewStart.cshtml", "content2"); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider); var defaultFileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var invokerProvider = CreateInvokerProvider( loader.Object, CreateActionDescriptorCollection(descriptor), razorPageFactoryProvider: razorPageFactoryProvider.Object, fileSystem: defaultFileSystem); var context = new ActionInvokerProviderContext(new ActionContext() { ActionDescriptor = descriptor, HttpContext = new DefaultHttpContext(), RouteData = new RouteData(), }); // Act invokerProvider.OnProvidersExecuting(context); // Assert Assert.NotNull(context.Result); var actionInvoker = Assert.IsType <PageActionInvoker>(context.Result); var entry = actionInvoker.CacheEntry; Assert.Equal(new[] { factory2, factory1 }, entry.ViewStartFactories); }
private static FileProviderRazorProjectFileSystem GetRazorProjectFileSystem( TestFileProvider fileProvider, string contentRootPath = "BasePath") { var options = Options.Create(new MvcRazorRuntimeCompilationOptions { FileProviders = { fileProvider } }); var compilationFileProvider = new RuntimeCompilationFileProvider(options); var fileSystem = new FileProviderRazorProjectFileSystem( compilationFileProvider, Mock.Of <IWebHostEnvironment>(e => e.ContentRootPath == contentRootPath)); return(fileSystem); }
private static TestRazorViewCompiler GetViewCompiler( TestFileProvider fileProvider = null, Action <RoslynCompilationContext> compilationCallback = null, #pragma warning disable CS0618 // Type or member is obsolete RazorReferenceManager referenceManager = null, #pragma warning restore CS0618 // Type or member is obsolete IList <CompiledViewDescriptor> precompiledViews = null, CSharpCompiler csharpCompiler = null) { fileProvider = fileProvider ?? new TestFileProvider(); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider); compilationCallback = compilationCallback ?? (_ => { }); var options = Options.Create(new RazorViewEngineOptions()); if (referenceManager == null) { referenceManager = CreateReferenceManager(options); } precompiledViews = precompiledViews ?? Array.Empty <CompiledViewDescriptor>(); var hostingEnvironment = Mock.Of <IHostingEnvironment>(e => e.ContentRootPath == "BasePath"); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, hostingEnvironment); var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem, builder => { RazorExtensions.Register(builder); }); csharpCompiler = csharpCompiler ?? new CSharpCompiler(referenceManager, hostingEnvironment); var viewCompiler = new TestRazorViewCompiler( fileProvider, projectEngine, csharpCompiler, compilationCallback, precompiledViews); return(viewCompiler); }
private TestCompiledPageRouteModelProvider CreateProvider( RazorPagesOptions options = null, IList <CompiledViewDescriptor> descriptors = null, TestFileProvider fileProvider = null) { options = options ?? new RazorPagesOptions(); fileProvider = fileProvider ?? new TestFileProvider(); var fileSystem = new FileProviderRazorProjectFileSystem( Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider), Mock.Of <IHostingEnvironment>(e => e.ContentRootPath == "BasePath")); var projectEngine = RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem); var provider = new TestCompiledPageRouteModelProvider( new ApplicationPartManager(), Options.Create(options), projectEngine, NullLogger <CompiledPageRouteModelProvider> .Instance); provider.Descriptors.AddRange(descriptors ?? Array.Empty <CompiledViewDescriptor>()); return(provider); }
public void GetChangeToken_DoesNotWatch_WhenOptionIsReset() { // Arrange var fileProvider = new Mock <IFileProvider>(MockBehavior.Strict); var accessor = Mock.Of <IRazorViewEngineFileProviderAccessor>(a => a.FileProvider == fileProvider.Object); var fileSystem = new FileProviderRazorProjectFileSystem(accessor, _hostingEnvironment); var templateEngine = new RazorTemplateEngine( RazorProjectEngine.Create(RazorConfiguration.Default, fileSystem).Engine, fileSystem); templateEngine.Options.ImportsFileName = "_ViewImports.cshtml"; var options = Options.Create(new RazorPagesOptions()); var razorViewEngineOptions = Options.Create(new RazorViewEngineOptions()); var changeProvider = new PageActionDescriptorChangeProvider(templateEngine, accessor, options, razorViewEngineOptions); // Act & Assert var compositeChangeToken = Assert.IsType <NullChangeToken>(changeProvider.GetChangeToken()); fileProvider.Verify(f => f.Watch(It.IsAny <string>()), Times.Never()); }