// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Globalization; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.Rendering; using Microsoft.AspNet.Routing; using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.OptionsModel; using Moq; namespace Microsoft.AspNet.Mvc.Core { public class DefaultTemplatesUtilities { public class ObjectTemplateModel { public ObjectTemplateModel() { ComplexInnerModel = new object(); } public string Property1 { get; set; } public string Property2 { get; set; } public object ComplexInnerModel { get; set; } } public class ObjectWithScaffoldColumn { public string Property1 { get; set; } [ScaffoldColumn(false)] public string Property2 { get; set; } [ScaffoldColumn(true)] public string Property3 { get; set; } } public static HtmlHelper GetHtmlHelper() { return GetHtmlHelper(null); } public static HtmlHelper GetHtmlHelper(TModel model) { return GetHtmlHelper(model, CreateViewEngine()); } public static HtmlHelper GetHtmlHelper(IModelMetadataProvider provider) { return GetHtmlHelper(null, provider); } public static HtmlHelper GetHtmlHelper(TModel model, IModelMetadataProvider provider) { return GetHtmlHelper(model, CreateViewEngine(), provider); } public static HtmlHelper GetHtmlHelper(TModel model, ICompositeViewEngine viewEngine) { return GetHtmlHelper(model, viewEngine, new DataAnnotationsModelMetadataProvider()); } public static HtmlHelper GetHtmlHelper( TModel model, ICompositeViewEngine viewEngine, IModelMetadataProvider provider) { var viewData = new ViewDataDictionary(provider); viewData.Model = model; var httpContext = new Mock(); httpContext .Setup(o => o.Response) .Returns(Mock.Of()); httpContext .Setup(o => o.Items) .Returns(new Dictionary()); var actionContext = new ActionContext(httpContext.Object, new RouteData(), new ActionDescriptor()); var actionBindingContext = new ActionBindingContext(actionContext, provider, Mock.Of(), Mock.Of(), Mock.Of(), Enumerable.Empty()); var urlHelper = Mock.Of(); var actionBindingContextProvider = new Mock(); actionBindingContextProvider .Setup(c => c.GetActionBindingContextAsync(It.IsAny())) .Returns(Task.FromResult(actionBindingContext)); var serviceProvider = new Mock(); serviceProvider .Setup(s => s.GetService(typeof(ICompositeViewEngine))) .Returns(viewEngine); serviceProvider .Setup(s => s.GetService(typeof(IUrlHelper))) .Returns(urlHelper); serviceProvider .Setup(s => s.GetService(typeof(IViewComponentHelper))) .Returns(new Mock().Object); httpContext .Setup(o => o.RequestServices) .Returns(serviceProvider.Object); var viewContext = new ViewContext(actionContext, Mock.Of(), viewData, new StringWriter()); // TemplateRenderer will Contextualize this transient service. serviceProvider .Setup(s => s.GetService(typeof(IHtmlHelper))) .Returns(() => new HtmlHelper( viewEngine, provider, urlHelper, GetAntiForgeryInstance(), actionBindingContextProvider.Object)); var htmlHelper = new HtmlHelper( viewEngine, provider, urlHelper, GetAntiForgeryInstance(), actionBindingContextProvider.Object); htmlHelper.Contextualize(viewContext); return htmlHelper; } private static ICompositeViewEngine CreateViewEngine() { var view = new Mock(); view .Setup(v => v.RenderAsync(It.IsAny())) .Callback(async (ViewContext v) => { view.ToString(); await v.Writer.WriteAsync(FormatOutput(v.ViewData.ModelMetadata)); }) .Returns(Task.FromResult(0)); var viewEngine = new Mock(); viewEngine .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found("MyView", view.Object)); return viewEngine.Object; } private static AntiForgery GetAntiForgeryInstance() { var claimExtractor = new Mock(); var dataProtectionProvider = new Mock(); var additionalDataProvider = new Mock(); var optionsAccessor = new Mock>(); optionsAccessor.SetupGet(o => o.Options).Returns(new MvcOptions()); return new AntiForgery(claimExtractor.Object, dataProtectionProvider.Object, additionalDataProvider.Object, optionsAccessor.Object); } private static string FormatOutput(ModelMetadata metadata) { return string.Format(CultureInfo.InvariantCulture, "Model = {0}, ModelType = {1}, PropertyName = {2}, SimpleDisplayText = {3}", metadata.Model ?? "(null)", metadata.ModelType == null ? "(null)" : metadata.ModelType.FullName, metadata.PropertyName ?? "(null)", metadata.SimpleDisplayText ?? "(null)"); } } }