Ejemplo n.º 1
0
        public async Task ProcessAsync_RendersMainPartial_If_FallbackIsSet_AndMainPartialIsFound()
        {
            // Arrange
            var expected     = "Hello from partial!";
            var bufferScope  = new TestViewBufferScope();
            var partialName  = "_Partial";
            var fallbackName = "_Fallback";
            var model        = new object();
            var viewContext  = GetViewContext();

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                v.Writer.Write(expected);
            })
            .Returns(Task.CompletedTask);

            var fallbackView = new Mock <IView>();

            fallbackView.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                v.Writer.Write("Hello from fallback partial!");
            })
            .Returns(Task.CompletedTask);

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));
            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), fallbackName, false))
            .Returns(ViewEngineResult.Found(fallbackName, fallbackView.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name         = partialName,
                ViewContext  = viewContext,
                FallbackName = fallbackName
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            var content = HtmlContentUtilities.HtmlContentToString(output.Content, new HtmlTestEncoder());

            Assert.Equal(expected, content);
        }
Ejemplo n.º 2
0
        public async Task ProcessAsync_IfHasFallback_Throws_When_MainPartialAndFallback_AreNotFound()
        {
            // Arrange
            var bufferScope  = new TestViewBufferScope();
            var partialName  = "_Partial";
            var fallbackName = "_Fallback";
            var expected     = string.Join(
                Environment.NewLine,
                $"The partial view '{partialName}' was not found. The following locations were searched:",
                "PartialNotFound1",
                "PartialNotFound2",
                "PartialNotFound3",
                "PartialNotFound4",
                $"The fallback partial view '{fallbackName}' was not found. The following locations were searched:",
                "FallbackNotFound1",
                "FallbackNotFound2",
                "FallbackNotFound3",
                "FallbackNotFound4");
            var viewData    = new ViewDataDictionary(new TestModelMetadataProvider(), new ModelStateDictionary());
            var viewContext = GetViewContext();

            var view       = Mock.Of <IView>();
            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.NotFound(partialName, new[] { "PartialNotFound1", "PartialNotFound2" }));

            viewEngine.Setup(v => v.FindView(viewContext, partialName, false))
            .Returns(ViewEngineResult.NotFound(partialName, new[] { $"PartialNotFound3", $"PartialNotFound4" }));

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), fallbackName, false))
            .Returns(ViewEngineResult.NotFound(partialName, new[] { "FallbackNotFound1", "FallbackNotFound2" }));

            viewEngine.Setup(v => v.FindView(viewContext, fallbackName, false))
            .Returns(ViewEngineResult.NotFound(partialName, new[] { $"FallbackNotFound3", $"FallbackNotFound4" }));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name         = partialName,
                ViewContext  = viewContext,
                ViewData     = viewData,
                FallbackName = fallbackName
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act & Assert
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(
                () => tagHelper.ProcessAsync(tagHelperContext, output));

            Assert.Equal(expected, exception.Message);
        }
Ejemplo n.º 3
0
        public async Task ProcessAsync_SetsHtmlFieldPrefix_UsingModelExpression()
        {
            // Arrange
            var expected              = "order.items[0].Property";
            var bufferScope           = new TestViewBufferScope();
            var partialName           = "_Partial";
            var modelMetadataProvider = new TestModelMetadataProvider();
            var containerModel        = new TestModel {
                Property = new PropertyModel()
            };
            var containerModelExplorer = modelMetadataProvider.GetModelExplorerForType(
                typeof(TestModel),
                containerModel);
            var propertyModelExplorer = containerModelExplorer.GetExplorerForProperty(nameof(TestModel.Property));

            var modelExpression = new ModelExpression("Property", propertyModelExplorer);
            var viewContext     = GetViewContext();

            viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "order.items[0]";

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                Assert.Equal(expected, v.ViewData.TemplateInfo.HtmlFieldPrefix);
            })
            .Returns(Task.CompletedTask)
            .Verifiable();

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
                For         = modelExpression,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            view.Verify();
            Assert.Equal("order.items[0]", viewContext.ViewData.TemplateInfo.HtmlFieldPrefix);
        }
Ejemplo n.º 4
0
        public async Task ProcessAsync_UsesModelExpression_ToDetermineModel()
        {
            // Arrange
            var expected              = new PropertyModel();
            var bufferScope           = new TestViewBufferScope();
            var partialName           = "_Partial";
            var modelMetadataProvider = new TestModelMetadataProvider();
            var containerModel        = new TestModel {
                Property = expected
            };
            var containerModelExplorer = modelMetadataProvider.GetModelExplorerForType(
                typeof(TestModel),
                containerModel);
            var propertyModelExplorer = containerModelExplorer.GetExplorerForProperty(nameof(TestModel.Property));

            var modelExpression = new ModelExpression("Property", propertyModelExplorer);
            var viewContext     = GetViewContext();

            viewContext.ViewData.Model = new object();

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                var actual = Assert.IsType <PropertyModel>(v.ViewData.Model);
                Assert.Same(expected, actual);
            })
            .Returns(Task.CompletedTask)
            .Verifiable();

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
                For         = modelExpression,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            view.Verify();
        }
Ejemplo n.º 5
0
        public async Task ProcessAsync_UsesPassedInViewData_WhenNotNull()
        {
            // Arrange
            var expected    = "Explicit";
            var bufferScope = new TestViewBufferScope();
            var partialName = "_Partial";
            var model       = new object();
            var viewData    = new ViewDataDictionary(new TestModelMetadataProvider(), new ModelStateDictionary());

            viewData["key"] = expected;
            var viewContext = GetViewContext();

            viewContext.ViewData["key"] = "ViewContext";

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                v.Writer.Write(v.ViewData["key"]);
            })
            .Returns(Task.CompletedTask);

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
                ViewData    = viewData,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            var content = HtmlContentUtilities.HtmlContentToString(output.Content, new HtmlTestEncoder());

            Assert.Equal(expected, content);
        }
Ejemplo n.º 6
0
        public async Task ProcessAsync_UsesViewDataFromContext()
        {
            // Arrange
            var expected    = "Implicit";
            var bufferScope = new TestViewBufferScope();
            var partialName = "_Partial";
            var viewContext = GetViewContext();

            viewContext.ViewData["key"] = expected;

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                v.Writer.Write(v.ViewData["key"]);
            })
            .Returns(Task.CompletedTask);

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.NotFound(partialName, new[] { partialName }));

            viewEngine.Setup(v => v.FindView(viewContext, partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            var content = HtmlContentUtilities.HtmlContentToString(output.Content, new HtmlTestEncoder());

            Assert.Equal(expected, content);
        }
Ejemplo n.º 7
0
        public async Task ProcessAsync_IfOptional_And_ViewIsNotFound_WillNotRenderAnything()
        {
            // Arrange
            var expected    = string.Empty;
            var bufferScope = new TestViewBufferScope();
            var partialName = "_ThisViewDoesNotExists";
            var model       = new object();
            var viewContext = GetViewContext();

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                v.Writer.Write(expected);
            })
            .Returns(Task.CompletedTask);

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.NotFound(partialName, searchedLocations: Array.Empty <string>()));
            viewEngine.Setup(v => v.FindView(viewContext, partialName, false))
            .Returns(ViewEngineResult.NotFound(partialName, searchedLocations: Array.Empty <string>()));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
                Optional    = true
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            var content = HtmlContentUtilities.HtmlContentToString(output.Content, new HtmlTestEncoder());

            Assert.Empty(content);
        }
Ejemplo n.º 8
0
        public async Task ProcessAsync_DoesNotModifyHtmlFieldPrefix_WhenModelExpressionIsNull()
        {
            // Arrange
            var expected    = "original";
            var bufferScope = new TestViewBufferScope();
            var partialName = "_Partial";
            var model       = new object();
            var viewContext = GetViewContext();

            viewContext.ViewData.Model = model;
            viewContext.ViewData.TemplateInfo.HtmlFieldPrefix = expected;

            var view = new Mock <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Callback((ViewContext v) =>
            {
                Assert.Equal(expected, v.ViewData.TemplateInfo.HtmlFieldPrefix);
            })
            .Returns(Task.CompletedTask)
            .Verifiable();

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            view.Verify();
        }
Ejemplo n.º 9
0
        public async Task ProcessAsync_DisposesViewInstance()
        {
            // Arrange
            var bufferScope = new TestViewBufferScope();
            var partialName = "_Partial";
            var viewContext = GetViewContext();

            var disposable = new Mock <IDisposable>();

            disposable.Setup(d => d.Dispose()).Verifiable();
            var view = disposable.As <IView>();

            view.Setup(v => v.RenderAsync(It.IsAny <ViewContext>()))
            .Returns(Task.CompletedTask)
            .Verifiable();

            var viewEngine = new Mock <ICompositeViewEngine>();

            viewEngine.Setup(v => v.GetView(It.IsAny <string>(), partialName, false))
            .Returns(ViewEngineResult.Found(partialName, view.Object));

            var tagHelper = new PartialTagHelper(viewEngine.Object, bufferScope)
            {
                Name        = partialName,
                ViewContext = viewContext,
            };
            var tagHelperContext = GetTagHelperContext();
            var output           = GetTagHelperOutput();

            // Act
            await tagHelper.ProcessAsync(tagHelperContext, output);

            // Assert
            disposable.Verify();
            view.Verify();
        }