Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

426 lines
19 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Collections;
using System.Collections.Specialized;
using System.IO;
using System.Web.Routing;
using Microsoft.Web.UnitTestUtil;
using Moq;
using Xunit;
namespace System.Web.Mvc.Html.Test
{
public class FormExtensionsTest
{
private static void BeginFormHelper(Func<HtmlHelper, MvcForm> beginForm, string expectedFormTag)
{
// Arrange
StringWriter writer;
HtmlHelper htmlHelper = GetFormHelper(out writer);
// Act
IDisposable formDisposable = beginForm(htmlHelper);
formDisposable.Dispose();
// Assert
Assert.Equal(expectedFormTag + "</form>", writer.ToString());
}
[Fact]
public void BeginFormParameterDictionaryMerging()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", FormMethod.Get, new RouteValueDictionary(new { method = "post" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" method=""get"">");
}
[Fact]
public void BeginFormSetsAndRestoresToDefault()
{
// Arrange
StringWriter writer;
HtmlHelper htmlHelper = GetFormHelper(out writer);
htmlHelper.ViewContext.FormContext = null;
FormContext defaultFormContext = htmlHelper.ViewContext.FormContext;
// Act & assert - push
MvcForm theForm = htmlHelper.BeginForm();
Assert.NotNull(htmlHelper.ViewContext.FormContext);
Assert.NotEqual(defaultFormContext, htmlHelper.ViewContext.FormContext);
// Act & assert - pop
theForm.Dispose();
Assert.Equal(defaultFormContext, htmlHelper.ViewContext.FormContext);
Assert.Equal(@"<form action=""/some/path"" method=""post""></form>", writer.ToString());
}
[Fact]
public void BeginFormWithClientValidationEnabled()
{
// Arrange
StringWriter writer;
HtmlHelper htmlHelper = GetFormHelper(out writer);
htmlHelper.ViewContext.ClientValidationEnabled = true;
htmlHelper.ViewContext.FormContext = null;
FormContext defaultFormContext = htmlHelper.ViewContext.FormContext;
// Act & assert - push
MvcForm theForm = htmlHelper.BeginForm();
Assert.NotNull(htmlHelper.ViewContext.FormContext);
Assert.NotEqual(defaultFormContext, htmlHelper.ViewContext.FormContext);
Assert.Equal("form_id", htmlHelper.ViewContext.FormContext.FormId);
// Act & assert - pop
theForm.Dispose();
Assert.Equal(defaultFormContext, htmlHelper.ViewContext.FormContext);
Assert.Equal(@"<form action=""/some/path"" id=""form_id"" method=""post""></form><script type=""text/javascript"">
//<![CDATA[
if (!window.mvcClientValidationMetadata) { window.mvcClientValidationMetadata = []; }
window.mvcClientValidationMetadata.push({""Fields"":[],""FormId"":""form_id"",""ReplaceValidationSummary"":false});
//]]>
</script>", writer.ToString());
}
[Fact]
public void BeginFormWithClientValidationAndUnobtrusiveJavaScriptEnabled()
{
// Arrange
StringWriter writer;
HtmlHelper htmlHelper = GetFormHelper(out writer);
htmlHelper.ViewContext.ClientValidationEnabled = true;
htmlHelper.ViewContext.UnobtrusiveJavaScriptEnabled = true;
// Act & assert - push
MvcForm theForm = htmlHelper.BeginForm();
Assert.Null(htmlHelper.ViewContext.FormContext.FormId);
// Act & assert - pop
theForm.Dispose();
Assert.Equal(@"<form action=""/some/path"" method=""post""></form>", writer.ToString());
}
[Fact]
public void BeginFormWithActionControllerInvalidFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", (FormMethod)2, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" baz=""baz"" method=""post"">");
}
[Fact]
public void BeginFormWithActionController()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo"),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" method=""post"">");
}
[Fact]
public void BeginFormWithActionControllerFormMethodHtmlDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", FormMethod.Get, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", FormMethod.Get, new { baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerFormMethodHtmlValuesWithUnderscores()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", FormMethod.Get, new { data_test = "value" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" data-test=""value"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerRouteDictionaryFormMethodHtmlDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", new RouteValueDictionary(new { id = "id" }), FormMethod.Get, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar/id"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerRouteValuesFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", new { id = "id" }, FormMethod.Get, new { baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar/id"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerRouteValuesFormMethodHtmlValuesWithUnderscores()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", new { id = "id" }, FormMethod.Get, new { foo_baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar/id"" foo-baz=""baz"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerNullRouteValuesFormMethodNullHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("bar", "foo", null, FormMethod.Get, null),
@"<form action=""" + MvcHelper.AppPathModifier + @"/foo/bar"" method=""get"">");
}
[Fact]
public void BeginFormWithRouteValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm(new { action = "someOtherAction", id = "id" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/home/someOtherAction/id"" method=""post"">");
}
[Fact]
public void BeginFormWithRouteDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm(new RouteValueDictionary { { "action", "someOtherAction" }, { "id", "id" } }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/home/someOtherAction/id"" method=""post"">");
}
[Fact]
public void BeginFormWithActionControllerRouteValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("myAction", "myController", new { id = "id", pageNum = "123" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/myController/myAction/id?pageNum=123"" method=""post"">");
}
[Fact]
public void BeginFormWithActionControllerRouteDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("myAction", "myController", new RouteValueDictionary { { "pageNum", "123" }, { "id", "id" } }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/myController/myAction/id?pageNum=123"" method=""post"">");
}
[Fact]
public void BeginFormWithActionControllerMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("myAction", "myController", FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/myController/myAction"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerRouteValuesMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("myAction", "myController", new { id = "id", pageNum = "123" }, FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/myController/myAction/id?pageNum=123"" method=""get"">");
}
[Fact]
public void BeginFormWithActionControllerRouteDictionaryMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm("myAction", "myController", new RouteValueDictionary { { "pageNum", "123" }, { "id", "id" } }, FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/myController/myAction/id?pageNum=123"" method=""get"">");
}
[Fact]
public void BeginFormWithNoParams()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginForm(),
@"<form action=""/some/path"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithRouteNameInvalidFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", (FormMethod)2, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" baz=""baz"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithRouteName()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute"),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithRouteNameFormMethodHtmlDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", FormMethod.Get, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", FormMethod.Get, new { baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameFormMethodHtmlValuesWithUnderscores()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", FormMethod.Get, new { foo_baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" foo-baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameRouteDictionaryFormMethodHtmlDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new RouteValueDictionary(new { id = "id" }), FormMethod.Get, new RouteValueDictionary(new { baz = "baz" })),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameRouteValuesFormMethodHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new { id = "id" }, FormMethod.Get, new { baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id"" baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameRouteValuesFormMethodHtmlValuesWithUnderscores()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new { id = "id" }, FormMethod.Get, new { foo_baz = "baz" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id"" foo-baz=""baz"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteNameNullRouteValuesFormMethodNullHtmlValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", null, FormMethod.Get, null),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithRouteValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm(new { action = "someOtherAction", id = "id" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/home/someOtherAction/id"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithRouteDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm(new RouteValueDictionary { { "action", "someOtherAction" }, { "id", "id" } }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/home/someOtherAction/id"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithRouteNameRouteValues()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new { id = "id", pageNum = "123" }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id?pageNum=123"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithActionControllerRouteDictionary()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new RouteValueDictionary { { "pageNum", "123" }, { "id", "id" } }),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id?pageNum=123"" method=""post"">");
}
[Fact]
public void BeginRouteFormCanUseNamedRouteWithoutSpecifyingDefaults()
{
// DevDiv 217072: Non-mvc specific helpers should not give default values for controller and action
BeginFormHelper(
htmlHelper =>
{
htmlHelper.RouteCollection.MapRoute("MyRouteName", "any/url", new { controller = "Charlie" });
return htmlHelper.BeginRouteForm("MyRouteName");
}, @"<form action=""" + MvcHelper.AppPathModifier + @"/any/url"" method=""post"">");
}
[Fact]
public void BeginRouteFormWithActionControllerMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithActionControllerRouteValuesMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new { id = "id", pageNum = "123" }, FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id?pageNum=123"" method=""get"">");
}
[Fact]
public void BeginRouteFormWithActionControllerRouteDictionaryMethod()
{
BeginFormHelper(
htmlHelper => htmlHelper.BeginRouteForm("namedroute", new RouteValueDictionary { { "pageNum", "123" }, { "id", "id" } }, FormMethod.Get),
@"<form action=""" + MvcHelper.AppPathModifier + @"/named/home/oldaction/id?pageNum=123"" method=""get"">");
}
[Fact]
public void EndFormWritesCloseTag()
{
// Arrange
StringWriter writer;
HtmlHelper htmlHelper = GetFormHelper(out writer);
// Act
htmlHelper.EndForm();
// Assert
Assert.Equal("</form>", writer.ToString());
}
private static HtmlHelper GetFormHelper(out StringWriter writer)
{
Mock<ViewContext> mockViewContext = new Mock<ViewContext>() { CallBase = true };
mockViewContext.Setup(c => c.HttpContext.Request.Url).Returns(new Uri("http://www.contoso.com/some/path"));
mockViewContext.Setup(c => c.HttpContext.Request.RawUrl).Returns("/some/path");
mockViewContext.Setup(c => c.HttpContext.Request.ApplicationPath).Returns("/");
mockViewContext.Setup(c => c.HttpContext.Request.Path).Returns("/");
mockViewContext.Setup(c => c.HttpContext.Request.ServerVariables).Returns((NameValueCollection)null);
mockViewContext.Setup(c => c.HttpContext.Response.Write(It.IsAny<string>())).Throws(new Exception("Should not be called"));
mockViewContext.Setup(c => c.HttpContext.Items).Returns(new Hashtable());
writer = new StringWriter();
mockViewContext.Setup(c => c.Writer).Returns(writer);
mockViewContext.Setup(c => c.HttpContext.Response.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(r => MvcHelper.AppPathModifier + r);
RouteCollection rt = new RouteCollection();
rt.Add(new Route("{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) });
rt.Add("namedroute", new Route("named/{controller}/{action}/{id}", null) { Defaults = new RouteValueDictionary(new { id = "defaultid" }) });
RouteData rd = new RouteData();
rd.Values.Add("controller", "home");
rd.Values.Add("action", "oldaction");
mockViewContext.Setup(c => c.RouteData).Returns(rd);
HtmlHelper helper = new HtmlHelper(mockViewContext.Object, new Mock<IViewDataContainer>().Object, rt);
helper.ViewContext.FormIdGenerator = () => "form_id";
return helper;
}
}
}