From b9765c3bec173c4431a45ffa7bd8a68ba9684b40 Mon Sep 17 00:00:00 2001 From: Shannon Date: Mon, 7 Mar 2016 17:52:28 +0100 Subject: [PATCH] fixes RenderModelBinder to use base implementation,adds unit tests --- .../Web/Mvc/RenderModelBinderTests.cs | 73 +++++++++++++++++++ src/Umbraco.Web/Mvc/RenderModelBinder.cs | 6 +- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Tests/Web/Mvc/RenderModelBinderTests.cs b/src/Umbraco.Tests/Web/Mvc/RenderModelBinderTests.cs index 5c2c1390fa..5ec039a4dd 100644 --- a/src/Umbraco.Tests/Web/Mvc/RenderModelBinderTests.cs +++ b/src/Umbraco.Tests/Web/Mvc/RenderModelBinderTests.cs @@ -1,4 +1,8 @@ +using System.Collections.Generic; using System.Globalization; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; using Moq; using NUnit.Framework; using Umbraco.Core.Models; @@ -69,6 +73,75 @@ namespace Umbraco.Tests.Web.Mvc Assert.AreSame(content, bound.Content); } + [Test] + public void No_DataToken_Returns_Null() + { + var binder = new RenderModelBinder(); + var routeData = new RouteData(); + var result = binder.BindModel(new ControllerContext(Mock.Of(), routeData, Mock.Of()), + new ModelBindingContext()); + + Assert.IsNull(result); + } + + [Test] + public void Invalid_DataToken_Model_Type_Returns_Null() + { + var binder = new RenderModelBinder(); + var routeData = new RouteData(); + routeData.DataTokens[Core.Constants.Web.UmbracoDataToken] = "hello"; + + //the value provider is the default implementation + var valueProvider = new Mock(); + //also IUnvalidatedValueProvider + var invalidatedValueProvider = valueProvider.As(); + invalidatedValueProvider.Setup(x => x.GetValue(It.IsAny(), It.IsAny())).Returns(() => + new ValueProviderResult(null, "", CultureInfo.CurrentCulture)); + + var controllerCtx = new ControllerContext( + Mock.Of(http => http.Items == new Dictionary()), + routeData, + Mock.Of()); + + var result = binder.BindModel(controllerCtx, + new ModelBindingContext + { + ValueProvider = valueProvider.Object, + ModelMetadata = new ModelMetadata(new EmptyModelMetadataProvider(), null, () => null, typeof(IPublishedContent), "content") + }); + + Assert.IsNull(result); + } + + [Test] + public void IPublishedContent_DataToken_Model_Type_Uses_DefaultImplementation() + { + var content = new MyContent(Mock.Of()); + var binder = new RenderModelBinder(); + var routeData = new RouteData(); + routeData.DataTokens[Core.Constants.Web.UmbracoDataToken] = content; + + //the value provider is the default implementation + var valueProvider = new Mock(); + //also IUnvalidatedValueProvider + var invalidatedValueProvider = valueProvider.As(); + invalidatedValueProvider.Setup(x => x.GetValue(It.IsAny(), It.IsAny())).Returns(() => + new ValueProviderResult(content, "content", CultureInfo.CurrentCulture)); + + var controllerCtx = new ControllerContext( + Mock.Of(http => http.Items == new Dictionary()), + routeData, + Mock.Of()); + var result = binder.BindModel(controllerCtx, + new ModelBindingContext + { + ValueProvider = valueProvider.Object, + ModelMetadata = new ModelMetadata(new EmptyModelMetadataProvider(), null, () => null, typeof(IPublishedContent), "content") + }); + + Assert.AreEqual(content, result); + } + public class MyOtherContent { diff --git a/src/Umbraco.Web/Mvc/RenderModelBinder.cs b/src/Umbraco.Web/Mvc/RenderModelBinder.cs index 49bb4e3026..dd9af16140 100644 --- a/src/Umbraco.Web/Mvc/RenderModelBinder.cs +++ b/src/Umbraco.Web/Mvc/RenderModelBinder.cs @@ -33,10 +33,8 @@ namespace Umbraco.Web.Mvc var renderModel = model as IRenderModel; if (renderModel == null) { - var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); - if (value == null) return null; - - model = value.RawValue; + model = base.BindModel(controllerContext, bindingContext); + if (model == null) return null; } //if for any reason the model is not either IRenderModel or IPublishedContent, then we return since those are the only