From cd28240172de42d97e5900092969735827238c28 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Feb 2016 10:22:22 +0100 Subject: [PATCH 1/5] Moves strings to constants, adds ControllerContextExtensions to get the UmbracoContext from the hierarchy of ControllerContext's, changes RenderModelBinder to use this method to get the UmbracoContext, changes UmbracoViewPageOfTModel to use this method to get the UmbracoContext, adds RouteDataExtensions to get the UmbracoContext from routedata, adds extension methods on the HttpContext to get the UmbracoContext from it. Conflicts: src/Umbraco.Web/Mvc/RenderModelBinder.cs --- src/Umbraco.Core/Constants-Web.cs | 6 +++ .../Mvc/SurfaceControllerTests.cs | 2 +- src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs | 2 +- .../Macros/PartialViewMacroEngine.cs | 2 +- .../Mvc/AreaRegistrationExtensions.cs | 2 +- .../Mvc/ControllerContextExtensions.cs | 50 +++++++++++++++++++ src/Umbraco.Web/Mvc/ControllerExtensions.cs | 18 +------ src/Umbraco.Web/Mvc/RenderMvcController.cs | 4 +- src/Umbraco.Web/Mvc/RenderRouteHandler.cs | 10 ++-- src/Umbraco.Web/Mvc/RenderViewEngine.cs | 2 +- .../Mvc/RouteValueDictionaryExtensions.cs | 2 +- src/Umbraco.Web/Mvc/SurfaceController.cs | 4 +- .../Mvc/SurfaceControllerFactory.cs | 2 +- src/Umbraco.Web/Mvc/UmbracoPageResult.cs | 4 +- .../Mvc/UmbracoViewPageOfTModel.cs | 33 ++++-------- .../Mvc/UmbracoVirtualNodeRouteHandler.cs | 15 +++--- src/Umbraco.Web/RouteDataExtensions.cs | 28 +++++++++++ .../Routing/CustomRouteUrlProvider.cs | 2 +- src/Umbraco.Web/Umbraco.Web.csproj | 2 + src/Umbraco.Web/UmbracoContext.cs | 2 +- src/Umbraco.Web/UmbracoContextExtensions.cs | 34 +++++++++++++ src/Umbraco.Web/WebBootManager.cs | 4 +- 22 files changed, 163 insertions(+), 67 deletions(-) create mode 100644 src/Umbraco.Web/Mvc/ControllerContextExtensions.cs create mode 100644 src/Umbraco.Web/RouteDataExtensions.cs diff --git a/src/Umbraco.Core/Constants-Web.cs b/src/Umbraco.Core/Constants-Web.cs index 60fba0ae40..f596820506 100644 --- a/src/Umbraco.Core/Constants-Web.cs +++ b/src/Umbraco.Core/Constants-Web.cs @@ -10,6 +10,12 @@ namespace Umbraco.Core /// public static class Web { + public const string UmbracoContextDataToken = "umbraco-context"; + public const string UmbracoDataToken = "umbraco"; + public const string PublishedDocumentRequestDataToken = "umbraco-doc-request"; + public const string CustomRouteDataToken = "umbraco-custom-route"; + public const string UmbracoRouteDefinitionDataToken = "umbraco-route-def"; + /// /// The preview cookie name /// diff --git a/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs index 0286a5bd0f..29a76b29d2 100644 --- a/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs @@ -165,7 +165,7 @@ namespace Umbraco.Tests.Mvc }; var routeData = new RouteData(); - routeData.DataTokens.Add("umbraco-route-def", routeDefinition); + routeData.DataTokens.Add(Umbraco.Core.Constants.Web.UmbracoRouteDefinitionDataToken, routeDefinition); var ctrl = new TestSurfaceController(umbCtx, new UmbracoHelper()); ctrl.ControllerContext = new ControllerContext(contextBase, routeData, ctrl); diff --git a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs index fd2dc02292..89ec6c85b7 100644 --- a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs @@ -444,7 +444,7 @@ namespace Umbraco.Tests.Mvc var context = new ViewContext(); context.RouteData = new RouteData(); - context.RouteData.DataTokens.Add("umbraco-context", umbracoContext); + context.RouteData.DataTokens.Add(Umbraco.Core.Constants.Web.UmbracoContextDataToken, umbracoContext); return context; } diff --git a/src/Umbraco.Web/Macros/PartialViewMacroEngine.cs b/src/Umbraco.Web/Macros/PartialViewMacroEngine.cs index b4171add35..10d105883f 100644 --- a/src/Umbraco.Web/Macros/PartialViewMacroEngine.cs +++ b/src/Umbraco.Web/Macros/PartialViewMacroEngine.cs @@ -124,7 +124,7 @@ namespace Umbraco.Web.Macros var routeVals = new RouteData(); routeVals.Values.Add("controller", "PartialViewMacro"); routeVals.Values.Add("action", "Index"); - routeVals.DataTokens.Add("umbraco-context", umbCtx); //required for UmbracoViewPage + routeVals.DataTokens.Add(Umbraco.Core.Constants.Web.UmbracoContextDataToken, umbCtx); //required for UmbracoViewPage //lets render this controller as a child action var viewContext = new ViewContext {ViewData = new ViewDataDictionary()};; diff --git a/src/Umbraco.Web/Mvc/AreaRegistrationExtensions.cs b/src/Umbraco.Web/Mvc/AreaRegistrationExtensions.cs index 2836c458fb..982286c24b 100644 --- a/src/Umbraco.Web/Mvc/AreaRegistrationExtensions.cs +++ b/src/Umbraco.Web/Mvc/AreaRegistrationExtensions.cs @@ -110,7 +110,7 @@ namespace Umbraco.Web.Mvc //match this area controllerPluginRoute.DataTokens.Add("area", area.AreaName); - controllerPluginRoute.DataTokens.Add("umbraco", umbracoTokenValue); //ensure the umbraco token is set + controllerPluginRoute.DataTokens.Add(Core.Constants.Web.UmbracoDataToken, umbracoTokenValue); //ensure the umbraco token is set return controllerPluginRoute; } diff --git a/src/Umbraco.Web/Mvc/ControllerContextExtensions.cs b/src/Umbraco.Web/Mvc/ControllerContextExtensions.cs new file mode 100644 index 0000000000..c998ed931e --- /dev/null +++ b/src/Umbraco.Web/Mvc/ControllerContextExtensions.cs @@ -0,0 +1,50 @@ +using System.Web.Mvc; + +namespace Umbraco.Web.Mvc +{ + public static class ControllerContextExtensions + { + /// + /// Tries to get the Umbraco context from the whole ControllerContext hierarchy based on data tokens and if that fails + /// it will attempt to fallback to retrieving it from the HttpContext. + /// + /// + /// + public static UmbracoContext GetUmbracoContext(this ControllerContext controllerContext) + { + var umbCtx = controllerContext.RouteData.GetUmbracoContext(); + if (umbCtx != null) return umbCtx; + + if (controllerContext.ParentActionViewContext != null) + { + //recurse + return controllerContext.ParentActionViewContext.GetUmbracoContext(); + } + + //fallback to getting from HttpContext + return controllerContext.HttpContext.GetUmbracoContext(); + } + + /// + /// Find a data token in the whole ControllerContext hierarchy of execution + /// + /// + /// + /// + internal static object GetDataTokenInViewContextHierarchy(this ControllerContext controllerContext, string dataTokenName) + { + if (controllerContext.RouteData.DataTokens.ContainsKey(dataTokenName)) + { + return controllerContext.RouteData.DataTokens[dataTokenName]; + } + + if (controllerContext.ParentActionViewContext != null) + { + //recurse! + return controllerContext.ParentActionViewContext.GetDataTokenInViewContextHierarchy(dataTokenName); + } + + return null; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Mvc/ControllerExtensions.cs b/src/Umbraco.Web/Mvc/ControllerExtensions.cs index c15520b57c..734e60e8f5 100644 --- a/src/Umbraco.Web/Mvc/ControllerExtensions.cs +++ b/src/Umbraco.Web/Mvc/ControllerExtensions.cs @@ -5,24 +5,8 @@ using System.Web.Mvc; namespace Umbraco.Web.Mvc { - internal static class ControllerExtensions + internal static class ControllerExtensions { - internal static object GetDataTokenInViewContextHierarchy(this ControllerContext controllerContext, string dataTokenName) - { - if (controllerContext.RouteData.DataTokens.ContainsKey(dataTokenName)) - { - return controllerContext.RouteData.DataTokens[dataTokenName]; - } - - if (controllerContext.ParentActionViewContext != null) - { - //recurse! - return controllerContext.ParentActionViewContext.GetDataTokenInViewContextHierarchy(dataTokenName); - } - - return null; - } - /// /// Return the controller name from the controller type /// diff --git a/src/Umbraco.Web/Mvc/RenderMvcController.cs b/src/Umbraco.Web/Mvc/RenderMvcController.cs index dd06b3ced1..f3886d8ce1 100644 --- a/src/Umbraco.Web/Mvc/RenderMvcController.cs +++ b/src/Umbraco.Web/Mvc/RenderMvcController.cs @@ -59,11 +59,11 @@ namespace Umbraco.Web.Mvc { if (_publishedContentRequest != null) return _publishedContentRequest; - if (RouteData.DataTokens.ContainsKey("umbraco-doc-request") == false) + if (RouteData.DataTokens.ContainsKey(Core.Constants.Web.PublishedDocumentRequestDataToken) == false) { throw new InvalidOperationException("DataTokens must contain an 'umbraco-doc-request' key with a PublishedContentRequest object"); } - _publishedContentRequest = (PublishedContentRequest)RouteData.DataTokens["umbraco-doc-request"]; + _publishedContentRequest = (PublishedContentRequest)RouteData.DataTokens[Core.Constants.Web.PublishedDocumentRequestDataToken]; return _publishedContentRequest; } } diff --git a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs index bce3515c1b..d7ce36b4a4 100644 --- a/src/Umbraco.Web/Mvc/RenderRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/RenderRouteHandler.cs @@ -97,9 +97,9 @@ namespace Umbraco.Web.Mvc internal void SetupRouteDataForRequest(RenderModel renderModel, RequestContext requestContext, PublishedContentRequest docRequest) { //put essential data into the data tokens, the 'umbraco' key is required to be there for the view engine - requestContext.RouteData.DataTokens.Add("umbraco", renderModel); //required for the RenderModelBinder and view engine - requestContext.RouteData.DataTokens.Add("umbraco-doc-request", docRequest); //required for RenderMvcController - requestContext.RouteData.DataTokens.Add("umbraco-context", UmbracoContext); //required for UmbracoTemplatePage + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.UmbracoDataToken, renderModel); //required for the RenderModelBinder and view engine + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.PublishedDocumentRequestDataToken, docRequest); //required for RenderMvcController + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, UmbracoContext); //required for UmbracoTemplatePage } private void UpdateRouteDataForRequest(RenderModel renderModel, RequestContext requestContext) @@ -107,7 +107,7 @@ namespace Umbraco.Web.Mvc if (renderModel == null) throw new ArgumentNullException("renderModel"); if (requestContext == null) throw new ArgumentNullException("requestContext"); - requestContext.RouteData.DataTokens["umbraco"] = renderModel; + requestContext.RouteData.DataTokens[Core.Constants.Web.UmbracoDataToken] = renderModel; // the rest should not change -- it's only the published content that has changed } @@ -337,7 +337,7 @@ namespace Umbraco.Web.Mvc } //store the route definition - requestContext.RouteData.DataTokens["umbraco-route-def"] = def; + requestContext.RouteData.DataTokens[Umbraco.Core.Constants.Web.UmbracoRouteDefinitionDataToken] = def; return def; } diff --git a/src/Umbraco.Web/Mvc/RenderViewEngine.cs b/src/Umbraco.Web/Mvc/RenderViewEngine.cs index ed7b941580..fdf61059e0 100644 --- a/src/Umbraco.Web/Mvc/RenderViewEngine.cs +++ b/src/Umbraco.Web/Mvc/RenderViewEngine.cs @@ -93,7 +93,7 @@ namespace Umbraco.Web.Mvc /// private bool ShouldFindView(ControllerContext controllerContext, bool isPartial) { - var umbracoToken = controllerContext.GetDataTokenInViewContextHierarchy("umbraco"); + var umbracoToken = controllerContext.GetDataTokenInViewContextHierarchy(Core.Constants.Web.UmbracoDataToken); //first check if we're rendering a partial view for the back office, or surface controller, etc... //anything that is not IUmbracoRenderModel as this should only pertain to Umbraco views. diff --git a/src/Umbraco.Web/Mvc/RouteValueDictionaryExtensions.cs b/src/Umbraco.Web/Mvc/RouteValueDictionaryExtensions.cs index 445441aafa..ceb4012a66 100644 --- a/src/Umbraco.Web/Mvc/RouteValueDictionaryExtensions.cs +++ b/src/Umbraco.Web/Mvc/RouteValueDictionaryExtensions.cs @@ -32,7 +32,7 @@ namespace Umbraco.Web.Mvc public static object GetRequiredObject(this RouteValueDictionary items, string key) { if (key == null) throw new ArgumentNullException("key"); - if (!items.Keys.Contains(key)) + if (items.Keys.Contains(key) == false) throw new ArgumentNullException("The " + key + " parameter was not found but is required"); return items[key]; } diff --git a/src/Umbraco.Web/Mvc/SurfaceController.cs b/src/Umbraco.Web/Mvc/SurfaceController.cs index 817ed97902..420573d745 100644 --- a/src/Umbraco.Web/Mvc/SurfaceController.cs +++ b/src/Umbraco.Web/Mvc/SurfaceController.cs @@ -185,9 +185,9 @@ namespace Umbraco.Web.Mvc while (currentContext != null) { var currentRouteData = currentContext.RouteData; - if (currentRouteData.DataTokens.ContainsKey("umbraco-route-def")) + if (currentRouteData.DataTokens.ContainsKey(Core.Constants.Web.UmbracoRouteDefinitionDataToken)) { - return Attempt.Succeed((RouteDefinition)currentRouteData.DataTokens["umbraco-route-def"]); + return Attempt.Succeed((RouteDefinition)currentRouteData.DataTokens[Core.Constants.Web.UmbracoRouteDefinitionDataToken]); } if (currentContext.IsChildAction) { diff --git a/src/Umbraco.Web/Mvc/SurfaceControllerFactory.cs b/src/Umbraco.Web/Mvc/SurfaceControllerFactory.cs index c82c59db65..8af018e833 100644 --- a/src/Umbraco.Web/Mvc/SurfaceControllerFactory.cs +++ b/src/Umbraco.Web/Mvc/SurfaceControllerFactory.cs @@ -24,7 +24,7 @@ namespace Umbraco.Web.Mvc return false; //ensure there is an umbraco token set - var umbracoToken = request.RouteData.DataTokens["umbraco"]; + var umbracoToken = request.RouteData.DataTokens[Core.Constants.Web.UmbracoDataToken]; if (umbracoToken == null || string.IsNullOrWhiteSpace(umbracoToken.ToString())) return false; diff --git a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs index f23515c1d9..da4cb198ac 100644 --- a/src/Umbraco.Web/Mvc/UmbracoPageResult.cs +++ b/src/Umbraco.Web/Mvc/UmbracoPageResult.cs @@ -34,7 +34,7 @@ namespace Umbraco.Web.Mvc ValidateRouteData(context.RouteData); - var routeDef = (RouteDefinition)context.RouteData.DataTokens["umbraco-route-def"]; + var routeDef = (RouteDefinition)context.RouteData.DataTokens[Umbraco.Core.Constants.Web.UmbracoRouteDefinitionDataToken]; //Special case, if it is webforms but we're posting to an MVC surface controller, then we // need to return the webforms result instead @@ -91,7 +91,7 @@ namespace Umbraco.Web.Mvc /// private static void ValidateRouteData(RouteData routeData) { - if (routeData.DataTokens.ContainsKey("umbraco-route-def") == false) + if (routeData.DataTokens.ContainsKey(Umbraco.Core.Constants.Web.UmbracoRouteDefinitionDataToken) == false) { throw new InvalidOperationException("Can only use " + typeof(UmbracoPageResult).Name + " in the context of an Http POST when using a SurfaceController form"); diff --git a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs index 480f182855..62081efe76 100644 --- a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs +++ b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs @@ -26,24 +26,13 @@ namespace Umbraco.Web.Mvc get { //we should always try to return the context from the data tokens just in case its a custom context and not - //using the UmbracoContext.Current. - //we will fallback to the singleton if necessary. - if (ViewContext.RouteData.DataTokens.ContainsKey("umbraco-context")) - { - return (UmbracoContext)ViewContext.RouteData.DataTokens.GetRequiredObject("umbraco-context"); - } - //next check if it is a child action and see if the parent has it set in data tokens - if (ViewContext.IsChildAction) - { - if (ViewContext.ParentActionViewContext.RouteData.DataTokens.ContainsKey("umbraco-context")) - { - return (UmbracoContext)ViewContext.ParentActionViewContext.RouteData.DataTokens.GetRequiredObject("umbraco-context"); - } - } - - //lastly, we will use the singleton, the only reason this should ever happen is is someone is rendering a page that inherits from this - //class and are rendering it outside of the normal Umbraco routing process. Very unlikely. - return UmbracoContext.Current; + //using the UmbracoContext.Current, we will fallback to the singleton if necessary. + var umbCtx = ViewContext.GetUmbracoContext() + //lastly, we will use the singleton, the only reason this should ever happen is is someone is rendering a page that inherits from this + //class and are rendering it outside of the normal Umbraco routing process. Very unlikely. + ?? UmbracoContext.Current; + + return umbCtx; } } @@ -65,16 +54,16 @@ namespace Umbraco.Web.Mvc //we should always try to return the object from the data tokens just in case its a custom object and not //using the UmbracoContext.Current. //we will fallback to the singleton if necessary. - if (ViewContext.RouteData.DataTokens.ContainsKey("umbraco-doc-request")) + if (ViewContext.RouteData.DataTokens.ContainsKey(Core.Constants.Web.PublishedDocumentRequestDataToken)) { - return (PublishedContentRequest)ViewContext.RouteData.DataTokens.GetRequiredObject("umbraco-doc-request"); + return (PublishedContentRequest)ViewContext.RouteData.DataTokens.GetRequiredObject(Core.Constants.Web.PublishedDocumentRequestDataToken); } //next check if it is a child action and see if the parent has it set in data tokens if (ViewContext.IsChildAction) { - if (ViewContext.ParentActionViewContext.RouteData.DataTokens.ContainsKey("umbraco-doc-request")) + if (ViewContext.ParentActionViewContext.RouteData.DataTokens.ContainsKey(Core.Constants.Web.PublishedDocumentRequestDataToken)) { - return (PublishedContentRequest)ViewContext.ParentActionViewContext.RouteData.DataTokens.GetRequiredObject("umbraco-doc-request"); + return (PublishedContentRequest)ViewContext.ParentActionViewContext.RouteData.DataTokens.GetRequiredObject(Core.Constants.Web.PublishedDocumentRequestDataToken); } } diff --git a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs index feb5b30ce2..5c948d2e0b 100644 --- a/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs +++ b/src/Umbraco.Web/Mvc/UmbracoVirtualNodeRouteHandler.cs @@ -3,6 +3,8 @@ using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; +using System.Web.Security; +using Umbraco.Core.Configuration; using Umbraco.Core.Models; using Umbraco.Web.Models; using Umbraco.Web.Routing; @@ -19,7 +21,8 @@ namespace Umbraco.Web.Mvc if (found == null) return new NotFoundHandler(); umbracoContext.PublishedContentRequest = new PublishedContentRequest( - umbracoContext.CleanedUmbracoUrl, umbracoContext.RoutingContext) + umbracoContext.CleanedUmbracoUrl, umbracoContext.RoutingContext, + UmbracoConfig.For.UmbracoSettings().WebRouting, s => Roles.Provider.GetRolesForUser(s)) { PublishedContent = found }; @@ -31,11 +34,11 @@ namespace Umbraco.Web.Mvc var renderModel = new RenderModel(umbracoContext.PublishedContentRequest.PublishedContent, umbracoContext.PublishedContentRequest.Culture); //assigns the required tokens to the request - requestContext.RouteData.DataTokens.Add("umbraco", renderModel); - requestContext.RouteData.DataTokens.Add("umbraco-doc-request", umbracoContext.PublishedContentRequest); - requestContext.RouteData.DataTokens.Add("umbraco-context", umbracoContext); + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.UmbracoDataToken, renderModel); + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.PublishedDocumentRequestDataToken, umbracoContext.PublishedContentRequest); + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbracoContext); //this is used just for a flag that this is an umbraco custom route - requestContext.RouteData.DataTokens.Add("umbraco-custom-route", true); + requestContext.RouteData.DataTokens.Add(Core.Constants.Web.CustomRouteDataToken, true); //Here we need to detect if a SurfaceController has posted var formInfo = RenderRouteHandler.GetFormInfo(requestContext); @@ -49,7 +52,7 @@ namespace Umbraco.Web.Mvc }; //set the special data token to the current route definition - requestContext.RouteData.DataTokens["umbraco-route-def"] = def; + requestContext.RouteData.DataTokens[Umbraco.Core.Constants.Web.UmbracoRouteDefinitionDataToken] = def; return RenderRouteHandler.HandlePostedValues(requestContext, formInfo); } diff --git a/src/Umbraco.Web/RouteDataExtensions.cs b/src/Umbraco.Web/RouteDataExtensions.cs new file mode 100644 index 0000000000..5d7f513ad6 --- /dev/null +++ b/src/Umbraco.Web/RouteDataExtensions.cs @@ -0,0 +1,28 @@ +using System; +using System.Web.Routing; + +namespace Umbraco.Web +{ + public static class RouteDataExtensions + { + /// + /// Tries to get the Umbraco context from the DataTokens + /// + /// + /// + /// + /// This is useful when working on async threads since the UmbracoContext is not copied over explicitly + /// + public static UmbracoContext GetUmbracoContext(this RouteData routeData) + { + if (routeData == null) throw new ArgumentNullException("routeData"); + + if (routeData.DataTokens.ContainsKey(UmbracoContext.HttpContextItemName)) + { + var umbCtx = routeData.DataTokens[UmbracoContext.HttpContextItemName] as UmbracoContext; + return umbCtx; + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Web/Routing/CustomRouteUrlProvider.cs b/src/Umbraco.Web/Routing/CustomRouteUrlProvider.cs index 2bb2903aa0..989cabe388 100644 --- a/src/Umbraco.Web/Routing/CustomRouteUrlProvider.cs +++ b/src/Umbraco.Web/Routing/CustomRouteUrlProvider.cs @@ -28,7 +28,7 @@ namespace Umbraco.Web.Routing if (umbracoContext.HttpContext.Request.RequestContext == null) return null; if (umbracoContext.HttpContext.Request.RequestContext.RouteData == null) return null; if (umbracoContext.HttpContext.Request.RequestContext.RouteData.DataTokens == null) return null; - if (umbracoContext.HttpContext.Request.RequestContext.RouteData.DataTokens.ContainsKey("umbraco-custom-route") == false) return null; + if (umbracoContext.HttpContext.Request.RequestContext.RouteData.DataTokens.ContainsKey(Umbraco.Core.Constants.Web.CustomRouteDataToken) == false) return null; //ok so it's a custom route with published content assigned, check if the id being requested for is the same id as the assigned published content return id == umbracoContext.PublishedContentRequest.PublishedContent.Id ? umbracoContext.PublishedContentRequest.PublishedContent.Url diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj index e862e777b6..736d348a37 100644 --- a/src/Umbraco.Web/Umbraco.Web.csproj +++ b/src/Umbraco.Web/Umbraco.Web.csproj @@ -304,11 +304,13 @@ + + diff --git a/src/Umbraco.Web/UmbracoContext.cs b/src/Umbraco.Web/UmbracoContext.cs index 50788c4b2e..6bd325c275 100644 --- a/src/Umbraco.Web/UmbracoContext.cs +++ b/src/Umbraco.Web/UmbracoContext.cs @@ -21,7 +21,7 @@ namespace Umbraco.Web /// public class UmbracoContext : DisposableObject, IDisposeOnRequestEnd { - private const string HttpContextItemName = "Umbraco.Web.UmbracoContext"; + internal const string HttpContextItemName = "Umbraco.Web.UmbracoContext"; private static readonly object Locker = new object(); private bool _replacing; diff --git a/src/Umbraco.Web/UmbracoContextExtensions.cs b/src/Umbraco.Web/UmbracoContextExtensions.cs index ec85b4dad6..8cd38df6d1 100644 --- a/src/Umbraco.Web/UmbracoContextExtensions.cs +++ b/src/Umbraco.Web/UmbracoContextExtensions.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.Web; +using Umbraco.Core; using Umbraco.Core.Events; namespace Umbraco.Web @@ -11,6 +13,38 @@ namespace Umbraco.Web /// public static class UmbracoContextExtensions { + /// + /// tries to get the Umbraco context from the HttpContext + /// + /// + /// + /// + /// This is useful when working on async threads since the UmbracoContext is not copied over explicitly + /// + public static UmbracoContext GetUmbracoContext(this HttpContext http) + { + return GetUmbracoContext(new HttpContextWrapper(http)); + } + + /// + /// tries to get the Umbraco context from the HttpContext + /// + /// + /// + /// + /// This is useful when working on async threads since the UmbracoContext is not copied over explicitly + /// + public static UmbracoContext GetUmbracoContext(this HttpContextBase http) + { + if (http == null) throw new ArgumentNullException("http"); + + if (http.Items.Contains(UmbracoContext.HttpContextItemName)) + { + var umbCtx = http.Items[UmbracoContext.HttpContextItemName] as UmbracoContext; + return umbCtx; + } + return null; + } /// /// If there are event messages in the current request this will return them , otherwise it will return null diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 67e0e65703..49ce070ee9 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -336,7 +336,7 @@ namespace Umbraco.Web { route.DataTokens = new RouteValueDictionary(); } - route.DataTokens.Add("umbraco", "api"); //ensure the umbraco token is set + route.DataTokens.Add(Core.Constants.Web.UmbracoDataToken, "api"); //ensure the umbraco token is set } private void RouteLocalSurfaceController(Type controller, string umbracoPath) @@ -347,7 +347,7 @@ namespace Umbraco.Web umbracoPath + "/Surface/" + meta.ControllerName + "/{action}/{id}",//url to match new { controller = meta.ControllerName, action = "Index", id = UrlParameter.Optional }, new[] { meta.ControllerNamespace }); //look in this namespace to create the controller - route.DataTokens.Add("umbraco", "surface"); //ensure the umbraco token is set + route.DataTokens.Add(Core.Constants.Web.UmbracoDataToken, "surface"); //ensure the umbraco token is set route.DataTokens.Add("UseNamespaceFallback", false); //Don't look anywhere else except this namespace! //make it use our custom/special SurfaceMvcHandler route.RouteHandler = new SurfaceRouteHandler(); From 6f0f1ab2c390143ac068f1bd56899f277eaaf879 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Feb 2016 10:22:37 +0100 Subject: [PATCH 2/5] fixes wrong constant used --- src/Umbraco.Web/RouteDataExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web/RouteDataExtensions.cs b/src/Umbraco.Web/RouteDataExtensions.cs index 5d7f513ad6..036d30c746 100644 --- a/src/Umbraco.Web/RouteDataExtensions.cs +++ b/src/Umbraco.Web/RouteDataExtensions.cs @@ -17,9 +17,9 @@ namespace Umbraco.Web { if (routeData == null) throw new ArgumentNullException("routeData"); - if (routeData.DataTokens.ContainsKey(UmbracoContext.HttpContextItemName)) + if (routeData.DataTokens.ContainsKey(Core.Constants.Web.UmbracoContextDataToken)) { - var umbCtx = routeData.DataTokens[UmbracoContext.HttpContextItemName] as UmbracoContext; + var umbCtx = routeData.DataTokens[Core.Constants.Web.UmbracoContextDataToken] as UmbracoContext; return umbCtx; } return null; From 8758f9649bce9d421e3758b47bf7a8e884f81cd5 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Feb 2016 10:57:20 +0100 Subject: [PATCH 3/5] checks for null before assigning culture --- src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs index 62081efe76..65d24f1794 100644 --- a/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs +++ b/src/Umbraco.Web/Mvc/UmbracoViewPageOfTModel.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using System.Text; using System.Web; using System.Web.Mvc; @@ -167,10 +168,12 @@ namespace Umbraco.Web.Mvc var ok = sourceContent != null; if (sourceContent != null) - { - // try to grab the culture - // using context's culture by default - var culture = UmbracoContext.PublishedContentRequest.Culture; + { + // use context culture as default, if available + var culture = CultureInfo.CurrentCulture; + if (UmbracoContext.PublishedContentRequest != null && UmbracoContext.PublishedContentRequest.Culture != null) + culture = UmbracoContext.PublishedContentRequest.Culture; + var sourceRenderModel = source as RenderModel; if (sourceRenderModel != null) culture = sourceRenderModel.CurrentCulture; From d32991c30a0028862a4bc67aa790fdf5bcd8ccc7 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Feb 2016 10:59:48 +0100 Subject: [PATCH 4/5] re-organizing some namespaces for tests --- src/Umbraco.Tests/Umbraco.Tests.csproj | 22 +- .../AngularAntiForgeryTests.cs | 13 +- .../ContentModelSerializationTests.cs | 157 ++- .../JsInitializationTests.cs | 76 +- .../ServerVariablesParserTests.cs | 64 +- .../BackOfficeControllerUnitTests.cs | 2 +- .../Controllers/PluginControllerAreaTests.cs | 2 +- .../ContentControllerUnitTests.cs | 732 ++++++------ ...terAllowedOutgoingContentAttributeTests.cs | 270 ++--- .../WebApiEditors/MediaControllerUnitTests.cs | 282 ++--- .../Mvc/HtmlHelperExtensionMethodsTests.cs | 2 +- ...ergeParentContextViewDataAttributeTests.cs | 170 +-- ...RenderIndexActionSelectorAttributeTests.cs | 2 +- .../{ => Web}/Mvc/SurfaceControllerTests.cs | 5 +- .../{ => Web}/Mvc/UmbracoViewPageTests.cs | 1004 ++++++++--------- .../Mvc/ViewDataDictionaryExtensionTests.cs | 82 +- 16 files changed, 1429 insertions(+), 1456 deletions(-) rename src/Umbraco.Tests/{ => Web}/AngularIntegration/AngularAntiForgeryTests.cs (84%) rename src/Umbraco.Tests/{ => Web}/AngularIntegration/ContentModelSerializationTests.cs (93%) rename src/Umbraco.Tests/{ => Web}/AngularIntegration/JsInitializationTests.cs (73%) rename src/Umbraco.Tests/{ => Web}/AngularIntegration/ServerVariablesParserTests.cs (90%) rename src/Umbraco.Tests/{ => Web}/Controllers/BackOfficeControllerUnitTests.cs (97%) rename src/Umbraco.Tests/{ => Web}/Controllers/PluginControllerAreaTests.cs (98%) rename src/Umbraco.Tests/{ => Web}/Controllers/WebApiEditors/ContentControllerUnitTests.cs (97%) rename src/Umbraco.Tests/{ => Web}/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs (96%) rename src/Umbraco.Tests/{ => Web}/Controllers/WebApiEditors/MediaControllerUnitTests.cs (96%) rename src/Umbraco.Tests/{ => Web}/Mvc/HtmlHelperExtensionMethodsTests.cs (95%) rename src/Umbraco.Tests/{ => Web}/Mvc/MergeParentContextViewDataAttributeTests.cs (97%) rename src/Umbraco.Tests/{ => Web}/Mvc/RenderIndexActionSelectorAttributeTests.cs (99%) rename src/Umbraco.Tests/{ => Web}/Mvc/SurfaceControllerTests.cs (98%) rename src/Umbraco.Tests/{ => Web}/Mvc/UmbracoViewPageTests.cs (96%) rename src/Umbraco.Tests/{ => Web}/Mvc/ViewDataDictionaryExtensionTests.cs (87%) diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index cbad6db867..592d5b98e7 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -187,12 +187,12 @@ - + - + @@ -242,8 +242,8 @@ - - + + @@ -318,9 +318,9 @@ - - - + + + @@ -330,8 +330,8 @@ - - + + @@ -427,7 +427,7 @@ - + @@ -512,7 +512,7 @@ ImportResources.resx - + diff --git a/src/Umbraco.Tests/AngularIntegration/AngularAntiForgeryTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/AngularAntiForgeryTests.cs similarity index 84% rename from src/Umbraco.Tests/AngularIntegration/AngularAntiForgeryTests.cs rename to src/Umbraco.Tests/Web/AngularIntegration/AngularAntiForgeryTests.cs index 4ae235b195..1503a1d43b 100644 --- a/src/Umbraco.Tests/AngularIntegration/AngularAntiForgeryTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/AngularAntiForgeryTests.cs @@ -1,20 +1,11 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; +using System.IO; using System.Net; -using System.Security.Claims; using System.Security.Principal; -using System.Text; -using System.Threading.Tasks; using System.Web; -using System.Web.Security; using NUnit.Framework; -using Umbraco.Core.Security; -using Umbraco.Tests.TestHelpers; using Umbraco.Web.WebApi.Filters; -namespace Umbraco.Tests.AngularIntegration +namespace Umbraco.Tests.Web.AngularIntegration { [TestFixture] public class AngularAntiForgeryTests diff --git a/src/Umbraco.Tests/AngularIntegration/ContentModelSerializationTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs similarity index 93% rename from src/Umbraco.Tests/AngularIntegration/ContentModelSerializationTests.cs rename to src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs index d19cc6e171..fdad2a9815 100644 --- a/src/Umbraco.Tests/AngularIntegration/ContentModelSerializationTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/ContentModelSerializationTests.cs @@ -1,80 +1,77 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Umbraco.Core; -using Umbraco.Web.Models.ContentEditing; - -namespace Umbraco.Tests.AngularIntegration -{ - [TestFixture] - public class ContentModelSerializationTests - { - [Test] - public void Content_Display_To_Json() - { - //create 3 tabs with 3 properties each - var tabs = new List>(); - for (var tabIndex = 0; tabIndex < 3; tabIndex ++) - { - var props = new List(); - for (var propertyIndex = 0; propertyIndex < 3; propertyIndex ++) - { - props.Add(new ContentPropertyDisplay - { - Alias = "property" + propertyIndex, - Label = "Property " + propertyIndex, - Id = propertyIndex, - Value = "value" + propertyIndex, - Config = new Dictionary {{ propertyIndex.ToInvariantString(), "value" }}, - Description = "Description " + propertyIndex, - View = "~/Views/View" + propertyIndex, - HideLabel = false - }); - } - tabs.Add(new Tab() - { - Alias = "Tab" + tabIndex, - Label = "Tab" + tabIndex, - Properties = props - }); - } - - var displayModel = new ContentItemDisplay - { - Id = 1234, - Name = "Test", - Tabs = tabs - }; - - var json = JsonConvert.SerializeObject(displayModel); - - var jObject = JObject.Parse(json); - - Assert.AreEqual("1234", jObject["id"].ToString()); - Assert.AreEqual("Test", jObject["name"].ToString()); - Assert.AreEqual(3, jObject["tabs"].Count()); - for (var tab = 0; tab < jObject["tabs"].Count(); tab++) - { - Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["alias"].ToString()); - Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["label"].ToString()); - Assert.AreEqual(3, jObject["tabs"][tab]["properties"].Count()); - for (var prop = 0; prop < jObject["tabs"][tab]["properties"].Count(); prop++) - { - Assert.AreEqual("property" + prop, jObject["tabs"][tab]["properties"][prop]["alias"].ToString()); - Assert.AreEqual("Property " + prop, jObject["tabs"][tab]["properties"][prop]["label"].ToString()); - Assert.AreEqual(prop, jObject["tabs"][tab]["properties"][prop]["id"].Value()); - Assert.AreEqual("value" + prop, jObject["tabs"][tab]["properties"][prop]["value"].ToString()); - Assert.AreEqual("{\"" + prop + "\":\"value\"}", jObject["tabs"][tab]["properties"][prop]["config"].ToString(Formatting.None)); - Assert.AreEqual("Description " + prop, jObject["tabs"][tab]["properties"][prop]["description"].ToString()); - Assert.AreEqual(false, jObject["tabs"][tab]["properties"][prop]["hideLabel"].Value()); - } - } - } - - } -} +using System.Collections.Generic; +using System.Linq; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Web.Models.ContentEditing; + +namespace Umbraco.Tests.Web.AngularIntegration +{ + [TestFixture] + public class ContentModelSerializationTests + { + [Test] + public void Content_Display_To_Json() + { + //create 3 tabs with 3 properties each + var tabs = new List>(); + for (var tabIndex = 0; tabIndex < 3; tabIndex ++) + { + var props = new List(); + for (var propertyIndex = 0; propertyIndex < 3; propertyIndex ++) + { + props.Add(new ContentPropertyDisplay + { + Alias = "property" + propertyIndex, + Label = "Property " + propertyIndex, + Id = propertyIndex, + Value = "value" + propertyIndex, + Config = new Dictionary {{ propertyIndex.ToInvariantString(), "value" }}, + Description = "Description " + propertyIndex, + View = "~/Views/View" + propertyIndex, + HideLabel = false + }); + } + tabs.Add(new Tab() + { + Alias = "Tab" + tabIndex, + Label = "Tab" + tabIndex, + Properties = props + }); + } + + var displayModel = new ContentItemDisplay + { + Id = 1234, + Name = "Test", + Tabs = tabs + }; + + var json = JsonConvert.SerializeObject(displayModel); + + var jObject = JObject.Parse(json); + + Assert.AreEqual("1234", jObject["id"].ToString()); + Assert.AreEqual("Test", jObject["name"].ToString()); + Assert.AreEqual(3, jObject["tabs"].Count()); + for (var tab = 0; tab < jObject["tabs"].Count(); tab++) + { + Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["alias"].ToString()); + Assert.AreEqual("Tab" + tab, jObject["tabs"][tab]["label"].ToString()); + Assert.AreEqual(3, jObject["tabs"][tab]["properties"].Count()); + for (var prop = 0; prop < jObject["tabs"][tab]["properties"].Count(); prop++) + { + Assert.AreEqual("property" + prop, jObject["tabs"][tab]["properties"][prop]["alias"].ToString()); + Assert.AreEqual("Property " + prop, jObject["tabs"][tab]["properties"][prop]["label"].ToString()); + Assert.AreEqual(prop, jObject["tabs"][tab]["properties"][prop]["id"].Value()); + Assert.AreEqual("value" + prop, jObject["tabs"][tab]["properties"][prop]["value"].ToString()); + Assert.AreEqual("{\"" + prop + "\":\"value\"}", jObject["tabs"][tab]["properties"][prop]["config"].ToString(Formatting.None)); + Assert.AreEqual("Description " + prop, jObject["tabs"][tab]["properties"][prop]["description"].ToString()); + Assert.AreEqual(false, jObject["tabs"][tab]["properties"][prop]["hideLabel"].Value()); + } + } + } + + } +} diff --git a/src/Umbraco.Tests/AngularIntegration/JsInitializationTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/JsInitializationTests.cs similarity index 73% rename from src/Umbraco.Tests/AngularIntegration/JsInitializationTests.cs rename to src/Umbraco.Tests/Web/AngularIntegration/JsInitializationTests.cs index 1b3b14516d..22991d605a 100644 --- a/src/Umbraco.Tests/AngularIntegration/JsInitializationTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/JsInitializationTests.cs @@ -1,41 +1,35 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; -using Newtonsoft.Json.Linq; -using Umbraco.Core.Manifest; -using Umbraco.Web.UI.JavaScript; - -namespace Umbraco.Tests.AngularIntegration -{ - [TestFixture] - public class JsInitializationTests - { - - [Test] - public void Get_Default_Init() - { - var init = JsInitialization.GetDefaultInitialization(); - Assert.IsTrue(init.Any()); - } - - [Test] - public void Parse_Main() - { - var result = JsInitialization.ParseMain(new[] {"[World]", "Hello" }); - - Assert.AreEqual(@"LazyLoad.js([World], function () { - //we need to set the legacy UmbClientMgr path - UmbClientMgr.setUmbracoPath('Hello'); - - jQuery(document).ready(function () { - - angular.bootstrap(document, ['umbraco']); - - }); -});", result); - } - } -} +using System.Linq; +using NUnit.Framework; +using Umbraco.Web.UI.JavaScript; + +namespace Umbraco.Tests.Web.AngularIntegration +{ + [TestFixture] + public class JsInitializationTests + { + + [Test] + public void Get_Default_Init() + { + var init = JsInitialization.GetDefaultInitialization(); + Assert.IsTrue(init.Any()); + } + + [Test] + public void Parse_Main() + { + var result = JsInitialization.ParseMain(new[] {"[World]", "Hello" }); + + Assert.AreEqual(@"LazyLoad.js([World], function () { + //we need to set the legacy UmbClientMgr path + UmbClientMgr.setUmbracoPath('Hello'); + + jQuery(document).ready(function () { + + angular.bootstrap(document, ['umbraco']); + + }); +});", result); + } + } +} diff --git a/src/Umbraco.Tests/AngularIntegration/ServerVariablesParserTests.cs b/src/Umbraco.Tests/Web/AngularIntegration/ServerVariablesParserTests.cs similarity index 90% rename from src/Umbraco.Tests/AngularIntegration/ServerVariablesParserTests.cs rename to src/Umbraco.Tests/Web/AngularIntegration/ServerVariablesParserTests.cs index 9a9aaa8173..b0fb91ab98 100644 --- a/src/Umbraco.Tests/AngularIntegration/ServerVariablesParserTests.cs +++ b/src/Umbraco.Tests/Web/AngularIntegration/ServerVariablesParserTests.cs @@ -1,33 +1,33 @@ -using System.Collections.Generic; -using NUnit.Framework; -using Umbraco.Web.UI.JavaScript; - -namespace Umbraco.Tests.AngularIntegration -{ - [TestFixture] - public class ServerVariablesParserTests - { - - - [Test] - public void Parse() - { - var d = new Dictionary(); - d.Add("test1", "Test 1"); - d.Add("test2", "Test 2"); - d.Add("test3", "Test 3"); - d.Add("test4", "Test 4"); - d.Add("test5", "Test 5"); - - var output = ServerVariablesParser.Parse(d); - - Assert.IsTrue(output.Contains(@"Umbraco.Sys.ServerVariables = { - ""test1"": ""Test 1"", - ""test2"": ""Test 2"", - ""test3"": ""Test 3"", - ""test4"": ""Test 4"", - ""test5"": ""Test 5"" -} ;")); - } - } +using System.Collections.Generic; +using NUnit.Framework; +using Umbraco.Web.UI.JavaScript; + +namespace Umbraco.Tests.Web.AngularIntegration +{ + [TestFixture] + public class ServerVariablesParserTests + { + + + [Test] + public void Parse() + { + var d = new Dictionary(); + d.Add("test1", "Test 1"); + d.Add("test2", "Test 2"); + d.Add("test3", "Test 3"); + d.Add("test4", "Test 4"); + d.Add("test5", "Test 5"); + + var output = ServerVariablesParser.Parse(d); + + Assert.IsTrue(output.Contains(@"Umbraco.Sys.ServerVariables = { + ""test1"": ""Test 1"", + ""test2"": ""Test 2"", + ""test3"": ""Test 3"", + ""test4"": ""Test 4"", + ""test5"": ""Test 5"" +} ;")); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Controllers/BackOfficeControllerUnitTests.cs b/src/Umbraco.Tests/Web/Controllers/BackOfficeControllerUnitTests.cs similarity index 97% rename from src/Umbraco.Tests/Controllers/BackOfficeControllerUnitTests.cs rename to src/Umbraco.Tests/Web/Controllers/BackOfficeControllerUnitTests.cs index 59626a1b9a..d068c2466a 100644 --- a/src/Umbraco.Tests/Controllers/BackOfficeControllerUnitTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/BackOfficeControllerUnitTests.cs @@ -2,7 +2,7 @@ using NUnit.Framework; using Umbraco.Web.Editors; -namespace Umbraco.Tests.Controllers +namespace Umbraco.Tests.Web.Controllers { [TestFixture] public class BackOfficeControllerUnitTests diff --git a/src/Umbraco.Tests/Controllers/PluginControllerAreaTests.cs b/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs similarity index 98% rename from src/Umbraco.Tests/Controllers/PluginControllerAreaTests.cs rename to src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs index a2ad7220a5..ce88f32131 100644 --- a/src/Umbraco.Tests/Controllers/PluginControllerAreaTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/PluginControllerAreaTests.cs @@ -4,7 +4,7 @@ using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Mvc; -namespace Umbraco.Tests.Controllers +namespace Umbraco.Tests.Web.Controllers { [TestFixture] public class PluginControllerAreaTests : BaseWebTest diff --git a/src/Umbraco.Tests/Controllers/WebApiEditors/ContentControllerUnitTests.cs b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/ContentControllerUnitTests.cs similarity index 97% rename from src/Umbraco.Tests/Controllers/WebApiEditors/ContentControllerUnitTests.cs rename to src/Umbraco.Tests/Web/Controllers/WebApiEditors/ContentControllerUnitTests.cs index 687fe05f09..4b78df671d 100644 --- a/src/Umbraco.Tests/Controllers/WebApiEditors/ContentControllerUnitTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/ContentControllerUnitTests.cs @@ -1,366 +1,366 @@ -using System.Collections.Generic; -using System.Web.Http; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Services; -using Umbraco.Web.Editors; - -namespace Umbraco.Tests.Controllers.WebApiEditors -{ - [TestFixture] - public class ContentControllerUnitTests - { - [Test] - public void Access_Allowed_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - var contentMock = new Mock(); - contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); - var content = contentMock.Object; - var contentServiceMock = new Mock(); - contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); - var contentService = contentServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, null, contentService, 1234); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void Throws_Exception_When_No_Content_Found() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - var contentMock = new Mock(); - contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); - var content = contentMock.Object; - var contentServiceMock = new Mock(); - contentServiceMock.Setup(x => x.GetById(0)).Returns(content); - var contentService = contentServiceMock.Object; - var userServiceMock = new Mock(); - var permissions = new List(); - userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); - var userService = userServiceMock.Object; - - //act/assert - Assert.Throws(() => ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F' })); - } - - [Test] - public void No_Access_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(9876); - var user = userMock.Object; - var contentMock = new Mock(); - contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); - var content = contentMock.Object; - var contentServiceMock = new Mock(); - contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); - var contentService = contentServiceMock.Object; - var userServiceMock = new Mock(); - var permissions = new List(); - userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void No_Access_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - var contentMock = new Mock(); - contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); - var content = contentMock.Object; - var contentServiceMock = new Mock(); - contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); - var contentService = contentServiceMock.Object; - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A", "B", "C" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void Access_Allowed_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - var contentMock = new Mock(); - contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); - var content = contentMock.Object; - var contentServiceMock = new Mock(); - contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); - var contentService = contentServiceMock.Object; - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A", "F", "C" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void Access_To_Root_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -1); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void Access_To_Recycle_Bin_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -20); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void No_Access_To_Recycle_Bin_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(1234); - var user = userMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -20); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void No_Access_To_Root_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(1234); - var user = userMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -1); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void Access_To_Root_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, -1)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -1, new[] { 'A'}); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void No_Access_To_Root_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, -1)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -1, new[] { 'B'}); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void Access_To_Recycle_Bin_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, -20)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -20, new[] { 'A'}); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void No_Access_To_Recycle_Bin_By_Permission() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - var userServiceMock = new Mock(); - var permissions = new List - { - new EntityPermission(9, 1234, new string[]{ "A" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, -20)).Returns(permissions); - var userService = userServiceMock.Object; - - //act - var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -20, new[] { 'B'}); - - //assert - Assert.IsFalse(result); - } - - } - - //NOTE: The below self hosted stuff does work so need to get some tests written. Some are not possible atm because - // of the legacy SQL calls like checking permissions. - - //[TestFixture] - //public class ContentControllerHostedTests : BaseRoutingTest - //{ - - // protected override DatabaseBehavior DatabaseTestBehavior - // { - // get { return DatabaseBehavior.NoDatabasePerFixture; } - // } - - // public override void TearDown() - // { - // base.TearDown(); - // UmbracoAuthorizeAttribute.Enable = true; - // UmbracoApplicationAuthorizeAttribute.Enable = true; - // } - - // /// - // /// Tests to ensure that the response filter works so that any items the user - // /// doesn't have access to are removed - // /// - // [Test] - // public async void Get_By_Ids_Response_Filtered() - // { - // UmbracoAuthorizeAttribute.Enable = false; - // UmbracoApplicationAuthorizeAttribute.Enable = false; - - // var baseUrl = string.Format("http://{0}:9876", Environment.MachineName); - // var url = baseUrl + "/api/Content/GetByIds?ids=1&ids=2"; - - // var routingCtx = GetRoutingContext(url, 1234, null, true); - - // var config = new HttpSelfHostConfiguration(baseUrl); - // using (var server = new HttpSelfHostServer(config)) - // { - // var route = config.Routes.MapHttpRoute("test", "api/Content/GetByIds", - // new - // { - // controller = "Content", - // action = "GetByIds", - // id = RouteParameter.Optional - // }); - // route.DataTokens["Namespaces"] = new string[] { "Umbraco.Web.Editors" }; - - // var client = new HttpClient(server); - - // var request = new HttpRequestMessage - // { - // RequestUri = new Uri(url), - // Method = HttpMethod.Get - // }; - - // var result = await client.SendAsync(request); - // } - - // } - - //} -} +using System.Collections.Generic; +using System.Web.Http; +using Moq; +using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services; +using Umbraco.Web.Editors; + +namespace Umbraco.Tests.Web.Controllers.WebApiEditors +{ + [TestFixture] + public class ContentControllerUnitTests + { + [Test] + public void Access_Allowed_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + var contentMock = new Mock(); + contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); + var content = contentMock.Object; + var contentServiceMock = new Mock(); + contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); + var contentService = contentServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, null, contentService, 1234); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void Throws_Exception_When_No_Content_Found() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + var contentMock = new Mock(); + contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); + var content = contentMock.Object; + var contentServiceMock = new Mock(); + contentServiceMock.Setup(x => x.GetById(0)).Returns(content); + var contentService = contentServiceMock.Object; + var userServiceMock = new Mock(); + var permissions = new List(); + userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); + var userService = userServiceMock.Object; + + //act/assert + Assert.Throws(() => ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F' })); + } + + [Test] + public void No_Access_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(9876); + var user = userMock.Object; + var contentMock = new Mock(); + contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); + var content = contentMock.Object; + var contentServiceMock = new Mock(); + contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); + var contentService = contentServiceMock.Object; + var userServiceMock = new Mock(); + var permissions = new List(); + userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void No_Access_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + var contentMock = new Mock(); + contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); + var content = contentMock.Object; + var contentServiceMock = new Mock(); + contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); + var contentService = contentServiceMock.Object; + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A", "B", "C" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void Access_Allowed_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + var contentMock = new Mock(); + contentMock.Setup(c => c.Path).Returns("-1,1234,5678"); + var content = contentMock.Object; + var contentServiceMock = new Mock(); + contentServiceMock.Setup(x => x.GetById(1234)).Returns(content); + var contentService = contentServiceMock.Object; + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A", "F", "C" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, 1234)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, contentService, 1234, new[] { 'F'}); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void Access_To_Root_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -1); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void Access_To_Recycle_Bin_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -20); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void No_Access_To_Recycle_Bin_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(1234); + var user = userMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -20); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void No_Access_To_Root_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(1234); + var user = userMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, null, null, -1); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void Access_To_Root_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, -1)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -1, new[] { 'A'}); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void No_Access_To_Root_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, -1)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -1, new[] { 'B'}); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void Access_To_Recycle_Bin_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, -20)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -20, new[] { 'A'}); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void No_Access_To_Recycle_Bin_By_Permission() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + var userServiceMock = new Mock(); + var permissions = new List + { + new EntityPermission(9, 1234, new string[]{ "A" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, -20)).Returns(permissions); + var userService = userServiceMock.Object; + + //act + var result = ContentController.CheckPermissions(new Dictionary(), user, userService, null, -20, new[] { 'B'}); + + //assert + Assert.IsFalse(result); + } + + } + + //NOTE: The below self hosted stuff does work so need to get some tests written. Some are not possible atm because + // of the legacy SQL calls like checking permissions. + + //[TestFixture] + //public class ContentControllerHostedTests : BaseRoutingTest + //{ + + // protected override DatabaseBehavior DatabaseTestBehavior + // { + // get { return DatabaseBehavior.NoDatabasePerFixture; } + // } + + // public override void TearDown() + // { + // base.TearDown(); + // UmbracoAuthorizeAttribute.Enable = true; + // UmbracoApplicationAuthorizeAttribute.Enable = true; + // } + + // /// + // /// Tests to ensure that the response filter works so that any items the user + // /// doesn't have access to are removed + // /// + // [Test] + // public async void Get_By_Ids_Response_Filtered() + // { + // UmbracoAuthorizeAttribute.Enable = false; + // UmbracoApplicationAuthorizeAttribute.Enable = false; + + // var baseUrl = string.Format("http://{0}:9876", Environment.MachineName); + // var url = baseUrl + "/api/Content/GetByIds?ids=1&ids=2"; + + // var routingCtx = GetRoutingContext(url, 1234, null, true); + + // var config = new HttpSelfHostConfiguration(baseUrl); + // using (var server = new HttpSelfHostServer(config)) + // { + // var route = config.Routes.MapHttpRoute("test", "api/Content/GetByIds", + // new + // { + // controller = "Content", + // action = "GetByIds", + // id = RouteParameter.Optional + // }); + // route.DataTokens["Namespaces"] = new string[] { "Umbraco.Web.Editors" }; + + // var client = new HttpClient(server); + + // var request = new HttpRequestMessage + // { + // RequestUri = new Uri(url), + // Method = HttpMethod.Get + // }; + + // var result = await client.SendAsync(request); + // } + + // } + + //} +} diff --git a/src/Umbraco.Tests/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs similarity index 96% rename from src/Umbraco.Tests/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs rename to src/Umbraco.Tests/Web/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs index c0076f17fb..1ebe2fc748 100644 --- a/src/Umbraco.Tests/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/FilterAllowedOutgoingContentAttributeTests.cs @@ -1,136 +1,136 @@ -using System.Collections.Generic; -using System.Linq; -using System.Net.Http; -using System.Net.Http.Formatting; -using System.Net.Http.Headers; -using Moq; -using NUnit.Framework; -using Umbraco.Core; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Services; -using Umbraco.Web.Models.ContentEditing; -using Umbraco.Web.WebApi.Filters; - -namespace Umbraco.Tests.Controllers.WebApiEditors -{ - [TestFixture] - public class FilterAllowedOutgoingContentAttributeTests - { - [Test] - public void GetValueFromResponse_Already_EnumerableContent() - { - var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); - var val = new List() {new ContentItemBasic()}; - var result = att.GetValueFromResponse( - new ObjectContent(typeof (IEnumerable), - val, - new JsonMediaTypeFormatter(), - new MediaTypeHeaderValue("html/text"))); - - Assert.AreEqual(val, result); - Assert.AreEqual(1, ((IEnumerable)result).Count()); - } - - [Test] - public void GetValueFromResponse_From_Property() - { - var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable), "MyList"); - var val = new List() { new ContentItemBasic() }; - var container = new MyTestClass() {MyList = val}; - - var result = att.GetValueFromResponse( - new ObjectContent(typeof(MyTestClass), - container, - new JsonMediaTypeFormatter(), - new MediaTypeHeaderValue("html/text"))); - - Assert.AreEqual(val, result); - Assert.AreEqual(1, ((IEnumerable)result).Count()); - } - - [Test] - public void GetValueFromResponse_Returns_Null_Not_Found_Property() - { - var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable), "DontFind"); - var val = new List() { new ContentItemBasic() }; - var container = new MyTestClass() { MyList = val }; - - var result = att.GetValueFromResponse( - new ObjectContent(typeof(MyTestClass), - container, - new JsonMediaTypeFormatter(), - new MediaTypeHeaderValue("html/text"))); - - Assert.AreEqual(null, result); - - } - - [Test] - public void Filter_On_Start_Node() - { - var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); - var list = new List(); - var path = ""; - for (var i = 0; i < 10; i++) - { - if (i > 0 && path.EndsWith(",") == false) - { - path += ","; - } - path += i.ToInvariantString(); - list.Add(new ContentItemBasic { Id = i, Name = "Test" + i, ParentId = i, Path = path }); - } - - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(5); - var user = userMock.Object; - - att.FilterBasedOnStartNode(list, user); - - Assert.AreEqual(5, list.Count); - - } - - [Test] - public void Filter_On_Permissions() - { - var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); - var list = new List(); - for (var i = 0; i < 10; i++) - { - list.Add(new ContentItemBasic{Id = i, Name = "Test" + i, ParentId = -1}); - } - var ids = list.Select(x => (int)x.Id).ToArray(); - - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartContentId).Returns(-1); - var user = userMock.Object; - - var userServiceMock = new Mock(); - //we're only assigning 3 nodes browse permissions so that is what we expect as a result - var permissions = new List - { - new EntityPermission(9, 1, new string[]{ "F" }), - new EntityPermission(9, 2, new string[]{ "F" }), - new EntityPermission(9, 3, new string[]{ "F" }), - new EntityPermission(9, 4, new string[]{ "A" }) - }; - userServiceMock.Setup(x => x.GetPermissions(user, ids)).Returns(permissions); - var userService = userServiceMock.Object; - - att.FilterBasedOnPermissions(list, user, userService); - - Assert.AreEqual(3, list.Count); - Assert.AreEqual(1, list.ElementAt(0).Id); - Assert.AreEqual(2, list.ElementAt(1).Id); - Assert.AreEqual(3, list.ElementAt(2).Id); - } - - private class MyTestClass - { - public IEnumerable MyList { get; set; } - } - } +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Net.Http.Formatting; +using System.Net.Http.Headers; +using Moq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services; +using Umbraco.Web.Models.ContentEditing; +using Umbraco.Web.WebApi.Filters; + +namespace Umbraco.Tests.Web.Controllers.WebApiEditors +{ + [TestFixture] + public class FilterAllowedOutgoingContentAttributeTests + { + [Test] + public void GetValueFromResponse_Already_EnumerableContent() + { + var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); + var val = new List() {new ContentItemBasic()}; + var result = att.GetValueFromResponse( + new ObjectContent(typeof (IEnumerable), + val, + new JsonMediaTypeFormatter(), + new MediaTypeHeaderValue("html/text"))); + + Assert.AreEqual(val, result); + Assert.AreEqual(1, ((IEnumerable)result).Count()); + } + + [Test] + public void GetValueFromResponse_From_Property() + { + var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable), "MyList"); + var val = new List() { new ContentItemBasic() }; + var container = new MyTestClass() {MyList = val}; + + var result = att.GetValueFromResponse( + new ObjectContent(typeof(MyTestClass), + container, + new JsonMediaTypeFormatter(), + new MediaTypeHeaderValue("html/text"))); + + Assert.AreEqual(val, result); + Assert.AreEqual(1, ((IEnumerable)result).Count()); + } + + [Test] + public void GetValueFromResponse_Returns_Null_Not_Found_Property() + { + var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable), "DontFind"); + var val = new List() { new ContentItemBasic() }; + var container = new MyTestClass() { MyList = val }; + + var result = att.GetValueFromResponse( + new ObjectContent(typeof(MyTestClass), + container, + new JsonMediaTypeFormatter(), + new MediaTypeHeaderValue("html/text"))); + + Assert.AreEqual(null, result); + + } + + [Test] + public void Filter_On_Start_Node() + { + var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); + var list = new List(); + var path = ""; + for (var i = 0; i < 10; i++) + { + if (i > 0 && path.EndsWith(",") == false) + { + path += ","; + } + path += i.ToInvariantString(); + list.Add(new ContentItemBasic { Id = i, Name = "Test" + i, ParentId = i, Path = path }); + } + + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(5); + var user = userMock.Object; + + att.FilterBasedOnStartNode(list, user); + + Assert.AreEqual(5, list.Count); + + } + + [Test] + public void Filter_On_Permissions() + { + var att = new FilterAllowedOutgoingContentAttribute(typeof(IEnumerable)); + var list = new List(); + for (var i = 0; i < 10; i++) + { + list.Add(new ContentItemBasic{Id = i, Name = "Test" + i, ParentId = -1}); + } + var ids = list.Select(x => (int)x.Id).ToArray(); + + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartContentId).Returns(-1); + var user = userMock.Object; + + var userServiceMock = new Mock(); + //we're only assigning 3 nodes browse permissions so that is what we expect as a result + var permissions = new List + { + new EntityPermission(9, 1, new string[]{ "F" }), + new EntityPermission(9, 2, new string[]{ "F" }), + new EntityPermission(9, 3, new string[]{ "F" }), + new EntityPermission(9, 4, new string[]{ "A" }) + }; + userServiceMock.Setup(x => x.GetPermissions(user, ids)).Returns(permissions); + var userService = userServiceMock.Object; + + att.FilterBasedOnPermissions(list, user, userService); + + Assert.AreEqual(3, list.Count); + Assert.AreEqual(1, list.ElementAt(0).Id); + Assert.AreEqual(2, list.ElementAt(1).Id); + Assert.AreEqual(3, list.ElementAt(2).Id); + } + + private class MyTestClass + { + public IEnumerable MyList { get; set; } + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Controllers/WebApiEditors/MediaControllerUnitTests.cs b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/MediaControllerUnitTests.cs similarity index 96% rename from src/Umbraco.Tests/Controllers/WebApiEditors/MediaControllerUnitTests.cs rename to src/Umbraco.Tests/Web/Controllers/WebApiEditors/MediaControllerUnitTests.cs index c426b35b9c..2d5420409c 100644 --- a/src/Umbraco.Tests/Controllers/WebApiEditors/MediaControllerUnitTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/WebApiEditors/MediaControllerUnitTests.cs @@ -1,142 +1,142 @@ -using System.Collections.Generic; -using System.Web.Http; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Models; -using Umbraco.Core.Models.Membership; -using Umbraco.Core.Services; -using Umbraco.Web.Editors; - -namespace Umbraco.Tests.Controllers.WebApiEditors -{ - [TestFixture] - public class MediaControllerUnitTests - { - [Test] - public void Access_Allowed_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartMediaId).Returns(-1); - var user = userMock.Object; - var mediaMock = new Mock(); - mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); - var media = mediaMock.Object; - var mediaServiceMock = new Mock(); - mediaServiceMock.Setup(x => x.GetById(1234)).Returns(media); - var mediaService = mediaServiceMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void Throws_Exception_When_No_Media_Found() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartMediaId).Returns(-1); - var user = userMock.Object; - var mediaMock = new Mock(); - mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); - var media = mediaMock.Object; - var mediaServiceMock = new Mock(); - mediaServiceMock.Setup(x => x.GetById(0)).Returns(media); - var mediaService = mediaServiceMock.Object; - - //act/assert - Assert.Throws(() => MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234)); - } - - [Test] - public void No_Access_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(9); - userMock.Setup(u => u.StartMediaId).Returns(9876); - var user = userMock.Object; - var mediaMock = new Mock(); - mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); - var media = mediaMock.Object; - var mediaServiceMock = new Mock(); - mediaServiceMock.Setup(x => x.GetById(1234)).Returns(media); - var mediaService = mediaServiceMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void Access_To_Root_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartMediaId).Returns(-1); - var user = userMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, null, -1); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void No_Access_To_Root_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartMediaId).Returns(1234); - var user = userMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, null, -1); - - //assert - Assert.IsFalse(result); - } - - [Test] - public void Access_To_Recycle_Bin_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartMediaId).Returns(-1); - var user = userMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, null, -21); - - //assert - Assert.IsTrue(result); - } - - [Test] - public void No_Access_To_Recycle_Bin_By_Path() - { - //arrange - var userMock = new Mock(); - userMock.Setup(u => u.Id).Returns(0); - userMock.Setup(u => u.StartMediaId).Returns(1234); - var user = userMock.Object; - - //act - var result = MediaController.CheckPermissions(new Dictionary(), user, null, -21); - - //assert - Assert.IsFalse(result); - } - } +using System.Collections.Generic; +using System.Web.Http; +using Moq; +using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Membership; +using Umbraco.Core.Services; +using Umbraco.Web.Editors; + +namespace Umbraco.Tests.Web.Controllers.WebApiEditors +{ + [TestFixture] + public class MediaControllerUnitTests + { + [Test] + public void Access_Allowed_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartMediaId).Returns(-1); + var user = userMock.Object; + var mediaMock = new Mock(); + mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); + var media = mediaMock.Object; + var mediaServiceMock = new Mock(); + mediaServiceMock.Setup(x => x.GetById(1234)).Returns(media); + var mediaService = mediaServiceMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void Throws_Exception_When_No_Media_Found() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartMediaId).Returns(-1); + var user = userMock.Object; + var mediaMock = new Mock(); + mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); + var media = mediaMock.Object; + var mediaServiceMock = new Mock(); + mediaServiceMock.Setup(x => x.GetById(0)).Returns(media); + var mediaService = mediaServiceMock.Object; + + //act/assert + Assert.Throws(() => MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234)); + } + + [Test] + public void No_Access_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(9); + userMock.Setup(u => u.StartMediaId).Returns(9876); + var user = userMock.Object; + var mediaMock = new Mock(); + mediaMock.Setup(m => m.Path).Returns("-1,1234,5678"); + var media = mediaMock.Object; + var mediaServiceMock = new Mock(); + mediaServiceMock.Setup(x => x.GetById(1234)).Returns(media); + var mediaService = mediaServiceMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, mediaService, 1234); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void Access_To_Root_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartMediaId).Returns(-1); + var user = userMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, null, -1); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void No_Access_To_Root_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartMediaId).Returns(1234); + var user = userMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, null, -1); + + //assert + Assert.IsFalse(result); + } + + [Test] + public void Access_To_Recycle_Bin_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartMediaId).Returns(-1); + var user = userMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, null, -21); + + //assert + Assert.IsTrue(result); + } + + [Test] + public void No_Access_To_Recycle_Bin_By_Path() + { + //arrange + var userMock = new Mock(); + userMock.Setup(u => u.Id).Returns(0); + userMock.Setup(u => u.StartMediaId).Returns(1234); + var user = userMock.Object; + + //act + var result = MediaController.CheckPermissions(new Dictionary(), user, null, -21); + + //assert + Assert.IsFalse(result); + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Mvc/HtmlHelperExtensionMethodsTests.cs b/src/Umbraco.Tests/Web/Mvc/HtmlHelperExtensionMethodsTests.cs similarity index 95% rename from src/Umbraco.Tests/Mvc/HtmlHelperExtensionMethodsTests.cs rename to src/Umbraco.Tests/Web/Mvc/HtmlHelperExtensionMethodsTests.cs index beb51fa651..adf5772f76 100644 --- a/src/Umbraco.Tests/Mvc/HtmlHelperExtensionMethodsTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/HtmlHelperExtensionMethodsTests.cs @@ -2,7 +2,7 @@ using System.Web.Mvc; using NUnit.Framework; using Umbraco.Web; -namespace Umbraco.Tests.Mvc +namespace Umbraco.Tests.Web.Mvc { [TestFixture] public class HtmlHelperExtensionMethodsTests diff --git a/src/Umbraco.Tests/Mvc/MergeParentContextViewDataAttributeTests.cs b/src/Umbraco.Tests/Web/Mvc/MergeParentContextViewDataAttributeTests.cs similarity index 97% rename from src/Umbraco.Tests/Mvc/MergeParentContextViewDataAttributeTests.cs rename to src/Umbraco.Tests/Web/Mvc/MergeParentContextViewDataAttributeTests.cs index 2a7a05420c..8358a1a768 100644 --- a/src/Umbraco.Tests/Mvc/MergeParentContextViewDataAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/MergeParentContextViewDataAttributeTests.cs @@ -1,86 +1,86 @@ -using System.Web.Mvc; -using System.Web.Routing; -using NUnit.Framework; -using Umbraco.Tests.TestHelpers; -using Umbraco.Web.Mvc; - -namespace Umbraco.Tests.Mvc -{ - [TestFixture] - public class MergeParentContextViewDataAttributeTests - { - [Test] - public void Ensure_All_Ancestor_ViewData_Is_Merged() - { - var http = new FakeHttpContextFactory("http://localhost"); - - //setup an heirarchy - var rootViewCtx = new ViewContext {Controller = new MyController(), RequestContext = http.RequestContext, ViewData = new ViewDataDictionary()}; - var parentViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, RouteData = new RouteData(), ViewData = new ViewDataDictionary() }; - parentViewCtx.RouteData.DataTokens.Add("ParentActionViewContext", rootViewCtx); - var controllerCtx = new ControllerContext(http.RequestContext, new MyController()) {RouteData = new RouteData()}; - controllerCtx.RouteData.DataTokens.Add("ParentActionViewContext", parentViewCtx); - - //set up the view data - controllerCtx.Controller.ViewData["Test1"] = "Test1"; - controllerCtx.Controller.ViewData["Test2"] = "Test2"; - controllerCtx.Controller.ViewData["Test3"] = "Test3"; - parentViewCtx.ViewData["Test4"] = "Test4"; - parentViewCtx.ViewData["Test5"] = "Test5"; - parentViewCtx.ViewData["Test6"] = "Test6"; - rootViewCtx.ViewData["Test7"] = "Test7"; - rootViewCtx.ViewData["Test8"] = "Test8"; - rootViewCtx.ViewData["Test9"] = "Test9"; - - var filter = new ResultExecutingContext(controllerCtx, new ContentResult()) {RouteData = controllerCtx.RouteData}; - var att = new MergeParentContextViewDataAttribute(); - - Assert.IsTrue(filter.IsChildAction); - att.OnResultExecuting(filter); - - Assert.AreEqual(9, controllerCtx.Controller.ViewData.Count); - } - - [Test] - public void Ensure_All_Ancestor_ViewData_Is_Merged_Without_Data_Loss() - { - var http = new FakeHttpContextFactory("http://localhost"); - - //setup an heirarchy - var rootViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, ViewData = new ViewDataDictionary() }; - var parentViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, RouteData = new RouteData(), ViewData = new ViewDataDictionary() }; - parentViewCtx.RouteData.DataTokens.Add("ParentActionViewContext", rootViewCtx); - var controllerCtx = new ControllerContext(http.RequestContext, new MyController()) { RouteData = new RouteData() }; - controllerCtx.RouteData.DataTokens.Add("ParentActionViewContext", parentViewCtx); - - //set up the view data with overlapping keys - controllerCtx.Controller.ViewData["Test1"] = "Test1"; - controllerCtx.Controller.ViewData["Test2"] = "Test2"; - controllerCtx.Controller.ViewData["Test3"] = "Test3"; - parentViewCtx.ViewData["Test2"] = "Test4"; - parentViewCtx.ViewData["Test3"] = "Test5"; - parentViewCtx.ViewData["Test4"] = "Test6"; - rootViewCtx.ViewData["Test3"] = "Test7"; - rootViewCtx.ViewData["Test4"] = "Test8"; - rootViewCtx.ViewData["Test5"] = "Test9"; - - var filter = new ResultExecutingContext(controllerCtx, new ContentResult()) { RouteData = controllerCtx.RouteData }; - var att = new MergeParentContextViewDataAttribute(); - - Assert.IsTrue(filter.IsChildAction); - att.OnResultExecuting(filter); - - Assert.AreEqual(5, controllerCtx.Controller.ViewData.Count); - Assert.AreEqual("Test1", controllerCtx.Controller.ViewData["Test1"]); - Assert.AreEqual("Test2", controllerCtx.Controller.ViewData["Test2"]); - Assert.AreEqual("Test3", controllerCtx.Controller.ViewData["Test3"]); - Assert.AreEqual("Test6", controllerCtx.Controller.ViewData["Test4"]); - Assert.AreEqual("Test9", controllerCtx.Controller.ViewData["Test5"]); - } - - internal class MyController : Controller - { - - } - } +using System.Web.Mvc; +using System.Web.Routing; +using NUnit.Framework; +using Umbraco.Tests.TestHelpers; +using Umbraco.Web.Mvc; + +namespace Umbraco.Tests.Web.Mvc +{ + [TestFixture] + public class MergeParentContextViewDataAttributeTests + { + [Test] + public void Ensure_All_Ancestor_ViewData_Is_Merged() + { + var http = new FakeHttpContextFactory("http://localhost"); + + //setup an heirarchy + var rootViewCtx = new ViewContext {Controller = new MyController(), RequestContext = http.RequestContext, ViewData = new ViewDataDictionary()}; + var parentViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, RouteData = new RouteData(), ViewData = new ViewDataDictionary() }; + parentViewCtx.RouteData.DataTokens.Add("ParentActionViewContext", rootViewCtx); + var controllerCtx = new ControllerContext(http.RequestContext, new MyController()) {RouteData = new RouteData()}; + controllerCtx.RouteData.DataTokens.Add("ParentActionViewContext", parentViewCtx); + + //set up the view data + controllerCtx.Controller.ViewData["Test1"] = "Test1"; + controllerCtx.Controller.ViewData["Test2"] = "Test2"; + controllerCtx.Controller.ViewData["Test3"] = "Test3"; + parentViewCtx.ViewData["Test4"] = "Test4"; + parentViewCtx.ViewData["Test5"] = "Test5"; + parentViewCtx.ViewData["Test6"] = "Test6"; + rootViewCtx.ViewData["Test7"] = "Test7"; + rootViewCtx.ViewData["Test8"] = "Test8"; + rootViewCtx.ViewData["Test9"] = "Test9"; + + var filter = new ResultExecutingContext(controllerCtx, new ContentResult()) {RouteData = controllerCtx.RouteData}; + var att = new MergeParentContextViewDataAttribute(); + + Assert.IsTrue(filter.IsChildAction); + att.OnResultExecuting(filter); + + Assert.AreEqual(9, controllerCtx.Controller.ViewData.Count); + } + + [Test] + public void Ensure_All_Ancestor_ViewData_Is_Merged_Without_Data_Loss() + { + var http = new FakeHttpContextFactory("http://localhost"); + + //setup an heirarchy + var rootViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, ViewData = new ViewDataDictionary() }; + var parentViewCtx = new ViewContext { Controller = new MyController(), RequestContext = http.RequestContext, RouteData = new RouteData(), ViewData = new ViewDataDictionary() }; + parentViewCtx.RouteData.DataTokens.Add("ParentActionViewContext", rootViewCtx); + var controllerCtx = new ControllerContext(http.RequestContext, new MyController()) { RouteData = new RouteData() }; + controllerCtx.RouteData.DataTokens.Add("ParentActionViewContext", parentViewCtx); + + //set up the view data with overlapping keys + controllerCtx.Controller.ViewData["Test1"] = "Test1"; + controllerCtx.Controller.ViewData["Test2"] = "Test2"; + controllerCtx.Controller.ViewData["Test3"] = "Test3"; + parentViewCtx.ViewData["Test2"] = "Test4"; + parentViewCtx.ViewData["Test3"] = "Test5"; + parentViewCtx.ViewData["Test4"] = "Test6"; + rootViewCtx.ViewData["Test3"] = "Test7"; + rootViewCtx.ViewData["Test4"] = "Test8"; + rootViewCtx.ViewData["Test5"] = "Test9"; + + var filter = new ResultExecutingContext(controllerCtx, new ContentResult()) { RouteData = controllerCtx.RouteData }; + var att = new MergeParentContextViewDataAttribute(); + + Assert.IsTrue(filter.IsChildAction); + att.OnResultExecuting(filter); + + Assert.AreEqual(5, controllerCtx.Controller.ViewData.Count); + Assert.AreEqual("Test1", controllerCtx.Controller.ViewData["Test1"]); + Assert.AreEqual("Test2", controllerCtx.Controller.ViewData["Test2"]); + Assert.AreEqual("Test3", controllerCtx.Controller.ViewData["Test3"]); + Assert.AreEqual("Test6", controllerCtx.Controller.ViewData["Test4"]); + Assert.AreEqual("Test9", controllerCtx.Controller.ViewData["Test5"]); + } + + internal class MyController : Controller + { + + } + } } \ No newline at end of file diff --git a/src/Umbraco.Tests/Mvc/RenderIndexActionSelectorAttributeTests.cs b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs similarity index 99% rename from src/Umbraco.Tests/Mvc/RenderIndexActionSelectorAttributeTests.cs rename to src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs index 3f327d3155..f99272ad85 100644 --- a/src/Umbraco.Tests/Mvc/RenderIndexActionSelectorAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/RenderIndexActionSelectorAttributeTests.cs @@ -17,7 +17,7 @@ using Umbraco.Web.Mvc; using Umbraco.Web.Routing; using Umbraco.Web.Security; -namespace Umbraco.Tests.Mvc +namespace Umbraco.Tests.Web.Mvc { [TestFixture] public class RenderIndexActionSelectorAttributeTests diff --git a/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs similarity index 98% rename from src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs rename to src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs index 29a76b29d2..7c5921c67a 100644 --- a/src/Umbraco.Tests/Mvc/SurfaceControllerTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/SurfaceControllerTests.cs @@ -1,5 +1,4 @@ using System; -using System.CodeDom; using System.Linq; using System.Web; using System.Web.Mvc; @@ -12,7 +11,6 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Dictionary; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Profiling; @@ -20,11 +18,10 @@ using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Web; using Umbraco.Web.Mvc; -using Umbraco.Web.PublishedCache; using Umbraco.Web.Routing; using Umbraco.Web.Security; -namespace Umbraco.Tests.Mvc +namespace Umbraco.Tests.Web.Mvc { [TestFixture] public class SurfaceControllerTests diff --git a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs similarity index 96% rename from src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs rename to src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs index 89ec6c85b7..168356fd6e 100644 --- a/src/Umbraco.Tests/Mvc/UmbracoViewPageTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/UmbracoViewPageTests.cs @@ -1,504 +1,500 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Web.Mvc; -using System.Web.Routing; -using System.Xml; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Configuration.UmbracoSettings; -using Umbraco.Core.Logging; -using Umbraco.Core.Persistence; -using Umbraco.Core.Persistence.SqlSyntax; -using Umbraco.Core.Persistence.UnitOfWork; -using Umbraco.Core.Profiling; -using Umbraco.Core.Services; -using Umbraco.Web.Security; -using umbraco.BusinessLogic; -using Umbraco.Core; -using Umbraco.Core.Events; -using Umbraco.Core.Models; -using Umbraco.Core.Models.PublishedContent; -using Umbraco.Tests.PublishedContent; -using Umbraco.Tests.TestHelpers; -using Umbraco.Tests.TestHelpers.Stubs; -using Umbraco.Web; -using Umbraco.Web.Models; -using Umbraco.Web.Mvc; -using Umbraco.Web.PublishedCache; -using Umbraco.Web.PublishedCache.XmlPublishedCache; -using Umbraco.Web.Routing; - -namespace Umbraco.Tests.Mvc -{ - [TestFixture] - public class UmbracoViewPageTests - { - #region RenderModel To ... - - [Test] - public void RenderModel_To_RenderModel() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelTestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.AreSame(model, view.Model); - } - - [Test] - public void RenderModel_ContentType1_To_ContentType1() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void RenderModel_ContentType2_To_ContentType1() - { - var content = new ContentType2(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void RenderModel_ContentType1_To_ContentType2() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType2TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - - Assert.Throws(() => view.SetViewDataX(viewData)); - } - - [Test] - public void RenderModel_ContentType1_To_RenderModelOf_ContentType1() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void RenderModel_ContentType2_To_RenderModelOf_ContentType1() - { - var content = new ContentType2(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void RenderModel_ContentType1_To_RenderModelOf_ContentType2() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType2TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - - Assert.Throws(() => view.SetViewDataX(viewData)); - } - - #endregion - - #region RenderModelOf To ... - - [Test] - public void RenderModelOf_ContentType1_To_RenderModel() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelTestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.AreSame(model, view.Model); - } - - [Test] - public void RenderModelOf_ContentType1_To_ContentType1() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void RenderModelOf_ContentType2_To_ContentType1() - { - var content = new ContentType2(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void RenderModelOf_ContentType1_To_ContentType2() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new ContentType2TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - Assert.Throws(() => view.SetViewDataX(viewData)); - } - - [Test] - public void RenderModelOf_ContentType1_To_RenderModelOf_ContentType1() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void RenderModelOf_ContentType2_To_RenderModelOf_ContentType1() - { - var content = new ContentType2(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void RenderModelOf_ContentType1_To_RenderModelOf_ContentType2() - { - var content = new ContentType1(null); - var model = new RenderModel(content, CultureInfo.InvariantCulture); - var view = new RenderModelOfContentType2TestPage(); - var viewData = new ViewDataDictionary(model); - - view.ViewContext = GetViewContext(); - Assert.Throws(() => view.SetViewDataX(viewData)); - } - - #endregion - - #region ContentType To ... - - [Test] - public void ContentType1_To_RenderModel() - { - var content = new ContentType1(null); - var view = new RenderModelTestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void ContentType1_To_RenderModelOf_ContentType1() - { - var content = new ContentType1(null); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void ContentType2_To_RenderModelOf_ContentType1() - { - var content = new ContentType2(null); - var view = new RenderModelOfContentType1TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf>(view.Model); - Assert.IsInstanceOf(view.Model.Content); - } - - [Test] - public void ContentType1_To_RenderModelOf_ContentType2() - { - var content = new ContentType1(null); - var view = new RenderModelOfContentType2TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - Assert.Throws(() =>view.SetViewDataX(viewData)); - } - - [Test] - public void ContentType1_To_ContentType1() - { - var content = new ContentType1(null); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - [Test] - public void ContentType1_To_ContentType2() - { - var content = new ContentType1(null); - var view = new ContentType2TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - Assert.Throws(() => view.SetViewDataX(viewData)); - } - - [Test] - public void ContentType2_To_ContentType1() - { - var content = new ContentType2(null); - var view = new ContentType1TestPage(); - var viewData = new ViewDataDictionary(content); - - view.ViewContext = GetViewContext(); - view.SetViewDataX(viewData); - - Assert.IsInstanceOf(view.Model); - } - - #endregion - - #region Test elements - - public class TestPage : UmbracoViewPage - { - public override void Execute() - { - throw new NotImplementedException(); - } - - public void SetViewDataX(ViewDataDictionary viewData) - { - SetViewData(viewData); - } - } - - public class RenderModelTestPage : TestPage - { } - - public class RenderModelOfContentType1TestPage : TestPage> - { } - - public class RenderModelOfContentType2TestPage : TestPage> - { } - - public class ContentType1TestPage : TestPage - { } - - public class ContentType2TestPage : TestPage - { } - - public class ContentType1 : PublishedContentWrapped - { - public ContentType1(IPublishedContent content) : base(content) {} - } - - public class ContentType2 : ContentType1 - { - public ContentType2(IPublishedContent content) : base(content) { } - } - - #endregion - - #region Test helpers - - ServiceContext GetServiceContext(IUmbracoSettingsSection umbracoSettings, ILogger logger) - { - var svcCtx = new ServiceContext( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new PackagingService( - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), - new Mock().Object), - new Mock().Object, - new RelationService( - new Mock().Object, - new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), - logger, - new TransientMessagesFactory(), - new Mock().Object), - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - new Mock().Object, - Mock.Of(), - Mock.Of(), - Mock.Of()); - return svcCtx; - } - - ViewContext GetViewContext() - { - var settings = SettingsForTests.GetDefault(); - var logger = Mock.Of(); - var umbracoContext = GetUmbracoContext( - logger, settings, - "/dang", 0); - - var urlProvider = new UrlProvider(umbracoContext, settings.WebRouting, new IUrlProvider[] { new DefaultUrlProvider(settings.RequestHandler) }); - var routingContext = new RoutingContext( - umbracoContext, - Enumerable.Empty(), - new FakeLastChanceFinder(), - urlProvider); - umbracoContext.RoutingContext = routingContext; - - var request = new PublishedContentRequest( - new Uri("http://localhost/dang"), - routingContext, - settings.WebRouting, - s => Enumerable.Empty()); - - request.Culture = CultureInfo.InvariantCulture; - umbracoContext.PublishedContentRequest = request; - - var context = new ViewContext(); - context.RouteData = new RouteData(); - context.RouteData.DataTokens.Add(Umbraco.Core.Constants.Web.UmbracoContextDataToken, umbracoContext); - - return context; - } - - protected UmbracoContext GetUmbracoContext(ILogger logger, IUmbracoSettingsSection umbracoSettings, string url, int templateId, RouteData routeData = null, bool setSingleton = false) - { - var cache = new PublishedContentCache(); - - //cache.GetXmlDelegate = (context, preview) => - //{ - // var doc = new XmlDocument(); - // doc.LoadXml(GetXmlContent(templateId)); - // return doc; - //}; - - //PublishedContentCache.UnitTesting = true; - - // ApplicationContext.Current = new ApplicationContext(false) { IsReady = true }; - var svcCtx = GetServiceContext(umbracoSettings, logger); - - var appCtx = new ApplicationContext( - new DatabaseContext(Mock.Of(), logger, Mock.Of(), "test"), - svcCtx, - CacheHelper.CreateDisabledCacheHelper(), - new ProfilingLogger(logger, Mock.Of())) { IsReady = true }; - - var http = GetHttpContextFactory(url, routeData).HttpContext; - var ctx = new UmbracoContext( - GetHttpContextFactory(url, routeData).HttpContext, - appCtx, - new PublishedCaches(cache, new PublishedMediaCache(appCtx)), - new WebSecurity(http, appCtx)); - - //if (setSingleton) - //{ - // UmbracoContext.Current = ctx; - //} - - return ctx; - } - - protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) - { - var factory = routeData != null - ? new FakeHttpContextFactory(url, routeData) - : new FakeHttpContextFactory(url); - - - //set the state helper - StateHelper.HttpContext = factory.HttpContext; - - return factory; - } - - #endregion - } -} +using System; +using System.Globalization; +using System.Linq; +using System.Web.Mvc; +using System.Web.Routing; +using Moq; +using NUnit.Framework; +using umbraco.BusinessLogic; +using Umbraco.Core; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Events; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.SqlSyntax; +using Umbraco.Core.Persistence.UnitOfWork; +using Umbraco.Core.Profiling; +using Umbraco.Core.Services; +using Umbraco.Tests.TestHelpers; +using Umbraco.Tests.TestHelpers.Stubs; +using Umbraco.Web; +using Umbraco.Web.Models; +using Umbraco.Web.Mvc; +using Umbraco.Web.PublishedCache; +using Umbraco.Web.PublishedCache.XmlPublishedCache; +using Umbraco.Web.Routing; +using Umbraco.Web.Security; + +namespace Umbraco.Tests.Web.Mvc +{ + [TestFixture] + public class UmbracoViewPageTests + { + #region RenderModel To ... + + [Test] + public void RenderModel_To_RenderModel() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelTestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.AreSame(model, view.Model); + } + + [Test] + public void RenderModel_ContentType1_To_ContentType1() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void RenderModel_ContentType2_To_ContentType1() + { + var content = new ContentType2(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void RenderModel_ContentType1_To_ContentType2() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType2TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + + Assert.Throws(() => view.SetViewDataX(viewData)); + } + + [Test] + public void RenderModel_ContentType1_To_RenderModelOf_ContentType1() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void RenderModel_ContentType2_To_RenderModelOf_ContentType1() + { + var content = new ContentType2(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void RenderModel_ContentType1_To_RenderModelOf_ContentType2() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType2TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + + Assert.Throws(() => view.SetViewDataX(viewData)); + } + + #endregion + + #region RenderModelOf To ... + + [Test] + public void RenderModelOf_ContentType1_To_RenderModel() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelTestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.AreSame(model, view.Model); + } + + [Test] + public void RenderModelOf_ContentType1_To_ContentType1() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void RenderModelOf_ContentType2_To_ContentType1() + { + var content = new ContentType2(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void RenderModelOf_ContentType1_To_ContentType2() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new ContentType2TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + Assert.Throws(() => view.SetViewDataX(viewData)); + } + + [Test] + public void RenderModelOf_ContentType1_To_RenderModelOf_ContentType1() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void RenderModelOf_ContentType2_To_RenderModelOf_ContentType1() + { + var content = new ContentType2(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void RenderModelOf_ContentType1_To_RenderModelOf_ContentType2() + { + var content = new ContentType1(null); + var model = new RenderModel(content, CultureInfo.InvariantCulture); + var view = new RenderModelOfContentType2TestPage(); + var viewData = new ViewDataDictionary(model); + + view.ViewContext = GetViewContext(); + Assert.Throws(() => view.SetViewDataX(viewData)); + } + + #endregion + + #region ContentType To ... + + [Test] + public void ContentType1_To_RenderModel() + { + var content = new ContentType1(null); + var view = new RenderModelTestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void ContentType1_To_RenderModelOf_ContentType1() + { + var content = new ContentType1(null); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void ContentType2_To_RenderModelOf_ContentType1() + { + var content = new ContentType2(null); + var view = new RenderModelOfContentType1TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf>(view.Model); + Assert.IsInstanceOf(view.Model.Content); + } + + [Test] + public void ContentType1_To_RenderModelOf_ContentType2() + { + var content = new ContentType1(null); + var view = new RenderModelOfContentType2TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + Assert.Throws(() =>view.SetViewDataX(viewData)); + } + + [Test] + public void ContentType1_To_ContentType1() + { + var content = new ContentType1(null); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + [Test] + public void ContentType1_To_ContentType2() + { + var content = new ContentType1(null); + var view = new ContentType2TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + Assert.Throws(() => view.SetViewDataX(viewData)); + } + + [Test] + public void ContentType2_To_ContentType1() + { + var content = new ContentType2(null); + var view = new ContentType1TestPage(); + var viewData = new ViewDataDictionary(content); + + view.ViewContext = GetViewContext(); + view.SetViewDataX(viewData); + + Assert.IsInstanceOf(view.Model); + } + + #endregion + + #region Test elements + + public class TestPage : UmbracoViewPage + { + public override void Execute() + { + throw new NotImplementedException(); + } + + public void SetViewDataX(ViewDataDictionary viewData) + { + SetViewData(viewData); + } + } + + public class RenderModelTestPage : TestPage + { } + + public class RenderModelOfContentType1TestPage : TestPage> + { } + + public class RenderModelOfContentType2TestPage : TestPage> + { } + + public class ContentType1TestPage : TestPage + { } + + public class ContentType2TestPage : TestPage + { } + + public class ContentType1 : PublishedContentWrapped + { + public ContentType1(IPublishedContent content) : base(content) {} + } + + public class ContentType2 : ContentType1 + { + public ContentType2(IPublishedContent content) : base(content) { } + } + + #endregion + + #region Test helpers + + ServiceContext GetServiceContext(IUmbracoSettingsSection umbracoSettings, ILogger logger) + { + var svcCtx = new ServiceContext( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new PackagingService( + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), + new Mock().Object), + new Mock().Object, + new RelationService( + new Mock().Object, + new RepositoryFactory(CacheHelper.CreateDisabledCacheHelper(), logger, Mock.Of(), umbracoSettings), + logger, + new TransientMessagesFactory(), + new Mock().Object), + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + new Mock().Object, + Mock.Of(), + Mock.Of(), + Mock.Of()); + return svcCtx; + } + + ViewContext GetViewContext() + { + var settings = SettingsForTests.GetDefault(); + var logger = Mock.Of(); + var umbracoContext = GetUmbracoContext( + logger, settings, + "/dang", 0); + + var urlProvider = new UrlProvider(umbracoContext, settings.WebRouting, new IUrlProvider[] { new DefaultUrlProvider(settings.RequestHandler) }); + var routingContext = new RoutingContext( + umbracoContext, + Enumerable.Empty(), + new FakeLastChanceFinder(), + urlProvider); + umbracoContext.RoutingContext = routingContext; + + var request = new PublishedContentRequest( + new Uri("http://localhost/dang"), + routingContext, + settings.WebRouting, + s => Enumerable.Empty()); + + request.Culture = CultureInfo.InvariantCulture; + umbracoContext.PublishedContentRequest = request; + + var context = new ViewContext(); + context.RouteData = new RouteData(); + context.RouteData.DataTokens.Add(Umbraco.Core.Constants.Web.UmbracoContextDataToken, umbracoContext); + + return context; + } + + protected UmbracoContext GetUmbracoContext(ILogger logger, IUmbracoSettingsSection umbracoSettings, string url, int templateId, RouteData routeData = null, bool setSingleton = false) + { + var cache = new PublishedContentCache(); + + //cache.GetXmlDelegate = (context, preview) => + //{ + // var doc = new XmlDocument(); + // doc.LoadXml(GetXmlContent(templateId)); + // return doc; + //}; + + //PublishedContentCache.UnitTesting = true; + + // ApplicationContext.Current = new ApplicationContext(false) { IsReady = true }; + var svcCtx = GetServiceContext(umbracoSettings, logger); + + var appCtx = new ApplicationContext( + new DatabaseContext(Mock.Of(), logger, Mock.Of(), "test"), + svcCtx, + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(logger, Mock.Of())) { IsReady = true }; + + var http = GetHttpContextFactory(url, routeData).HttpContext; + var ctx = new UmbracoContext( + GetHttpContextFactory(url, routeData).HttpContext, + appCtx, + new PublishedCaches(cache, new PublishedMediaCache(appCtx)), + new WebSecurity(http, appCtx)); + + //if (setSingleton) + //{ + // UmbracoContext.Current = ctx; + //} + + return ctx; + } + + protected FakeHttpContextFactory GetHttpContextFactory(string url, RouteData routeData = null) + { + var factory = routeData != null + ? new FakeHttpContextFactory(url, routeData) + : new FakeHttpContextFactory(url); + + + //set the state helper + StateHelper.HttpContext = factory.HttpContext; + + return factory; + } + + #endregion + } +} diff --git a/src/Umbraco.Tests/Mvc/ViewDataDictionaryExtensionTests.cs b/src/Umbraco.Tests/Web/Mvc/ViewDataDictionaryExtensionTests.cs similarity index 87% rename from src/Umbraco.Tests/Mvc/ViewDataDictionaryExtensionTests.cs rename to src/Umbraco.Tests/Web/Mvc/ViewDataDictionaryExtensionTests.cs index 4c06d30796..869fd1b329 100644 --- a/src/Umbraco.Tests/Mvc/ViewDataDictionaryExtensionTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/ViewDataDictionaryExtensionTests.cs @@ -1,42 +1,40 @@ -using System.Collections.Generic; -using System.Text; -using System.Web.Mvc; -using NUnit.Framework; -using Umbraco.Web.Mvc; - -namespace Umbraco.Tests.Mvc -{ - [TestFixture] - public class ViewDataDictionaryExtensionTests - { - [Test] - public void Merge_View_Data() - { - var source = new ViewDataDictionary(); - var dest = new ViewDataDictionary(); - source.Add("Test1", "Test1"); - dest.Add("Test2", "Test2"); - - dest.MergeViewDataFrom(source); - - Assert.AreEqual(2, dest.Count); - } - - [Test] - public void Merge_View_Data_Retains_Destination_Values() - { - var source = new ViewDataDictionary(); - var dest = new ViewDataDictionary(); - source.Add("Test1", "Test1"); - dest.Add("Test1", "MyValue"); - dest.Add("Test2", "Test2"); - - dest.MergeViewDataFrom(source); - - Assert.AreEqual(2, dest.Count); - Assert.AreEqual("MyValue", dest["Test1"]); - Assert.AreEqual("Test2", dest["Test2"]); - } - - } -} +using System.Web.Mvc; +using NUnit.Framework; +using Umbraco.Web.Mvc; + +namespace Umbraco.Tests.Web.Mvc +{ + [TestFixture] + public class ViewDataDictionaryExtensionTests + { + [Test] + public void Merge_View_Data() + { + var source = new ViewDataDictionary(); + var dest = new ViewDataDictionary(); + source.Add("Test1", "Test1"); + dest.Add("Test2", "Test2"); + + dest.MergeViewDataFrom(source); + + Assert.AreEqual(2, dest.Count); + } + + [Test] + public void Merge_View_Data_Retains_Destination_Values() + { + var source = new ViewDataDictionary(); + var dest = new ViewDataDictionary(); + source.Add("Test1", "Test1"); + dest.Add("Test1", "MyValue"); + dest.Add("Test2", "Test2"); + + dest.MergeViewDataFrom(source); + + Assert.AreEqual(2, dest.Count); + Assert.AreEqual("MyValue", dest["Test1"]); + Assert.AreEqual("Test2", dest["Test2"]); + } + + } +} From e56881abc64910f35513961b194e49fafd52fd10 Mon Sep 17 00:00:00 2001 From: Shannon Date: Wed, 17 Feb 2016 11:21:15 +0100 Subject: [PATCH 5/5] adds unit tests for new ext methods --- .../DistributedCache/DistributedCacheTests.cs | 10 +- .../Integration/GetCultureTests.cs | 6 +- .../Routing/DomainsAndCulturesTests.cs | 2 +- src/Umbraco.Tests/Umbraco.Tests.csproj | 9 +- .../Web/WebExtensionMethodTests.cs | 170 ++++++++++++++++++ 5 files changed, 184 insertions(+), 13 deletions(-) create mode 100644 src/Umbraco.Tests/Web/WebExtensionMethodTests.cs diff --git a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs index 8873a72de4..4c74b12159 100644 --- a/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs +++ b/src/Umbraco.Tests/Cache/DistributedCache/DistributedCacheTests.cs @@ -42,7 +42,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { for (var i = 1; i < 11; i++) { - Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); + global::Umbraco.Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); } Assert.AreEqual(10, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).IntIdsRefreshed.Count); } @@ -52,7 +52,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { for (var i = 0; i < 10; i++) { - Web.Cache.DistributedCache.Instance.Refresh( + global::Umbraco.Web.Cache.DistributedCache.Instance.Refresh( Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), x => x.Id, new TestObjectWithId{Id = i}); @@ -65,7 +65,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { for (var i = 0; i < 11; i++) { - Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), Guid.NewGuid()); + global::Umbraco.Web.Cache.DistributedCache.Instance.Refresh(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), Guid.NewGuid()); } Assert.AreEqual(11, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).GuidIdsRefreshed.Count); } @@ -75,7 +75,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { for (var i = 1; i < 13; i++) { - Web.Cache.DistributedCache.Instance.Remove(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); + global::Umbraco.Web.Cache.DistributedCache.Instance.Remove(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73"), i); } Assert.AreEqual(12, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).IntIdsRemoved.Count); } @@ -85,7 +85,7 @@ namespace Umbraco.Tests.Cache.DistributedCache { for (var i = 0; i < 13; i++) { - Web.Cache.DistributedCache.Instance.RefreshAll(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73")); + global::Umbraco.Web.Cache.DistributedCache.Instance.RefreshAll(Guid.Parse("E0F452CB-DCB2-4E84-B5A5-4F01744C5C73")); } Assert.AreEqual(13, ((TestServerMessenger)ServerMessengerResolver.Current.Messenger).CountOfFullRefreshes); } diff --git a/src/Umbraco.Tests/Integration/GetCultureTests.cs b/src/Umbraco.Tests/Integration/GetCultureTests.cs index 0b630b9a41..089f766cf5 100644 --- a/src/Umbraco.Tests/Integration/GetCultureTests.cs +++ b/src/Umbraco.Tests/Integration/GetCultureTests.cs @@ -56,19 +56,19 @@ namespace Umbraco.Tests.Integration ServiceContext.DomainService.Save(new UmbracoDomain("*100112") { DomainName = "*100112", RootContentId = c3.Id, LanguageId = l2.Id }); var content = c2; - var culture = Web.Models.ContentExtensions.GetCulture(null, + var culture = global::Umbraco.Web.Models.ContentExtensions.GetCulture(null, ServiceContext.DomainService, ServiceContext.LocalizationService, ServiceContext.ContentService, content.Id, content.Path, new Uri("http://domain1.com/")); Assert.AreEqual("en-US", culture.Name); content = c2; - culture = Web.Models.ContentExtensions.GetCulture(null, + culture = global::Umbraco.Web.Models.ContentExtensions.GetCulture(null, ServiceContext.DomainService, ServiceContext.LocalizationService, ServiceContext.ContentService, content.Id, content.Path, new Uri("http://domain1.fr/")); Assert.AreEqual("fr-FR", culture.Name); content = c4; - culture = Web.Models.ContentExtensions.GetCulture(null, + culture = global::Umbraco.Web.Models.ContentExtensions.GetCulture(null, ServiceContext.DomainService, ServiceContext.LocalizationService, ServiceContext.ContentService, content.Id, content.Path, new Uri("http://domain1.fr/")); Assert.AreEqual("de-DE", culture.Name); diff --git a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs index b0f4791c84..39a88105d1 100644 --- a/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs +++ b/src/Umbraco.Tests/Routing/DomainsAndCulturesTests.cs @@ -380,7 +380,7 @@ namespace Umbraco.Tests.Routing var content = umbracoContext.ContentCache.GetById(nodeId); Assert.IsNotNull(content); - var culture = Web.Models.ContentExtensions.GetCulture(umbracoContext, domainService, ServiceContext.LocalizationService, null, content.Id, content.Path, new Uri(currentUrl)); + var culture = global::Umbraco.Web.Models.ContentExtensions.GetCulture(umbracoContext, domainService, ServiceContext.LocalizationService, null, content.Id, content.Path, new Uri(currentUrl)); Assert.AreEqual(expectedCulture, culture.Name); } } diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 592d5b98e7..a0b215e887 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -175,10 +175,10 @@ - - - - + + + + @@ -576,6 +576,7 @@ + diff --git a/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs new file mode 100644 index 0000000000..3978d53977 --- /dev/null +++ b/src/Umbraco.Tests/Web/WebExtensionMethodTests.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; +using Moq; +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Configuration.UmbracoSettings; +using Umbraco.Core.Logging; +using Umbraco.Core.Profiling; +using Umbraco.Web; +using Umbraco.Web.Mvc; +using Umbraco.Web.Routing; +using Umbraco.Web.Security; + +namespace Umbraco.Tests.Web +{ + [TestFixture] + public class WebExtensionMethodTests + { + + [Test] + public void UmbracoContextExtensions_GetUmbracoContext() + { + var appCtx = new ApplicationContext( + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbCtx = UmbracoContext.CreateContext( + Mock.Of(), + appCtx, + new WebSecurity(Mock.Of(), appCtx), + Mock.Of(), + new List(), + false); + var items = new Dictionary() + { + {UmbracoContext.HttpContextItemName, umbCtx} + }; + var http = new Mock(); + http.Setup(x => x.Items).Returns(items); + + var result = http.Object.GetUmbracoContext(); + + Assert.IsNotNull(result); + Assert.AreSame(umbCtx, result); + } + + [Test] + public void RouteDataExtensions_GetUmbracoContext() + { + var appCtx = new ApplicationContext( + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbCtx = UmbracoContext.CreateContext( + Mock.Of(), + appCtx, + new WebSecurity(Mock.Of(), appCtx), + Mock.Of(), + new List(), + false); + var r1 = new RouteData(); + r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); + + var result = r1.GetUmbracoContext(); + + Assert.IsNotNull(result); + Assert.AreSame(umbCtx, result); + } + + [Test] + public void ControllerContextExtensions_GetUmbracoContext_From_RouteValues() + { + var appCtx = new ApplicationContext( + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbCtx = UmbracoContext.CreateContext( + Mock.Of(), + appCtx, + new WebSecurity(Mock.Of(), appCtx), + Mock.Of(), + new List(), + false); + + var r1 = new RouteData(); + r1.DataTokens.Add(Core.Constants.Web.UmbracoContextDataToken, umbCtx); + var ctx1 = CreateViewContext(new ControllerContext(Mock.Of(), r1, new MyController())); + var r2 = new RouteData(); + r2.DataTokens.Add("ParentActionViewContext", ctx1); + var ctx2 = CreateViewContext(new ControllerContext(Mock.Of(), r2, new MyController())); + var r3 = new RouteData(); + r3.DataTokens.Add("ParentActionViewContext", ctx2); + var ctx3 = CreateViewContext(new ControllerContext(Mock.Of(), r3, new MyController())); + + var result = ctx3.GetUmbracoContext(); + + Assert.IsNotNull(result); + Assert.AreSame(umbCtx, result); + } + + [Test] + public void ControllerContextExtensions_GetUmbracoContext_From_HttpContext() + { + var appCtx = new ApplicationContext( + CacheHelper.CreateDisabledCacheHelper(), + new ProfilingLogger(Mock.Of(), Mock.Of())); + var umbCtx = UmbracoContext.CreateContext( + Mock.Of(), + appCtx, + new WebSecurity(Mock.Of(), appCtx), + Mock.Of(), + new List(), + false); + var items = new Dictionary() + { + {UmbracoContext.HttpContextItemName, umbCtx} + }; + var http = new Mock(); + http.Setup(x => x.Items).Returns(items); + + var r1 = new RouteData(); + var ctx1 = CreateViewContext(new ControllerContext(http.Object, r1, new MyController())); + var r2 = new RouteData(); + r2.DataTokens.Add("ParentActionViewContext", ctx1); + var ctx2 = CreateViewContext(new ControllerContext(http.Object, r2, new MyController())); + var r3 = new RouteData(); + r3.DataTokens.Add("ParentActionViewContext", ctx2); + var ctx3 = CreateViewContext(new ControllerContext(http.Object, r3, new MyController())); + + var result = ctx3.GetUmbracoContext(); + + Assert.IsNotNull(result); + Assert.AreSame(umbCtx, result); + } + + [Test] + public void ControllerContextExtensions_GetDataTokenInViewContextHierarchy() + { + var r1 = new RouteData(); + r1.DataTokens.Add("hello", "world"); + var ctx1 = CreateViewContext(new ControllerContext(Mock.Of(), r1, new MyController())); + var r2 = new RouteData(); + r2.DataTokens.Add("ParentActionViewContext", ctx1); + var ctx2 = CreateViewContext(new ControllerContext(Mock.Of(), r2, new MyController())); + var r3 = new RouteData(); + r3.DataTokens.Add("ParentActionViewContext", ctx2); + var ctx3 = CreateViewContext(new ControllerContext(Mock.Of(), r3, new MyController())); + + var result = ctx3.GetDataTokenInViewContextHierarchy("hello"); + + Assert.IsNotNull(result as string); + Assert.AreEqual((string)result, "world"); + } + + private ViewContext CreateViewContext(ControllerContext ctx) + { + return new ViewContext(ctx, Mock.Of(), + new ViewDataDictionary(), new TempDataDictionary(), new StringWriter()); + } + + private class MyController : Controller + { + + } + } +}