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

2050 lines
73 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.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Reflection;
using System.Security.Principal;
using System.Text;
using System.Web.Mvc.Async;
using System.Web.Profile;
using System.Web.Routing;
using System.Web.TestUtil;
using Microsoft.Web.UnitTestUtil;
using Moq;
using Moq.Protected;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class ControllerTest
{
[Fact]
public void ActionInvokerProperty()
{
// Arrange
Controller controller = new EmptyController();
// Act & Assert
MemberHelper.TestPropertyWithDefaultInstance(controller, "ActionInvoker", new ControllerActionInvoker());
}
[Fact]
public void ContentWithContentString()
{
// Arrange
Controller controller = new EmptyController();
string content = "Some content";
// Act
ContentResult result = controller.Content(content);
// Assert
Assert.Equal(content, result.Content);
}
[Fact]
public void ContentWithContentStringAndContentType()
{
// Arrange
Controller controller = new EmptyController();
string content = "Some content";
string contentType = "Some content type";
// Act
ContentResult result = controller.Content(content, contentType);
// Assert
Assert.Equal(content, result.Content);
Assert.Equal(contentType, result.ContentType);
}
[Fact]
public void ContentWithContentStringAndContentTypeAndEncoding()
{
// Arrange
Controller controller = new EmptyController();
string content = "Some content";
string contentType = "Some content type";
Encoding contentEncoding = Encoding.UTF8;
// Act
ContentResult result = controller.Content(content, contentType, contentEncoding);
// Assert
Assert.Equal(content, result.Content);
Assert.Equal(contentType, result.ContentType);
Assert.Same(contentEncoding, result.ContentEncoding);
}
[Fact]
public void ContextProperty()
{
var controller = new EmptyController();
MemberHelper.TestPropertyValue(controller, "ControllerContext", new Mock<ControllerContext>().Object);
}
[Fact]
public void HttpContextProperty()
{
var c = new EmptyController();
Assert.Null(c.HttpContext);
Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext).Returns(mockHttpContext.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockHttpContext.Object, c.HttpContext);
}
[Fact]
public void HttpNotFound()
{
// Arrange
var c = new EmptyController();
// Act
HttpNotFoundResult result = c.HttpNotFound();
// Assert
Assert.NotNull(result);
Assert.Null(result.StatusDescription);
Assert.Equal(404, result.StatusCode);
}
[Fact]
public void HttpNotFoundWithNullStatusDescription()
{
// Arrange
var c = new EmptyController();
// Act
HttpNotFoundResult result = c.HttpNotFound(statusDescription: null);
// Assert
Assert.NotNull(result);
Assert.Null(result.StatusDescription);
Assert.Equal(404, result.StatusCode);
}
[Fact]
public void HttpNotFoundWithStatusDescription()
{
// Arrange
var c = new EmptyController();
// Act
HttpNotFoundResult result = c.HttpNotFound(statusDescription: "I lost it");
// Assert
Assert.NotNull(result);
Assert.Equal("I lost it", result.StatusDescription);
Assert.Equal(404, result.StatusCode);
}
[Fact]
public void ModelStateProperty()
{
// Arrange
Controller controller = new EmptyController();
// Act & assert
Assert.Same(controller.ViewData.ModelState, controller.ModelState);
}
[Fact]
public void ProfileProperty()
{
var c = new EmptyController();
Assert.Null(c.Profile);
Mock<ProfileBase> mockProfile = new Mock<ProfileBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.Profile).Returns(mockProfile.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockProfile.Object, c.Profile);
}
[Fact]
public void RequestProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
Mock<HttpRequestBase> mockHttpRequest = new Mock<HttpRequestBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.Request).Returns(mockHttpRequest.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockHttpRequest.Object, c.Request);
}
[Fact]
public void ResponseProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
Mock<HttpResponseBase> mockHttpResponse = new Mock<HttpResponseBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.Response).Returns(mockHttpResponse.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockHttpResponse.Object, c.Response);
}
[Fact]
public void ServerProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
Mock<HttpServerUtilityBase> mockServerUtility = new Mock<HttpServerUtilityBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.Server).Returns(mockServerUtility.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockServerUtility.Object, c.Server);
}
[Fact]
public void SessionProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
Mock<HttpSessionStateBase> mockSessionState = new Mock<HttpSessionStateBase>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.Session).Returns(mockSessionState.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Same(mockSessionState.Object, c.Session);
}
[Fact]
public void UrlProperty()
{
// Arrange
EmptyController controller = new EmptyController();
RequestContext requestContext = new RequestContext(new Mock<HttpContextBase>().Object, new RouteData());
// Act
controller.PublicInitialize(requestContext);
// Assert
Assert.NotNull(controller.Url);
}
[Fact]
public void UserProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
Mock<IPrincipal> mockUser = new Mock<IPrincipal>();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.HttpContext.User).Returns(mockUser.Object);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(mockUser.Object, c.User);
}
[Fact]
public void RouteDataProperty()
{
var c = new EmptyController();
Assert.Null(c.Request);
RouteData rd = new RouteData();
Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
mockControllerContext.Setup(cc => cc.Controller).Returns(c);
mockControllerContext.Setup(cc => cc.RouteData).Returns(rd);
c.ControllerContext = mockControllerContext.Object;
Assert.Equal(rd, c.RouteData);
}
[Fact]
public void ControllerMethodsDoNotHaveNonActionAttribute()
{
var methods = typeof(Controller).GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var method in methods)
{
var attrs = method.GetCustomAttributes(typeof(NonActionAttribute), true /* inherit */);
Assert.True(attrs.Length == 0, "Methods on the Controller class should not be marked [NonAction]: " + method);
}
}
[Fact]
public void DisposeCallsProtectedDisposingMethod()
{
// Arrange
Mock<Controller> mockController = new Mock<Controller>();
mockController.Protected().Setup("Dispose", true).Verifiable();
Controller controller = mockController.Object;
// Act
controller.Dispose();
// Assert
mockController.Verify();
}
[Fact]
public void ExecuteWithUnknownAction()
{
// Arrange
UnknownActionController controller = new UnknownActionController();
// We need a provider since Controller.Execute is called
controller.TempDataProvider = new EmptyTempDataProvider();
ControllerContext context = GetControllerContext("Foo");
Mock<IActionInvoker> mockInvoker = new Mock<IActionInvoker>();
mockInvoker.Setup(o => o.InvokeAction(context, "Foo")).Returns(false);
controller.ActionInvoker = mockInvoker.Object;
// Act
((IController)controller).Execute(context.RequestContext);
// Assert
Assert.True(controller.WasCalled);
}
[Fact]
public void FileWithContents()
{
// Arrange
EmptyController controller = new EmptyController();
byte[] fileContents = new byte[0];
// Act
FileContentResult result = controller.File(fileContents, "someContentType");
// Assert
Assert.NotNull(result);
Assert.Same(fileContents, result.FileContents);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal(String.Empty, result.FileDownloadName);
}
[Fact]
public void FileWithContentsAndFileDownloadName()
{
// Arrange
EmptyController controller = new EmptyController();
byte[] fileContents = new byte[0];
// Act
FileContentResult result = controller.File(fileContents, "someContentType", "someDownloadName");
// Assert
Assert.NotNull(result);
Assert.Same(fileContents, result.FileContents);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal("someDownloadName", result.FileDownloadName);
}
[Fact]
public void FileWithPath()
{
// Arrange
EmptyController controller = new EmptyController();
// Act
FilePathResult result = controller.File("somePath", "someContentType");
// Assert
Assert.NotNull(result);
Assert.Equal("somePath", result.FileName);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal(String.Empty, result.FileDownloadName);
}
[Fact]
public void FileWithPathAndFileDownloadName()
{
// Arrange
EmptyController controller = new EmptyController();
// Act
FilePathResult result = controller.File("somePath", "someContentType", "someDownloadName");
// Assert
Assert.NotNull(result);
Assert.Equal("somePath", result.FileName);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal("someDownloadName", result.FileDownloadName);
}
[Fact]
public void FileWithStream()
{
// Arrange
EmptyController controller = new EmptyController();
Stream fileStream = Stream.Null;
// Act
FileStreamResult result = controller.File(fileStream, "someContentType");
// Assert
Assert.NotNull(result);
Assert.Same(fileStream, result.FileStream);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal(String.Empty, result.FileDownloadName);
}
[Fact]
public void FileWithStreamAndFileDownloadName()
{
// Arrange
EmptyController controller = new EmptyController();
Stream fileStream = Stream.Null;
// Act
FileStreamResult result = controller.File(fileStream, "someContentType", "someDownloadName");
// Assert
Assert.NotNull(result);
Assert.Same(fileStream, result.FileStream);
Assert.Equal("someContentType", result.ContentType);
Assert.Equal("someDownloadName", result.FileDownloadName);
}
[Fact]
public void HandleUnknownActionThrows()
{
var controller = new EmptyController();
Assert.Throws<HttpException>(
delegate { controller.HandleUnknownAction("UnknownAction"); },
"A public action method 'UnknownAction' was not found on controller 'System.Web.Mvc.Test.ControllerTest+EmptyController'.");
}
[Fact]
public void JavaScript()
{
// Arrange
Controller controller = GetEmptyController();
string script = "alert('foo');";
// Act
JavaScriptResult result = controller.JavaScript(script);
// Assert
Assert.Equal(script, result.Script);
}
[Fact]
public void PartialView()
{
// Arrange
Controller controller = GetEmptyController();
// Act
PartialViewResult result = controller.PartialView();
// Assert
Assert.Same(controller.TempData, result.TempData);
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(ViewEngines.Engines, result.ViewEngineCollection);
}
[Fact]
public void PartialView_Model()
{
// Arrange
Controller controller = GetEmptyController();
object model = new object();
// Act
PartialViewResult result = controller.PartialView(model);
// Assert
Assert.Same(model, result.ViewData.Model);
Assert.Same(controller.TempData, result.TempData);
Assert.Same(controller.ViewData, result.ViewData);
}
[Fact]
public void PartialView_ViewName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
PartialViewResult result = controller.PartialView("Some partial view");
// Assert
Assert.Equal("Some partial view", result.ViewName);
Assert.Same(controller.TempData, result.TempData);
Assert.Same(controller.ViewData, result.ViewData);
}
[Fact]
public void PartialView_ViewName_Model()
{
// Arrange
Controller controller = GetEmptyController();
object model = new object();
// Act
PartialViewResult result = controller.PartialView("Some partial view", model);
// Assert
Assert.Equal("Some partial view", result.ViewName);
Assert.Same(model, result.ViewData.Model);
Assert.Same(controller.TempData, result.TempData);
Assert.Same(controller.ViewData, result.ViewData);
}
[Fact]
public void PartialView_ViewEngineCollection()
{
// Arrange
Controller controller = GetEmptyController();
ViewEngineCollection viewEngines = new ViewEngineCollection();
controller.ViewEngineCollection = viewEngines;
// Act
PartialViewResult result = controller.PartialView();
// Assert
Assert.Same(viewEngines, result.ViewEngineCollection);
}
[Fact]
public void RedirectToActionClonesRouteValueDictionary()
{
// The RedirectToAction() method should clone the provided dictionary, then operate on the clone.
// The original dictionary should remain unmodified throughout the helper's execution.
// Arrange
Controller controller = GetEmptyController();
RouteValueDictionary values = new RouteValueDictionary(new { Action = "SomeAction", Controller = "SomeController" });
// Act
controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
// Assert
Assert.Equal(2, values.Count);
Assert.Equal("SomeAction", values["action"]);
Assert.Equal("SomeController", values["controller"]);
}
[Fact]
public void RedirectToActionOverwritesActionDictionaryKey()
{
// Arrange
Controller controller = GetEmptyController();
object values = new { Action = "SomeAction" };
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
RouteValueDictionary newValues = result.RouteValues;
// Assert
Assert.Equal("SomeOtherAction", newValues["action"]);
}
[Fact]
public void RedirectToActionOverwritesControllerDictionaryKeyIfSpecified()
{
// Arrange
Controller controller = GetEmptyController();
object values = new { Action = "SomeAction", Controller = "SomeController" };
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
RouteValueDictionary newValues = result.RouteValues;
// Assert
Assert.Equal("SomeOtherController", newValues["controller"]);
}
[Fact]
public void RedirectToActionPreservesControllerDictionaryKeyIfNotSpecified()
{
// Arrange
Controller controller = GetEmptyController();
object values = new { Controller = "SomeController" };
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
RouteValueDictionary newValues = result.RouteValues;
// Assert
Assert.Equal("SomeController", newValues["controller"]);
}
[Fact]
public void RedirectToActionWithActionName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction");
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionWithActionNameAndControllerName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController");
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionWithActionNameAndControllerNameAndValuesDictionary()
{
// Arrange
Controller controller = GetEmptyController();
RouteValueDictionary values = new RouteValueDictionary(new { Foo = "SomeFoo" });
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
Assert.Equal("SomeFoo", result.RouteValues["foo"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionWithActionNameAndControllerNameAndValuesObject()
{
// Arrange
Controller controller = GetEmptyController();
object values = new { Foo = "SomeFoo" };
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
Assert.Equal("SomeFoo", result.RouteValues["foo"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionSelectsCurrentControllerByDefault()
{
// Arrange
TestRouteController controller = new TestRouteController();
controller.ControllerContext = GetControllerContext("SomeAction", "TestRoute");
// Act
RedirectToRouteResult route = controller.Index() as RedirectToRouteResult;
// Assert
Assert.Equal("SomeAction", route.RouteValues["action"]);
Assert.Equal("TestRoute", route.RouteValues["controller"]);
}
[Fact]
public void RedirectToActionDictionaryOverridesDefaultControllerName()
{
// Arrange
TestRouteController controller = new TestRouteController();
object values = new { controller = "SomeOtherController" };
controller.ControllerContext = GetControllerContext("SomeAction", "TestRoute");
// Act
RedirectToRouteResult route = controller.RedirectToAction("SomeOtherAction", values);
// Assert
Assert.Equal("SomeOtherAction", route.RouteValues["action"]);
Assert.Equal("SomeOtherController", route.RouteValues["controller"]);
}
[Fact]
public void RedirectToActionSimpleOverridesCallLegacyMethod()
{
// The simple overrides need to call RedirectToAction(string, string, RouteValueDictionary) to maintain backwards compat
// Arrange
int invocationCount = 0;
Mock<Controller> controllerMock = new Mock<Controller>();
controllerMock.Setup(c => c.RedirectToAction(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<RouteValueDictionary>())).Callback(() => { invocationCount++; });
Controller controller = controllerMock.Object;
// Act
controller.RedirectToAction("SomeAction");
controller.RedirectToAction("SomeAction", (object)null);
controller.RedirectToAction("SomeAction", (RouteValueDictionary)null);
controller.RedirectToAction("SomeAction", "SomeController");
controller.RedirectToAction("SomeAction", "SomeController", (object)null);
// Assert
Assert.Equal(5, invocationCount);
}
[Fact]
public void RedirectToActionWithActionNameAndValuesDictionary()
{
// Arrange
Controller controller = GetEmptyController();
RouteValueDictionary values = new RouteValueDictionary(new { Foo = "SomeFoo" });
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("SomeFoo", result.RouteValues["foo"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionWithActionNameAndValuesObject()
{
// Arrange
Controller controller = GetEmptyController();
object values = new { Foo = "SomeFoo" };
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
// Assert
Assert.Equal("", result.RouteName);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("SomeFoo", result.RouteValues["foo"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionWithNullRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", (RouteValueDictionary)null);
RouteValueDictionary newValues = result.RouteValues;
// Assert
Assert.Single(newValues);
Assert.Equal("SomeOtherAction", newValues["action"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToActionPermanent()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction");
// Assert
Assert.True(result.Permanent);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Null(result.RouteValues["controller"]);
}
[Fact]
public void RedirectToActionPermanentWithObjectDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction", controllerName: "SomeController", routeValues: new { foo = "bar" });
// Assert
Assert.True(result.Permanent);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("bar", result.RouteValues["foo"]);
Assert.Equal("SomeController", result.RouteValues["controller"]);
}
[Fact]
public void RedirectToActionPermanentWithRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction", routeValues: new RouteValueDictionary(new { foo = "bar" }));
// Assert
Assert.True(result.Permanent);
Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
Assert.Equal("bar", result.RouteValues["foo"]);
}
[Fact]
public void RedirectToRouteSimpleOverridesCallLegacyMethod()
{
// The simple overrides need to call RedirectToRoute(string, RouteValueDictionary) to maintain backwards compat
// Arrange
int invocationCount = 0;
Mock<Controller> controllerMock = new Mock<Controller>();
controllerMock.Setup(c => c.RedirectToRoute(It.IsAny<string>(), It.IsAny<RouteValueDictionary>())).Callback(() => { invocationCount++; });
Controller controller = controllerMock.Object;
// Act
controller.RedirectToRoute("SomeRoute");
controller.RedirectToRoute("SomeRoute", (object)null);
controller.RedirectToRoute((object)null);
controller.RedirectToRoute((RouteValueDictionary)null);
// Assert
Assert.Equal(4, invocationCount);
}
[Fact]
public void RedirectToRouteWithNullRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoute((RouteValueDictionary)null);
// Assert
Assert.Empty(result.RouteValues);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithObjectDictionary()
{
// Arrange
Controller controller = GetEmptyController();
var values = new { Foo = "MyFoo" };
// Act
RedirectToRouteResult result = controller.RedirectToRoute(values);
// Assert
Assert.Single(result.RouteValues);
Assert.Equal("MyFoo", result.RouteValues["Foo"]);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
RouteValueDictionary values = new RouteValueDictionary() { { "Foo", "MyFoo" } };
// Act
RedirectToRouteResult result = controller.RedirectToRoute(values);
// Assert
Assert.Single(result.RouteValues);
Assert.Equal("MyFoo", result.RouteValues["Foo"]);
Assert.NotSame(values, result.RouteValues);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoute("foo");
// Assert
Assert.Empty(result.RouteValues);
Assert.Equal("foo", result.RouteName);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithNameAndNullRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoute("foo", (RouteValueDictionary)null);
// Assert
Assert.Empty(result.RouteValues);
Assert.Equal("foo", result.RouteName);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithNullNameAndNullRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoute(null, (RouteValueDictionary)null);
// Assert
Assert.Empty(result.RouteValues);
Assert.Equal(String.Empty, result.RouteName);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithNameAndObjectDictionary()
{
// Arrange
Controller controller = GetEmptyController();
var values = new { Foo = "MyFoo" };
// Act
RedirectToRouteResult result = controller.RedirectToRoute("foo", values);
// Assert
Assert.Single(result.RouteValues);
Assert.Equal("MyFoo", result.RouteValues["Foo"]);
Assert.Equal("foo", result.RouteName);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRouteWithNameAndRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
RouteValueDictionary values = new RouteValueDictionary() { { "Foo", "MyFoo" } };
// Act
RedirectToRouteResult result = controller.RedirectToRoute("foo", values);
// Assert
Assert.Single(result.RouteValues);
Assert.Equal("MyFoo", result.RouteValues["Foo"]);
Assert.NotSame(values, result.RouteValues);
Assert.Equal("foo", result.RouteName);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectToRoutePermanentWithObjectDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoutePermanent(routeValues: new { Foo = "Bar" });
// Assert
Assert.True(result.Permanent);
Assert.Equal("Bar", result.RouteValues["Foo"]);
}
[Fact]
public void RedirectToRoutePermanentWithRouteValueDictionary()
{
// Arrange
Controller controller = GetEmptyController();
// Act
RedirectToRouteResult result = controller.RedirectToRoutePermanent(routeValues: new RouteValueDictionary(new { Foo = "Bar" }));
// Assert
Assert.True(result.Permanent);
Assert.Equal("Bar", result.RouteValues["Foo"]);
}
[Fact]
public void RedirectReturnsCorrectActionResult()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
var result = controller.Redirect("http://www.contoso.com/");
// Assert
Assert.Equal("http://www.contoso.com/", result.Url);
Assert.False(result.Permanent);
}
[Fact]
public void RedirectPermanentReturnsCorrectActionResult()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
var result = controller.RedirectPermanent("http://www.contoso.com/");
// Assert
Assert.Equal("http://www.contoso.com/", result.Url);
Assert.True(result.Permanent);
}
[Fact]
public void RedirectWithEmptyUrlThrows()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { controller.Redirect(String.Empty); },
"url");
}
[Fact]
public void RedirectPermanentWithEmptyUrlThrows()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { controller.RedirectPermanent(String.Empty); },
"url");
}
[Fact]
public void RedirectWithNullUrlThrows()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { controller.Redirect(url: null); },
"url");
}
[Fact]
public void RedirectPermanentWithNullUrlThrows()
{
// Arrange
Controller controller = GetEmptyController();
// Act & Assert
Assert.ThrowsArgumentNullOrEmpty(
delegate { controller.RedirectPermanent(url: null); },
"url");
}
[Fact]
public void View()
{
// Arrange
Controller controller = GetEmptyController();
// Act
ViewResult result = controller.View();
// Assert
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(controller.TempData, result.TempData);
Assert.Same(ViewEngines.Engines, result.ViewEngineCollection);
}
[Fact]
public void View_Model()
{
// Arrange
Controller controller = GetEmptyController();
object viewItem = new object();
// Act
ViewResult result = controller.View(viewItem);
// Assert
Assert.Same(viewItem, result.ViewData.Model);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_ViewName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
ViewResult result = controller.View("Foo");
// Assert
Assert.Equal("Foo", result.ViewName);
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_ViewName_Model()
{
// Arrange
Controller controller = GetEmptyController();
object viewItem = new object();
// Act
ViewResult result = controller.View("Foo", viewItem);
// Assert
Assert.Equal("Foo", result.ViewName);
Assert.Same(viewItem, result.ViewData.Model);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_ViewName_MasterViewName()
{
// Arrange
Controller controller = GetEmptyController();
// Act
ViewResult result = controller.View("Foo", "Bar");
// Assert
Assert.Equal("Foo", result.ViewName);
Assert.Equal("Bar", result.MasterName);
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_ViewName_MasterViewName_Model()
{
// Arrange
Controller controller = GetEmptyController();
object viewItem = new object();
// Act
ViewResult result = controller.View("Foo", "Bar", viewItem);
// Assert
Assert.Equal("Foo", result.ViewName);
Assert.Equal("Bar", result.MasterName);
Assert.Same(viewItem, result.ViewData.Model);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_View()
{
// Arrange
Controller controller = GetEmptyController();
IView view = new Mock<IView>().Object;
// Act
ViewResult result = controller.View(view);
// Assert
Assert.Same(result.View, view);
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(controller.TempData, result.TempData);
}
[Fact]
public void View_View_Model()
{
// Arrange
Controller controller = GetEmptyController();
IView view = new Mock<IView>().Object;
object model = new object();
// Act
ViewResult result = controller.View(view, model);
// Assert
Assert.Same(result.View, view);
Assert.Same(controller.ViewData, result.ViewData);
Assert.Same(controller.TempData, result.TempData);
Assert.Same(model, result.ViewData.Model);
}
[Fact]
public void View_ViewEngineCollection()
{
// Arrange
Controller controller = GetEmptyController();
ViewEngineCollection viewEngines = new ViewEngineCollection();
controller.ViewEngineCollection = viewEngines;
// Act
ViewResult result = controller.View();
// Assert
Assert.Same(viewEngines, result.ViewEngineCollection);
}
internal static void AddRequestParams(Mock<HttpRequestBase> requestMock, object paramValues)
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(paramValues);
foreach (PropertyDescriptor prop in props)
{
requestMock.Setup(o => o[It.Is<string>(item => String.Equals(prop.Name, item, StringComparison.OrdinalIgnoreCase))]).Returns((string)prop.GetValue(paramValues));
}
}
[Fact]
public void TempDataGreetUserWithNoUserIDRedirects()
{
// Arrange
TempDataHomeController tempDataHomeController = new TempDataHomeController();
// Act
RedirectToRouteResult result = tempDataHomeController.GreetUser() as RedirectToRouteResult;
RouteValueDictionary values = result.RouteValues;
// Assert
Assert.True(values.ContainsKey("action"));
Assert.Equal("ErrorPage", values["action"]);
Assert.Empty(tempDataHomeController.TempData);
}
[Fact]
public void TempDataGreetUserWithUserIDCopiesToViewDataAndRenders()
{
// Arrange
TempDataHomeController tempDataHomeController = new TempDataHomeController();
tempDataHomeController.TempData["UserID"] = "TestUserID";
// Act
ViewResult result = tempDataHomeController.GreetUser() as ViewResult;
ViewDataDictionary viewData = tempDataHomeController.ViewData;
// Assert
Assert.Equal("GreetUser", result.ViewName);
Assert.NotNull(viewData);
Assert.True(viewData.ContainsKey("NewUserID"));
Assert.Equal("TestUserID", viewData["NewUserID"]);
}
[Fact]
public void TempDataIndexSavesUserIDAndRedirects()
{
// Arrange
TempDataHomeController tempDataHomeController = new TempDataHomeController();
// Act
RedirectToRouteResult result = tempDataHomeController.Index() as RedirectToRouteResult;
RouteValueDictionary values = result.RouteValues;
// Assert
Assert.True(values.ContainsKey("action"));
Assert.Equal("GreetUser", values["action"]);
Assert.True(tempDataHomeController.TempData.ContainsKey("UserID"));
Assert.Equal("user123", tempDataHomeController.TempData["UserID"]);
}
[Fact]
public void TempDataSavedWhenControllerThrows()
{
// Arrange
BrokenController controller = new BrokenController() { ValidateRequest = false };
Mock<HttpContextBase> mockContext = HttpContextHelpers.GetMockHttpContext();
HttpSessionStateBase session = GetEmptySession();
mockContext.Setup(o => o.Session).Returns(session);
RouteData rd = new RouteData();
rd.Values.Add("action", "Crash");
controller.ControllerContext = new ControllerContext(mockContext.Object, rd, controller);
// Assert
Assert.Throws<InvalidOperationException>(
delegate { ((IController)controller).Execute(controller.ControllerContext.RequestContext); });
Assert.NotEqual(mockContext.Object.Session[SessionStateTempDataProvider.TempDataSessionStateKey], null);
TempDataDictionary tempData = new TempDataDictionary();
tempData.Load(controller.ControllerContext, controller.TempDataProvider);
Assert.Equal(tempData["Key1"], "Value1");
}
[Fact]
public void TempDataMovedToPreviousTempDataInDestinationController()
{
// Arrange
Mock<Controller> mockController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
HttpSessionStateBase session = GetEmptySession();
mockContext.Setup(o => o.Session).Returns(session);
mockController.Object.ControllerContext = new ControllerContext(mockContext.Object, new RouteData(), mockController.Object);
// Act
mockController.Object.TempData.Add("Key", "Value");
mockController.Object.TempData.Save(mockController.Object.ControllerContext, mockController.Object.TempDataProvider);
// Assert
Assert.True(mockController.Object.TempData.ContainsKey("Key"));
Assert.True(mockController.Object.TempData.ContainsValue("Value"));
// Instantiate "destination" controller with the same session state and see that it gets the temp data
Mock<Controller> mockDestinationController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockDestinationContext = new Mock<HttpContextBase>();
mockDestinationContext.Setup(o => o.Session).Returns(session);
mockDestinationController.Object.ControllerContext = new ControllerContext(mockDestinationContext.Object, new RouteData(), mockDestinationController.Object);
mockDestinationController.Object.TempData.Load(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
// Assert
Assert.True(mockDestinationController.Object.TempData.ContainsKey("Key"));
// Act
mockDestinationController.Object.TempData["NewKey"] = "NewValue";
Assert.True(mockDestinationController.Object.TempData.ContainsKey("NewKey"));
mockDestinationController.Object.TempData.Save(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
// Instantiate "second destination" controller with the same session state and see that it gets the temp data
Mock<Controller> mockSecondDestinationController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockSecondDestinationContext = new Mock<HttpContextBase>();
mockSecondDestinationContext.Setup(o => o.Session).Returns(session);
mockSecondDestinationController.Object.ControllerContext = new ControllerContext(mockSecondDestinationContext.Object, new RouteData(), mockSecondDestinationController.Object);
mockSecondDestinationController.Object.TempData.Load(mockSecondDestinationController.Object.ControllerContext, mockSecondDestinationController.Object.TempDataProvider);
// Assert
Assert.True(mockSecondDestinationController.Object.TempData.ContainsKey("Key"));
Assert.True(mockSecondDestinationController.Object.TempData.ContainsKey("NewKey"));
}
[Fact]
public void TempDataRemovesKeyWhenRead()
{
// Arrange
Mock<Controller> mockController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
HttpSessionStateBase session = GetEmptySession();
mockContext.Setup(o => o.Session).Returns(session);
mockController.Object.ControllerContext = new ControllerContext(mockContext.Object, new RouteData(), mockController.Object);
// Act
mockController.Object.TempData.Add("Key", "Value");
mockController.Object.TempData.Save(mockController.Object.ControllerContext, mockController.Object.TempDataProvider);
// Assert
Assert.True(mockController.Object.TempData.ContainsKey("Key"));
Assert.True(mockController.Object.TempData.ContainsValue("Value"));
// Instantiate "destination" controller with the same session state and see that it gets the temp data
Mock<Controller> mockDestinationController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockDestinationContext = new Mock<HttpContextBase>();
mockDestinationContext.Setup(o => o.Session).Returns(session);
mockDestinationController.Object.ControllerContext = new ControllerContext(mockDestinationContext.Object, new RouteData(), mockDestinationController.Object);
mockDestinationController.Object.TempData.Load(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
// Assert
Assert.True(mockDestinationController.Object.TempData.ContainsKey("Key"));
// Act
object value = mockDestinationController.Object.TempData["Key"];
mockDestinationController.Object.TempData.Save(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
// Instantiate "second destination" controller with the same session state and see that it gets the temp data
Mock<Controller> mockSecondDestinationController = new Mock<Controller>() { CallBase = true };
Mock<HttpContextBase> mockSecondDestinationContext = new Mock<HttpContextBase>();
mockSecondDestinationContext.Setup(o => o.Session).Returns(session);
mockSecondDestinationController.Object.ControllerContext = new ControllerContext(mockSecondDestinationContext.Object, new RouteData(), mockSecondDestinationController.Object);
mockSecondDestinationController.Object.TempData.Load(mockSecondDestinationController.Object.ControllerContext, mockSecondDestinationController.Object.TempDataProvider);
// Assert
Assert.False(mockSecondDestinationController.Object.TempData.ContainsKey("Key"));
}
[Fact]
public void TempDataValidForSingleControllerWhenSessionStateDisabled()
{
// Arrange
Mock<Controller> mockController = new Mock<Controller>();
Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
HttpSessionStateBase session = null;
mockContext.Setup(o => o.Session).Returns(session);
mockController.Object.ControllerContext = new ControllerContext(mockContext.Object, new RouteData(), mockController.Object);
mockController.Object.TempData = new TempDataDictionary();
// Act
mockController.Object.TempData["Key"] = "Value";
// Assert
Assert.True(mockController.Object.TempData.ContainsKey("Key"));
}
[Fact]
public void TryUpdateModelCallsModelBinderForModel()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
IValueProvider valueProvider = new SimpleValueProvider();
Controller controller = new EmptyController();
controller.ControllerContext = GetControllerContext("someAction");
// Act
bool returned = controller.TryUpdateModel(myModel, "somePrefix", new[] { "prop1", "prop2" }, null, valueProvider);
// Assert
Assert.True(returned);
Assert.Equal(valueProvider, myModel.BindingContext.ValueProvider);
Assert.Equal("somePrefix", myModel.BindingContext.ModelName);
Assert.Equal(controller.ModelState, myModel.BindingContext.ModelState);
Assert.Equal(typeof(MyModel), myModel.BindingContext.ModelType);
Assert.True(myModel.BindingContext.PropertyFilter("prop1"));
Assert.True(myModel.BindingContext.PropertyFilter("prop2"));
Assert.False(myModel.BindingContext.PropertyFilter("prop3"));
}
[Fact]
public void TryUpdateModelReturnsFalseIfModelStateInvalid()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
controller.ModelState.AddModelError("key", "some exception message");
// Act
bool returned = controller.TryUpdateModel(myModel, new SimpleValueProvider());
// Assert
Assert.False(returned);
}
[Fact]
public void TryUpdateModelSuppliesControllerValueProviderIfNoValueProviderSpecified()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
IValueProvider valueProvider = new SimpleValueProvider();
Controller controller = new EmptyController();
controller.ValueProvider = valueProvider;
// Act
bool returned = controller.TryUpdateModel(myModel, "somePrefix", new[] { "prop1", "prop2" });
// Assert
Assert.True(returned);
Assert.Equal(valueProvider, myModel.BindingContext.ValueProvider);
}
[Fact]
public void TryUpdateModelSuppliesEmptyModelNameIfNoPrefixSpecified()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
// Act
bool returned = controller.TryUpdateModel(myModel, new[] { "prop1", "prop2" }, new SimpleValueProvider());
// Assert
Assert.True(returned);
Assert.Equal(String.Empty, myModel.BindingContext.ModelName);
}
[Fact]
public void TryUpdateModelThrowsIfModelIsNull()
{
// Arrange
Controller controller = new EmptyController();
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { controller.TryUpdateModel<object>(null, new SimpleValueProvider()); }, "model");
}
[Fact]
public void TryUpdateModelThrowsIfValueProviderIsNull()
{
// Arrange
Controller controller = new EmptyController();
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { controller.TryUpdateModel(new object(), null, null, null, null); }, "valueProvider");
}
[Fact]
public void UpdateModelReturnsIfModelStateValid()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
// Act
controller.UpdateModel(myModel, new SimpleValueProvider());
// Assert
// nothing to do - if we got here, the test passed
}
[Fact]
public void TryUpdateModelWithoutBindPropertiesImpliesAllPropertiesAreUpdateable()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
// Act
bool returned = controller.TryUpdateModel(myModel, "somePrefix", new SimpleValueProvider());
// Assert
Assert.True(returned);
Assert.True(myModel.BindingContext.PropertyFilter("prop1"));
Assert.True(myModel.BindingContext.PropertyFilter("prop2"));
Assert.True(myModel.BindingContext.PropertyFilter("prop3"));
}
[Fact]
public void UpdateModelSuppliesControllerValueProviderIfNoValueProviderSpecified()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
IValueProvider valueProvider = new SimpleValueProvider();
Controller controller = new EmptyController() { ValueProvider = valueProvider };
// Act
controller.UpdateModel(myModel, "somePrefix", new[] { "prop1", "prop2" });
// Assert
Assert.Equal(valueProvider, myModel.BindingContext.ValueProvider);
}
[Fact]
public void UpdateModelThrowsIfModelStateInvalid()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
controller.ModelState.AddModelError("key", "some exception message");
// Act & assert
Assert.Throws<InvalidOperationException>(
delegate { controller.UpdateModel(myModel, new SimpleValueProvider()); },
"The model of type 'System.Web.Mvc.Test.ControllerTest+MyModel' could not be updated.");
}
[Fact]
public void UpdateModelWithoutBindPropertiesImpliesAllPropertiesAreUpdateable()
{
// Arrange
MyModel myModel = new MyModelSubclassed();
Controller controller = new EmptyController();
// Act
controller.UpdateModel(myModel, "somePrefix", new SimpleValueProvider());
// Assert
Assert.True(myModel.BindingContext.PropertyFilter("prop1"));
Assert.True(myModel.BindingContext.PropertyFilter("prop2"));
Assert.True(myModel.BindingContext.PropertyFilter("prop3"));
}
[Fact]
public void Json()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model);
// Assert
Assert.Same(model, result.Data);
Assert.Null(result.ContentType);
Assert.Null(result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.DenyGet, result.JsonRequestBehavior);
}
[Fact]
public void JsonWithContentType()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model, "text/xml");
// Assert
Assert.Same(model, result.Data);
Assert.Equal("text/xml", result.ContentType);
Assert.Null(result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.DenyGet, result.JsonRequestBehavior);
}
[Fact]
public void JsonWithContentTypeAndEncoding()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model, "text/xml", Encoding.UTF32);
// Assert
Assert.Same(model, result.Data);
Assert.Equal("text/xml", result.ContentType);
Assert.Equal(Encoding.UTF32, result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.DenyGet, result.JsonRequestBehavior);
}
[Fact]
public void JsonWithBehavior()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model, JsonRequestBehavior.AllowGet);
// Assert
Assert.Same(model, result.Data);
Assert.Null(result.ContentType);
Assert.Null(result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.AllowGet, result.JsonRequestBehavior);
}
[Fact]
public void JsonWithContentTypeAndBehavior()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model, "text/xml", JsonRequestBehavior.AllowGet);
// Assert
Assert.Same(model, result.Data);
Assert.Equal("text/xml", result.ContentType);
Assert.Null(result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.AllowGet, result.JsonRequestBehavior);
}
[Fact]
public void JsonWithContentTypeAndEncodingAndBehavior()
{
// Arrange
MyModel model = new MyModel();
Controller controller = new EmptyController();
// Act
JsonResult result = controller.Json(model, "text/xml", Encoding.UTF32, JsonRequestBehavior.AllowGet);
// Assert
Assert.Same(model, result.Data);
Assert.Equal("text/xml", result.ContentType);
Assert.Equal(Encoding.UTF32, result.ContentEncoding);
Assert.Equal(JsonRequestBehavior.AllowGet, result.JsonRequestBehavior);
}
[Fact]
public void ExecuteDoesNotCallTempDataLoadOrSave()
{
// Arrange
TempDataDictionary tempData = new TempDataDictionary();
ViewContext viewContext = new ViewContext { TempData = tempData };
RouteData routeData = new RouteData();
routeData.DataTokens[ControllerContext.ParentActionViewContextToken] = viewContext;
routeData.Values["action"] = "SimpleAction";
RequestContext requestContext = new RequestContext(HttpContextHelpers.GetMockHttpContext().Object, routeData);
// Strict == no default implementations == calls to Load & Save are not allowed
Mock<ITempDataProvider> tempDataProvider = new Mock<ITempDataProvider>(MockBehavior.Strict);
SimpleController controller = new SimpleController();
controller.ValidateRequest = false;
// Act
((IController)controller).Execute(requestContext);
// Assert
tempDataProvider.Verify();
}
// Model validation
[Fact]
public void TryValidateModelGuardClauses()
{
// Arrange
Controller controller = new SimpleController();
// Act & Assert
Assert.ThrowsArgumentNull(
() => controller.TryValidateModel(null),
"model");
}
[Fact]
public void TryValidateModelWithValidModel()
{
// Arrange
Controller controller = new SimpleController();
TryValidateModelModel model = new TryValidateModelModel { IntegerProperty = 15 };
// Act
bool result = controller.TryValidateModel(model);
// Assert
Assert.True(result);
Assert.True(controller.ModelState.IsValid);
}
[Fact]
public void TryValidateModelWithInvalidModel()
{
// Arrange
Controller controller = new SimpleController();
TryValidateModelModel model = new TryValidateModelModel { IntegerProperty = 5 };
// Act
bool result = controller.TryValidateModel(model, "Prefix");
// Assert
Assert.False(result);
Assert.Equal("Out of range!", controller.ModelState["Prefix.IntegerProperty"].Errors[0].ErrorMessage);
}
[Fact]
public void ValidateModelGuardClauses()
{
// Arrange
Controller controller = new SimpleController();
// Act & Assert
Assert.ThrowsArgumentNull(
() => controller.ValidateModel(null),
"model");
}
[Fact]
public void ValidateModelWithValidModel()
{
// Arrange
Controller controller = new SimpleController();
TryValidateModelModel model = new TryValidateModelModel { IntegerProperty = 15 };
// Act
controller.ValidateModel(model);
// Assert
Assert.True(controller.ModelState.IsValid);
}
[Fact]
public void ValidateModelWithInvalidModel()
{
// Arrange
Controller controller = new SimpleController();
TryValidateModelModel model = new TryValidateModelModel { IntegerProperty = 5 };
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => controller.ValidateModel(model, "Prefix"),
"The model of type '" + model.GetType().FullName + "' is not valid.");
Assert.Equal("Out of range!", controller.ModelState["Prefix.IntegerProperty"].Errors[0].ErrorMessage);
}
[Fact]
public void ValidateControllerUsesCachedResolver()
{
var controller = new EmptyController();
var resolver = controller.Resolver;
Assert.Equal(DependencyResolver.CurrentCache.GetType(), resolver.GetType());
}
[Fact]
public void CreateActionInvokerCallsIntoResolverInstance()
{
// Controller uses an IDependencyResolver to create an IActionInvoker.
var controller = new EmptyController();
Mock<IDependencyResolver> resolverMock = new Mock<IDependencyResolver>();
Mock<IAsyncActionInvoker> actionInvokerMock = new Mock<IAsyncActionInvoker>();
resolverMock.Setup(r => r.GetService(typeof(IAsyncActionInvoker))).Returns(actionInvokerMock.Object);
controller.Resolver = resolverMock.Object;
var ai = controller.CreateActionInvoker();
resolverMock.Verify(r => r.GetService(typeof(IAsyncActionInvoker)), Times.Once());
Assert.Same(actionInvokerMock.Object, ai);
}
[Fact]
public void CreateActionInvokerCallsIntoResolverInstanceAndCreatesANewOneIfNecessary()
{
// If IDependencyResolver is set, but empty, falls back and still creates.
var controller = new EmptyController();
Mock<IDependencyResolver> resolverMock = new Mock<IDependencyResolver>();
resolverMock.Setup(r => r.GetService(typeof(IAsyncActionInvoker))).Returns(null);
controller.Resolver = resolverMock.Object;
IActionInvoker ai = controller.CreateActionInvoker();
resolverMock.Verify(r => r.GetService(typeof(IAsyncActionInvoker)), Times.Once());
Assert.NotNull(ai);
}
[Fact]
public void CreateTempProviderWithResolver()
{
// Controller uses an IDependencyResolver to create an IActionInvoker.
var controller = new EmptyController();
Mock<IDependencyResolver> resolverMock = new Mock<IDependencyResolver>();
Mock<ITempDataProvider> tempMock = new Mock<ITempDataProvider>();
resolverMock.Setup(r => r.GetService(typeof(ITempDataProvider))).Returns(tempMock.Object);
controller.Resolver = resolverMock.Object;
ITempDataProvider temp = controller.CreateTempDataProvider();
resolverMock.Verify(r => r.GetService(typeof(ITempDataProvider)), Times.Once());
Assert.Same(tempMock.Object, temp);
}
private class TryValidateModelModel
{
[Range(10, 20, ErrorMessage = "Out of range!")]
public int IntegerProperty { get; set; }
}
// Helpers
private class SimpleController : Controller
{
public SimpleController()
{
ControllerContext = new ControllerContext { Controller = this };
}
public void SimpleAction()
{
}
}
private static ControllerContext GetControllerContext(string actionName)
{
RouteData rd = new RouteData();
rd.Values["action"] = actionName;
Mock<HttpContextBase> mockHttpContext = HttpContextHelpers.GetMockHttpContext();
mockHttpContext.Setup(c => c.Session).Returns((HttpSessionStateBase)null);
return new ControllerContext(mockHttpContext.Object, rd, new Mock<Controller>().Object);
}
private static ControllerContext GetControllerContext(string actionName, string controllerName)
{
RouteData rd = new RouteData();
rd.Values["action"] = actionName;
rd.Values["controller"] = controllerName;
Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Setup(c => c.Session).Returns((HttpSessionStateBase)null);
return new ControllerContext(mockHttpContext.Object, rd, new Mock<Controller>().Object);
}
private static Controller GetEmptyController()
{
ControllerContext context = GetControllerContext("Foo");
var controller = new EmptyController()
{
ControllerContext = context,
RouteCollection = new RouteCollection(),
TempData = new TempDataDictionary(),
TempDataProvider = new SessionStateTempDataProvider()
};
return controller;
}
private static HttpSessionStateBase GetEmptySession()
{
HttpSessionStateMock mockSession = new HttpSessionStateMock();
return mockSession;
}
private sealed class HttpSessionStateMock : HttpSessionStateBase
{
private Hashtable _sessionData = new Hashtable(StringComparer.OrdinalIgnoreCase);
public override void Remove(string name)
{
Assert.Equal<string>(SessionStateTempDataProvider.TempDataSessionStateKey, name);
_sessionData.Remove(name);
}
public override object this[string name]
{
get
{
Assert.Equal<string>(SessionStateTempDataProvider.TempDataSessionStateKey, name);
return _sessionData[name];
}
set
{
Assert.Equal<string>(SessionStateTempDataProvider.TempDataSessionStateKey, name);
_sessionData[name] = value;
}
}
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
private class EmptyController : Controller
{
public new void HandleUnknownAction(string actionName)
{
base.HandleUnknownAction(actionName);
}
public void PublicInitialize(RequestContext requestContext)
{
base.Initialize(requestContext);
}
// Test can expose protected method as public.
public new IActionInvoker CreateActionInvoker()
{
return base.CreateActionInvoker();
}
public new ITempDataProvider CreateTempDataProvider()
{
return base.CreateTempDataProvider();
}
}
private sealed class UnknownActionController : Controller
{
public bool WasCalled;
protected override void HandleUnknownAction(string actionName)
{
WasCalled = true;
}
}
private sealed class TempDataHomeController : Controller
{
public ActionResult Index()
{
// Save UserID into TempData and redirect to greeting page
TempData["UserID"] = "user123";
return RedirectToAction("GreetUser");
}
public ActionResult GreetUser()
{
// Check that the UserID is present. If it's not
// there, redirect to error page. If it is, show
// the greet user view.
if (!TempData.ContainsKey("UserID"))
{
return RedirectToAction("ErrorPage");
}
ViewData["NewUserID"] = TempData["UserID"];
return View("GreetUser");
}
}
public class BrokenController : Controller
{
public BrokenController()
{
ActionInvoker = new ControllerActionInvoker()
{
DescriptorCache = new ControllerDescriptorCache()
};
}
public ActionResult Crash()
{
TempData["Key1"] = "Value1";
throw new InvalidOperationException("Crashing....");
}
}
private sealed class TestRouteController : Controller
{
public ActionResult Index()
{
return RedirectToAction("SomeAction");
}
}
[ModelBinder(typeof(MyModelBinder))]
private class MyModel
{
public ControllerContext ControllerContext;
public ModelBindingContext BindingContext;
}
private class MyModelSubclassed : MyModel
{
}
private class MyModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
MyModel myModel = (MyModel)bindingContext.Model;
myModel.ControllerContext = controllerContext;
myModel.BindingContext = bindingContext;
return myModel;
}
}
}
internal class EmptyTempDataProvider : ITempDataProvider
{
public void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values)
{
}
public IDictionary<string, object> LoadTempData(ControllerContext controllerContext)
{
return new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
}
}
}