Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

251 lines
11 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.WebPages;
using Moq;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class RazorViewTest
{
[Fact]
public void Constructor_RunViewStartPagesParam()
{
var context = new ControllerContext();
Assert.True(new RazorView(context, "~/view", "~/master", runViewStartPages: true, viewStartFileExtensions: null).RunViewStartPages);
Assert.False(new RazorView(context, "~/view", "~/master", runViewStartPages: false, viewStartFileExtensions: null).RunViewStartPages);
Assert.True(new RazorView(context, "~/view", "~/master", runViewStartPages: true, viewStartFileExtensions: null, viewPageActivator: new Mock<IViewPageActivator>().Object).RunViewStartPages);
Assert.False(new RazorView(context, "~/view", "~/master", runViewStartPages: false, viewStartFileExtensions: null, viewPageActivator: new Mock<IViewPageActivator>().Object).RunViewStartPages);
}
[Fact]
public void ConstructorWithEmptyViewPathThrows()
{
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => new RazorView(new ControllerContext(), String.Empty, "~/master", false, Enumerable.Empty<string>()),
"viewPath"
);
}
[Fact]
public void ConstructorWithNullViewPathThrows()
{
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
() => new RazorView(new ControllerContext(), null, "~/master", false, Enumerable.Empty<string>()),
"viewPath"
);
}
[Fact]
public void ConstructorWithNullControllerContextThrows()
{
// Act & Assert
Assert.ThrowsArgumentNull(
() => new RazorView(null, "view path", "~/master", false, Enumerable.Empty<string>()),
"controllerContext"
);
}
[Fact]
public void LayoutPathProperty()
{
//Arrange
ControllerContext controllerContext = new ControllerContext();
// Act
RazorView view = new RazorView(new ControllerContext(), "view path", "master path", false, Enumerable.Empty<string>());
// Assert
Assert.Equal("master path", view.LayoutPath);
}
[Fact]
public void LayoutPathPropertyReturnsEmptyStringIfNullLayoutSpecified()
{
// Act
RazorView view = new RazorView(new ControllerContext(), "view path", null, false, Enumerable.Empty<string>());
// Assert
Assert.Equal(String.Empty, view.LayoutPath);
}
[Fact]
public void LayoutPathPropertyReturnsEmptyStringIfLayoutNotSpecified()
{
// Act
RazorView view = new RazorView(new ControllerContext(), "view path", null, false, Enumerable.Empty<string>());
// Assert
Assert.Equal(String.Empty, view.LayoutPath);
}
[Fact]
public void RenderWithNullWriterThrows()
{
// Arrange
RazorView view = new RazorView(new ControllerContext(), "~/viewPath", null, false, Enumerable.Empty<string>());
Mock<ViewContext> viewContextMock = new Mock<ViewContext>();
MockBuildManager buildManager = new MockBuildManager("~/viewPath", typeof(object));
view.BuildManager = buildManager;
// Act & Assert
Assert.ThrowsArgumentNull(
() => view.Render(viewContextMock.Object, null),
"writer"
);
}
[Fact]
public void RenderWithUnsupportedTypeThrows()
{
// Arrange
ViewContext context = new Mock<ViewContext>().Object;
MockBuildManager buildManagerMock = new MockBuildManager("view path", typeof(object));
RazorView view = new RazorView(new ControllerContext(), "view path", null, false, Enumerable.Empty<string>());
view.BuildManager = buildManagerMock;
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => view.Render(context, new Mock<TextWriter>().Object),
"The view at 'view path' must derive from WebViewPage, or WebViewPage<TModel>."
);
}
[Fact]
public void RenderWithViewPageAndNoStartPageLookupRendersView()
{
// Arrange
StubWebViewPage viewPage = new StubWebViewPage();
Mock<ViewContext> viewContextMock = new Mock<ViewContext>();
viewContextMock.Setup(vc => vc.HttpContext.Items).Returns(new Dictionary<object, object>());
viewContextMock.Setup(vc => vc.HttpContext.Request.IsLocal).Returns(false);
MockBuildManager buildManager = new MockBuildManager("~/viewPath", typeof(object));
Mock<IViewPageActivator> activator = new Mock<IViewPageActivator>(MockBehavior.Strict);
ControllerContext controllerContext = new ControllerContext();
activator.Setup(l => l.Create(controllerContext, typeof(object))).Returns(viewPage);
RazorView view = new RazorView(controllerContext, "~/viewPath", null, false, Enumerable.Empty<string>(), activator.Object);
view.StartPageLookup = (WebPageRenderingBase p, string n, IEnumerable<string> e) =>
{
Assert.True(false, "ViewStart page lookup should not be called");
return null;
};
view.BuildManager = buildManager;
// Act
view.Render(viewContextMock.Object, new Mock<TextWriter>().Object);
// Assert
Assert.Null(viewPage.Layout);
Assert.Equal("", viewPage.OverridenLayoutPath);
Assert.Same(viewContextMock.Object, viewPage.ViewContext);
Assert.Equal("~/viewPath", viewPage.VirtualPath);
}
[Fact]
public void RenderWithViewPageAndStartPageLookupExecutesStartPage()
{
// Arrange
StubWebViewPage viewPage = new StubWebViewPage();
Mock<ViewContext> viewContextMock = new Mock<ViewContext>();
viewContextMock.Setup(vc => vc.HttpContext.Items).Returns(new Dictionary<object, object>());
MockBuildManager buildManager = new MockBuildManager("~/viewPath", typeof(object));
Mock<IViewPageActivator> activator = new Mock<IViewPageActivator>(MockBehavior.Strict);
ControllerContext controllerContext = new ControllerContext();
activator.Setup(l => l.Create(controllerContext, typeof(object))).Returns(viewPage);
RazorView view = new RazorView(controllerContext, "~/viewPath", null, true, new[] { "cshtml" }, activator.Object);
Mock<ViewStartPage> startPage = new Mock<ViewStartPage>();
startPage.Setup(sp => sp.ExecutePageHierarchy()).Verifiable();
view.StartPageLookup = (WebPageRenderingBase page, string fileName, IEnumerable<string> extensions) =>
{
Assert.Equal(viewPage, page);
Assert.Equal("_ViewStart", fileName);
Assert.Equal(new[] { "cshtml" }, extensions.ToArray());
return startPage.Object;
};
view.BuildManager = buildManager;
// Act
view.Render(viewContextMock.Object, new Mock<TextWriter>().Object);
// Assert
startPage.Verify(sp => sp.ExecutePageHierarchy(), Times.Once());
}
// TODO: This throws in WebPages and needs to be tracked down.
[Fact]
public void RenderWithViewPageAndLayoutPageRendersView()
{
// Arrange
StubWebViewPage viewPage = new StubWebViewPage();
Mock<ViewContext> viewContext = new Mock<ViewContext>();
Mock<HttpContextBase> httpContext = new Mock<HttpContextBase>();
Mock<HttpRequestBase> httpRequest = new Mock<HttpRequestBase>();
httpRequest.SetupGet(r => r.IsLocal).Returns(false);
httpRequest.SetupGet(r => r.Browser.IsMobileDevice).Returns(false);
httpRequest.SetupGet(r => r.Cookies).Returns(new HttpCookieCollection());
httpContext.SetupGet(c => c.Request).Returns(httpRequest.Object);
httpContext.SetupGet(c => c.Response.Cookies).Returns(new HttpCookieCollection());
httpContext.SetupGet(c => c.Items).Returns(new Hashtable());
viewContext.SetupGet(v => v.HttpContext).Returns(httpContext.Object);
MockBuildManager buildManager = new MockBuildManager("~/viewPath", typeof(object));
Mock<IViewPageActivator> activator = new Mock<IViewPageActivator>(MockBehavior.Strict);
Mock<WebPage> layoutPage = new Mock<WebPage> { CallBase = true };
layoutPage.Setup(c => c.Execute()).Callback(() => layoutPage.Object.RenderBody());
Mock<IVirtualPathFactory> virtualPathFactory = new Mock<IVirtualPathFactory>(MockBehavior.Strict);
virtualPathFactory.Setup(f => f.Exists("~/layoutPath")).Returns(true);
virtualPathFactory.Setup(f => f.CreateInstance("~/layoutPath")).Returns(layoutPage.Object);
ControllerContext controllerContext = new ControllerContext();
activator.Setup(l => l.Create(controllerContext, typeof(object))).Returns(viewPage);
RazorView view = new RazorView(controllerContext, "~/viewPath", "~/layoutPath", false, Enumerable.Empty<string>(), activator.Object);
view.BuildManager = buildManager;
view.VirtualPathFactory = virtualPathFactory.Object;
view.DisplayModeProvider = DisplayModeProvider.Instance;
// Act
view.Render(viewContext.Object, TextWriter.Null);
// Assert
Assert.Equal("~/layoutPath", viewPage.Layout);
Assert.Equal("~/layoutPath", viewPage.OverridenLayoutPath);
Assert.Same(viewContext.Object, viewPage.ViewContext);
Assert.Equal("~/viewPath", viewPage.VirtualPath);
}
public class StubWebViewPage : WebViewPage
{
public bool InitHelpersCalled;
public string ResultLayoutPage;
public string ResultOverridenLayoutPath;
public ViewContext ResultViewContext;
public string ResultVirtualPath;
public override void Execute()
{
ResultLayoutPage = Layout;
ResultOverridenLayoutPath = OverridenLayoutPath;
ResultViewContext = ViewContext;
ResultVirtualPath = VirtualPath;
}
public override void InitHelpers()
{
base.InitHelpers();
InitHelpersCalled = true;
}
}
}
}