From 041d350d51c7504749a29ad869794a59aaee8281 Mon Sep 17 00:00:00 2001 From: dougbu Date: Mon, 18 Aug 2014 12:43:45 -0700 Subject: [PATCH] Test data/time templates - focus on affect of `ModelMetadata.HasNonDefaultEditFormat` and `IHtmlHelper.Html5DateRenderingMode` - work through `TemplateRenderer` because individual templates only do formatting in a few cases --- .../Rendering/DefaultEditorTemplatesTests.cs | 122 +++++++++++++++++- 1 file changed, 121 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs index e18f9012d3..066c2325ba 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs @@ -2,10 +2,10 @@ // 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.Linq; using Microsoft.AspNet.Mvc.ModelBinding; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.Testing; using Moq; using Xunit; @@ -203,6 +203,126 @@ Environment.NewLine; result.ToString()); } + // DateTime-local is not special-cased unless using Html5DateRenderingMode.Rfc3339. + [Theory] + [InlineData("date", "{0:d}", "02/01/2000")] + [InlineData("datetime", null, "02/01/2000 03:04:05 +00:00")] + [InlineData("datetime-local", null, "02/01/2000 03:04:05 +00:00")] + [InlineData("time", "{0:t}", "03:04")] + [ReplaceCulture] + public void Editor_FindsCorrectDateOrTimeTemplate(string dataTypeName, string editFormatString, string expected) + { + // Arrange + var expectedInput = ""; + var offset = TimeSpan.FromHours(0); + var model = new DateTimeOffset( + year: 2000, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5, + millisecond: 6, + offset: offset); + var viewEngine = new Mock(); + viewEngine + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) + .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); + helper.ViewData.ModelMetadata.DataTypeName = dataTypeName; + helper.ViewData.ModelMetadata.EditFormatString = editFormatString; // What [DataType] does for given type. + helper.ViewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + // Act + var result = helper.Editor(""); + + // Assert + Assert.Equal(expectedInput, result.ToString()); + } + + [Theory] + [InlineData("date", "{0:d}", "2000-01-02")] + [InlineData("datetime", null, "2000-01-02T03:04:05.060+00:00")] + [InlineData("datetime-local", null, "2000-01-02T03:04:05.060")] + [InlineData("time", "{0:t}", "03:04:05.060")] + [ReplaceCulture] + public void Editor_AppliesRfc3339(string dataTypeName, string editFormatString, string expected) + { + // Arrange + var expectedInput = ""; + + // Place DateTime-local value in current timezone. + var offset = string.Equals("", dataTypeName) ? DateTimeOffset.Now.Offset : TimeSpan.FromHours(0); + var model = new DateTimeOffset( + year: 2000, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5, + millisecond: 60, + offset: offset); + var viewEngine = new Mock(); + viewEngine + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) + .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); + helper.Html5DateRenderingMode = Html5DateRenderingMode.Rfc3339; + helper.ViewData.ModelMetadata.DataTypeName = dataTypeName; + helper.ViewData.ModelMetadata.EditFormatString = editFormatString; // What [DataType] does for given type. + helper.ViewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + // Act + var result = helper.Editor(""); + + // Assert + Assert.Equal(expectedInput, result.ToString()); + } + + [Theory] + [InlineData("date", Html5DateRenderingMode.CurrentCulture)] + [InlineData("date", Html5DateRenderingMode.Rfc3339)] + [InlineData("datetime", Html5DateRenderingMode.CurrentCulture)] + [InlineData("datetime", Html5DateRenderingMode.Rfc3339)] + [InlineData("datetime-local", Html5DateRenderingMode.CurrentCulture)] + [InlineData("datetime-local", Html5DateRenderingMode.Rfc3339)] + [InlineData("time", Html5DateRenderingMode.CurrentCulture)] + [InlineData("time", Html5DateRenderingMode.Rfc3339)] + public void Editor_AppliesNonDefaultEditFormat(string dataTypeName, Html5DateRenderingMode renderingMode) + { + // Arrange + var expectedInput = ""; + var offset = TimeSpan.FromHours(0); + var model = new DateTimeOffset( + year: 2000, + month: 1, + day: 2, + hour: 3, + minute: 4, + second: 5, + millisecond: 60, + offset: offset); + var viewEngine = new Mock(); + viewEngine + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) + .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); + var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); + helper.Html5DateRenderingMode = renderingMode; // Ignored due to HasNonDefaultEditFormat. + helper.ViewData.ModelMetadata.DataTypeName = dataTypeName; + helper.ViewData.ModelMetadata.EditFormatString = "Formatted as {0:O}"; + helper.ViewData.ModelMetadata.HasNonDefaultEditFormat = true; + helper.ViewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix"; + + // Act + var result = helper.Editor(""); + + // Assert + Assert.Equal(expectedInput, result.ToString()); + } + [Fact] public void EditorFor_FindsModel() {