diff --git a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs index a08eb1faa1..58fd52496d 100644 --- a/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs +++ b/src/Umbraco.Tests.UnitTests/Umbraco.Web.Website/Routing/UmbracoRouteValuesFactoryTests.cs @@ -1,5 +1,9 @@ using System; +using System.Collections.Generic; +using System.Reflection; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc.Abstractions; +using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging.Abstractions; @@ -10,6 +14,8 @@ using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Services; using Umbraco.Core.Strings; +using Umbraco.Extensions; +using Umbraco.Web.Common.Controllers; using Umbraco.Web.Common.Routing; using Umbraco.Web.Features; using Umbraco.Web.Routing; @@ -22,11 +28,14 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.Website.Routing [TestFixture] public class UmbracoRouteValuesFactoryTests { - private UmbracoRouteValuesFactory GetFactory(out Mock publishedRouter, out UmbracoRenderingDefaults renderingDefaults) + private UmbracoRouteValuesFactory GetFactory( + out Mock publishedRouter, + out UmbracoRenderingDefaults renderingDefaults, + out IPublishedRequest request) { var builder = new PublishedRequestBuilder(new Uri("https://example.com"), Mock.Of()); builder.SetPublishedContent(Mock.Of()); - IPublishedRequest request = builder.Build(); + request = builder.Build(); publishedRouter = new Mock(); publishedRouter.Setup(x => x.UpdateRequestToNotFound(It.IsAny())) @@ -35,13 +44,26 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.Website.Routing renderingDefaults = new UmbracoRenderingDefaults(); + // add the default one + var actionDescriptors = new List + { + new ControllerActionDescriptor + { + ControllerName = ControllerExtensions.GetControllerName(), + ActionName = nameof(RenderController.Index), + ControllerTypeInfo = typeof(RenderController).GetTypeInfo() + } + }; + var actionSelector = new Mock(); + actionSelector.Setup(x => x.SelectCandidates(It.IsAny())).Returns(actionDescriptors); + var factory = new UmbracoRouteValuesFactory( renderingDefaults, Mock.Of(), new UmbracoFeatures(), new ControllerActionSearcher( new NullLogger(), - Mock.Of()), + actionSelector.Object), publishedRouter.Object); return factory; @@ -50,11 +72,7 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.Website.Routing [Test] public void Update_Request_To_Not_Found_When_No_Template() { - var builder = new PublishedRequestBuilder(new Uri("https://example.com"), Mock.Of()); - builder.SetPublishedContent(Mock.Of()); - IPublishedRequest request = builder.Build(); - - UmbracoRouteValuesFactory factory = GetFactory(out Mock publishedRouter, out _); + UmbracoRouteValuesFactory factory = GetFactory(out Mock publishedRouter, out _, out IPublishedRequest request); UmbracoRouteValues result = factory.Create(new DefaultHttpContext(), request); @@ -65,14 +83,8 @@ namespace Umbraco.Tests.UnitTests.Umbraco.Web.Website.Routing [Test] public void Adds_Result_To_Route_Value_Dictionary() { - var builder = new PublishedRequestBuilder(new Uri("https://example.com"), Mock.Of()); - builder.SetPublishedContent(Mock.Of()); - builder.SetTemplate(Mock.Of()); - IPublishedRequest request = builder.Build(); + UmbracoRouteValuesFactory factory = GetFactory(out _, out UmbracoRenderingDefaults renderingDefaults, out IPublishedRequest request); - UmbracoRouteValuesFactory factory = GetFactory(out _, out UmbracoRenderingDefaults renderingDefaults); - - var routeVals = new RouteValueDictionary(); UmbracoRouteValues result = factory.Create(new DefaultHttpContext(), request); Assert.IsNotNull(result); diff --git a/src/Umbraco.Web.Website/ActionResults/RedirectToUmbracoUrlResult.cs b/src/Umbraco.Web.Website/ActionResults/RedirectToUmbracoUrlResult.cs index 6a7b4d678d..1c12a33714 100644 --- a/src/Umbraco.Web.Website/ActionResults/RedirectToUmbracoUrlResult.cs +++ b/src/Umbraco.Web.Website/ActionResults/RedirectToUmbracoUrlResult.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ViewFeatures; @@ -14,27 +14,24 @@ namespace Umbraco.Web.Website.ActionResults /// to the current page but the current page is actually a rewritten URL normally done with something like /// Server.Transfer. It is also handy if you want to persist the query strings. /// - public class RedirectToUmbracoUrlResult : IActionResult + public class RedirectToUmbracoUrlResult : IActionResult, IKeepTempDataResult { private readonly IUmbracoContext _umbracoContext; /// - /// Creates a new RedirectToUmbracoResult + /// Initializes a new instance of the class. /// - /// - public RedirectToUmbracoUrlResult(IUmbracoContext umbracoContext) - { - _umbracoContext = umbracoContext; - } + public RedirectToUmbracoUrlResult(IUmbracoContext umbracoContext) => _umbracoContext = umbracoContext; + /// public Task ExecuteResultAsync(ActionContext context) { - if (context is null) throw new ArgumentNullException(nameof(context)); + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } var destinationUrl = _umbracoContext.OriginalRequestUrl.PathAndQuery; - var tempDataDictionaryFactory = context.HttpContext.RequestServices.GetRequiredService(); - var tempData = tempDataDictionaryFactory.GetTempData(context.HttpContext); - tempData?.Keep(); context.HttpContext.Response.Redirect(destinationUrl);