// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System; using System.Collections; using System.IO; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Moq; namespace Microsoft.Web.UnitTestUtil { public static class MvcHelper { public const string AppPathModifier = "/$(SESSION)"; public static HtmlHelper GetHtmlHelper() { HttpContextBase httpcontext = GetHttpContext("/app/", null, null); RouteCollection rt = new RouteCollection(); rt.Add(new Route("{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) }); rt.Add("namedroute", new Route("named/{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) }); RouteData rd = new RouteData(); rd.Values.Add("controller", "home"); rd.Values.Add("action", "oldaction"); ViewDataDictionary vdd = new ViewDataDictionary(); ViewContext viewContext = new ViewContext() { HttpContext = httpcontext, RouteData = rd, ViewData = vdd }; Mock mockVdc = new Mock(); mockVdc.Setup(vdc => vdc.ViewData).Returns(vdd); HtmlHelper htmlHelper = new HtmlHelper(viewContext, mockVdc.Object, rt); return htmlHelper; } public static HtmlHelper GetHtmlHelper(string protocol, int port) { HttpContextBase httpcontext = GetHttpContext("/app/", null, null, protocol, port); RouteCollection rt = new RouteCollection(); rt.Add(new Route("{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) }); rt.Add("namedroute", new Route("named/{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) }); RouteData rd = new RouteData(); rd.Values.Add("controller", "home"); rd.Values.Add("action", "oldaction"); ViewDataDictionary vdd = new ViewDataDictionary(); Mock mockViewContext = new Mock(); mockViewContext.Setup(c => c.HttpContext).Returns(httpcontext); mockViewContext.Setup(c => c.RouteData).Returns(rd); mockViewContext.Setup(c => c.ViewData).Returns(vdd); Mock mockVdc = new Mock(); mockVdc.Setup(vdc => vdc.ViewData).Returns(vdd); HtmlHelper htmlHelper = new HtmlHelper(mockViewContext.Object, mockVdc.Object, rt); return htmlHelper; } public static HtmlHelper GetHtmlHelper(ViewDataDictionary viewData) { Mock mockViewContext = new Mock() { CallBase = true }; mockViewContext.Setup(c => c.ViewData).Returns(viewData); mockViewContext.Setup(c => c.HttpContext.Items).Returns(new Hashtable()); IViewDataContainer container = GetViewDataContainer(viewData); return new HtmlHelper(mockViewContext.Object, container); } public static HtmlHelper GetHtmlHelper(ViewDataDictionary viewData) { Mock mockViewContext = new Mock() { CallBase = true }; mockViewContext.Setup(c => c.ViewData).Returns(viewData); mockViewContext.Setup(c => c.HttpContext.Items).Returns(new Hashtable()); IViewDataContainer container = GetViewDataContainer(viewData); return new HtmlHelper(mockViewContext.Object, container); } public static HtmlHelper GetHtmlHelperWithPath(ViewDataDictionary viewData) { return GetHtmlHelperWithPath(viewData, "/"); } public static HtmlHelper GetHtmlHelperWithPath(ViewDataDictionary viewData, string appPath) { ViewContext viewContext = GetViewContextWithPath(appPath, viewData); Mock mockContainer = new Mock(); mockContainer.Setup(c => c.ViewData).Returns(viewData); IViewDataContainer container = mockContainer.Object; return new HtmlHelper(viewContext, container, new RouteCollection()); } public static HtmlHelper GetHtmlHelperWithPath(ViewDataDictionary viewData, string appPath) { ViewContext viewContext = GetViewContextWithPath(appPath, viewData); Mock mockContainer = new Mock(); mockContainer.Setup(c => c.ViewData).Returns(viewData); IViewDataContainer container = mockContainer.Object; return new HtmlHelper(viewContext, container, new RouteCollection()); } public static HtmlHelper GetHtmlHelperWithPath(ViewDataDictionary viewData) { return GetHtmlHelperWithPath(viewData, "/"); } public static HttpContextBase GetHttpContext(string appPath, string requestPath, string httpMethod, string protocol, int port) { Mock mockHttpContext = new Mock(); if (!String.IsNullOrEmpty(appPath)) { mockHttpContext.Setup(o => o.Request.ApplicationPath).Returns(appPath); } if (!String.IsNullOrEmpty(requestPath)) { mockHttpContext.Setup(o => o.Request.AppRelativeCurrentExecutionFilePath).Returns(requestPath); } Uri uri; if (port >= 0) { uri = new Uri(protocol + "://localhost" + ":" + Convert.ToString(port)); } else { uri = new Uri(protocol + "://localhost"); } mockHttpContext.Setup(o => o.Request.Url).Returns(uri); mockHttpContext.Setup(o => o.Request.PathInfo).Returns(String.Empty); if (!String.IsNullOrEmpty(httpMethod)) { mockHttpContext.Setup(o => o.Request.HttpMethod).Returns(httpMethod); } mockHttpContext.Setup(o => o.Session).Returns((HttpSessionStateBase)null); mockHttpContext.Setup(o => o.Response.ApplyAppPathModifier(It.IsAny())).Returns(r => AppPathModifier + r); mockHttpContext.Setup(o => o.Items).Returns(new Hashtable()); return mockHttpContext.Object; } public static HttpContextBase GetHttpContext(string appPath, string requestPath, string httpMethod) { return GetHttpContext(appPath, requestPath, httpMethod, Uri.UriSchemeHttp.ToString(), -1); } public static ViewContext GetViewContextWithPath(string appPath, ViewDataDictionary viewData) { HttpContextBase httpContext = GetHttpContext(appPath, "/request", "GET"); Mock mockViewContext = new Mock() { DefaultValue = DefaultValue.Mock }; mockViewContext.Setup(c => c.HttpContext).Returns(httpContext); mockViewContext.Setup(c => c.ViewData).Returns(viewData); mockViewContext.Setup(c => c.Writer).Returns(new StringWriter()); return mockViewContext.Object; } public static ViewContext GetViewContextWithPath(ViewDataDictionary viewData) { return GetViewContextWithPath("/", viewData); } public static IViewDataContainer GetViewDataContainer(ViewDataDictionary viewData) { Mock mockContainer = new Mock(); mockContainer.Setup(c => c.ViewData).Returns(viewData); return mockContainer.Object; } } }