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));
        }
Пример #3
0
    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);
        }
Пример #7
0
    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);
    }
Пример #8
0
        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());
        }