public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) { var viewRenderer = new PartialTagHelper(_viewEngine, _viewBufferScope) { ViewContext = ViewContext, Model = null, Name = "Prose/_ProseHeader" }; return(viewRenderer.ProcessAsync(context, output)); }
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); }
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); }
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); }
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(); }
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); }
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); }
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); }
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(); }
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(); }