PageRenderTime 54ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/test/System.Web.Mvc.Test/Test/ControllerTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 1368 lines | 884 code | 261 blank | 223 comment | 1 complexity | 485c4e1a7fdd3c9c46f52c3ef7584c99 MD5 | raw file
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.ComponentModel.DataAnnotations;
  5. using System.IO;
  6. using System.Reflection;
  7. using System.Security.Principal;
  8. using System.Text;
  9. using System.Web.Mvc.Async;
  10. using System.Web.Profile;
  11. using System.Web.Routing;
  12. using System.Web.TestUtil;
  13. using Microsoft.Web.UnitTestUtil;
  14. using Moq;
  15. using Moq.Protected;
  16. using Xunit;
  17. using Assert = Microsoft.TestCommon.AssertEx;
  18. namespace System.Web.Mvc.Test
  19. {
  20. public class ControllerTest
  21. {
  22. [Fact]
  23. public void ActionInvokerProperty()
  24. {
  25. // Arrange
  26. Controller controller = new EmptyController();
  27. // Act & Assert
  28. MemberHelper.TestPropertyWithDefaultInstance(controller, "ActionInvoker", new ControllerActionInvoker());
  29. }
  30. [Fact]
  31. public void ContentWithContentString()
  32. {
  33. // Arrange
  34. Controller controller = new EmptyController();
  35. string content = "Some content";
  36. // Act
  37. ContentResult result = controller.Content(content);
  38. // Assert
  39. Assert.Equal(content, result.Content);
  40. }
  41. [Fact]
  42. public void ContentWithContentStringAndContentType()
  43. {
  44. // Arrange
  45. Controller controller = new EmptyController();
  46. string content = "Some content";
  47. string contentType = "Some content type";
  48. // Act
  49. ContentResult result = controller.Content(content, contentType);
  50. // Assert
  51. Assert.Equal(content, result.Content);
  52. Assert.Equal(contentType, result.ContentType);
  53. }
  54. [Fact]
  55. public void ContentWithContentStringAndContentTypeAndEncoding()
  56. {
  57. // Arrange
  58. Controller controller = new EmptyController();
  59. string content = "Some content";
  60. string contentType = "Some content type";
  61. Encoding contentEncoding = Encoding.UTF8;
  62. // Act
  63. ContentResult result = controller.Content(content, contentType, contentEncoding);
  64. // Assert
  65. Assert.Equal(content, result.Content);
  66. Assert.Equal(contentType, result.ContentType);
  67. Assert.Same(contentEncoding, result.ContentEncoding);
  68. }
  69. [Fact]
  70. public void ContextProperty()
  71. {
  72. var controller = new EmptyController();
  73. MemberHelper.TestPropertyValue(controller, "ControllerContext", new Mock<ControllerContext>().Object);
  74. }
  75. [Fact]
  76. public void HttpContextProperty()
  77. {
  78. var c = new EmptyController();
  79. Assert.Null(c.HttpContext);
  80. Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
  81. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  82. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  83. mockControllerContext.Setup(cc => cc.HttpContext).Returns(mockHttpContext.Object);
  84. c.ControllerContext = mockControllerContext.Object;
  85. Assert.Equal(mockHttpContext.Object, c.HttpContext);
  86. }
  87. [Fact]
  88. public void HttpNotFound()
  89. {
  90. // Arrange
  91. var c = new EmptyController();
  92. // Act
  93. HttpNotFoundResult result = c.HttpNotFound();
  94. // Assert
  95. Assert.NotNull(result);
  96. Assert.Null(result.StatusDescription);
  97. Assert.Equal(404, result.StatusCode);
  98. }
  99. [Fact]
  100. public void HttpNotFoundWithNullStatusDescription()
  101. {
  102. // Arrange
  103. var c = new EmptyController();
  104. // Act
  105. HttpNotFoundResult result = c.HttpNotFound(statusDescription: null);
  106. // Assert
  107. Assert.NotNull(result);
  108. Assert.Null(result.StatusDescription);
  109. Assert.Equal(404, result.StatusCode);
  110. }
  111. [Fact]
  112. public void HttpNotFoundWithStatusDescription()
  113. {
  114. // Arrange
  115. var c = new EmptyController();
  116. // Act
  117. HttpNotFoundResult result = c.HttpNotFound(statusDescription: "I lost it");
  118. // Assert
  119. Assert.NotNull(result);
  120. Assert.Equal("I lost it", result.StatusDescription);
  121. Assert.Equal(404, result.StatusCode);
  122. }
  123. [Fact]
  124. public void ModelStateProperty()
  125. {
  126. // Arrange
  127. Controller controller = new EmptyController();
  128. // Act & assert
  129. Assert.Same(controller.ViewData.ModelState, controller.ModelState);
  130. }
  131. [Fact]
  132. public void ProfileProperty()
  133. {
  134. var c = new EmptyController();
  135. Assert.Null(c.Profile);
  136. Mock<ProfileBase> mockProfile = new Mock<ProfileBase>();
  137. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  138. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  139. mockControllerContext.Setup(cc => cc.HttpContext.Profile).Returns(mockProfile.Object);
  140. c.ControllerContext = mockControllerContext.Object;
  141. Assert.Equal(mockProfile.Object, c.Profile);
  142. }
  143. [Fact]
  144. public void RequestProperty()
  145. {
  146. var c = new EmptyController();
  147. Assert.Null(c.Request);
  148. Mock<HttpRequestBase> mockHttpRequest = new Mock<HttpRequestBase>();
  149. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  150. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  151. mockControllerContext.Setup(cc => cc.HttpContext.Request).Returns(mockHttpRequest.Object);
  152. c.ControllerContext = mockControllerContext.Object;
  153. Assert.Equal(mockHttpRequest.Object, c.Request);
  154. }
  155. [Fact]
  156. public void ResponseProperty()
  157. {
  158. var c = new EmptyController();
  159. Assert.Null(c.Request);
  160. Mock<HttpResponseBase> mockHttpResponse = new Mock<HttpResponseBase>();
  161. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  162. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  163. mockControllerContext.Setup(cc => cc.HttpContext.Response).Returns(mockHttpResponse.Object);
  164. c.ControllerContext = mockControllerContext.Object;
  165. Assert.Equal(mockHttpResponse.Object, c.Response);
  166. }
  167. [Fact]
  168. public void ServerProperty()
  169. {
  170. var c = new EmptyController();
  171. Assert.Null(c.Request);
  172. Mock<HttpServerUtilityBase> mockServerUtility = new Mock<HttpServerUtilityBase>();
  173. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  174. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  175. mockControllerContext.Setup(cc => cc.HttpContext.Server).Returns(mockServerUtility.Object);
  176. c.ControllerContext = mockControllerContext.Object;
  177. Assert.Equal(mockServerUtility.Object, c.Server);
  178. }
  179. [Fact]
  180. public void SessionProperty()
  181. {
  182. var c = new EmptyController();
  183. Assert.Null(c.Request);
  184. Mock<HttpSessionStateBase> mockSessionState = new Mock<HttpSessionStateBase>();
  185. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  186. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  187. mockControllerContext.Setup(cc => cc.HttpContext.Session).Returns(mockSessionState.Object);
  188. c.ControllerContext = mockControllerContext.Object;
  189. Assert.Same(mockSessionState.Object, c.Session);
  190. }
  191. [Fact]
  192. public void UrlProperty()
  193. {
  194. // Arrange
  195. EmptyController controller = new EmptyController();
  196. RequestContext requestContext = new RequestContext(new Mock<HttpContextBase>().Object, new RouteData());
  197. // Act
  198. controller.PublicInitialize(requestContext);
  199. // Assert
  200. Assert.NotNull(controller.Url);
  201. }
  202. [Fact]
  203. public void UserProperty()
  204. {
  205. var c = new EmptyController();
  206. Assert.Null(c.Request);
  207. Mock<IPrincipal> mockUser = new Mock<IPrincipal>();
  208. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  209. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  210. mockControllerContext.Setup(cc => cc.HttpContext.User).Returns(mockUser.Object);
  211. c.ControllerContext = mockControllerContext.Object;
  212. Assert.Equal(mockUser.Object, c.User);
  213. }
  214. [Fact]
  215. public void RouteDataProperty()
  216. {
  217. var c = new EmptyController();
  218. Assert.Null(c.Request);
  219. RouteData rd = new RouteData();
  220. Mock<ControllerContext> mockControllerContext = new Mock<ControllerContext>();
  221. mockControllerContext.Setup(cc => cc.Controller).Returns(c);
  222. mockControllerContext.Setup(cc => cc.RouteData).Returns(rd);
  223. c.ControllerContext = mockControllerContext.Object;
  224. Assert.Equal(rd, c.RouteData);
  225. }
  226. [Fact]
  227. public void ControllerMethodsDoNotHaveNonActionAttribute()
  228. {
  229. var methods = typeof(Controller).GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
  230. foreach (var method in methods)
  231. {
  232. var attrs = method.GetCustomAttributes(typeof(NonActionAttribute), true /* inherit */);
  233. Assert.True(attrs.Length == 0, "Methods on the Controller class should not be marked [NonAction]: " + method);
  234. }
  235. }
  236. [Fact]
  237. public void DisposeCallsProtectedDisposingMethod()
  238. {
  239. // Arrange
  240. Mock<Controller> mockController = new Mock<Controller>();
  241. mockController.Protected().Setup("Dispose", true).Verifiable();
  242. Controller controller = mockController.Object;
  243. // Act
  244. controller.Dispose();
  245. // Assert
  246. mockController.Verify();
  247. }
  248. [Fact]
  249. public void ExecuteWithUnknownAction()
  250. {
  251. // Arrange
  252. UnknownActionController controller = new UnknownActionController();
  253. // We need a provider since Controller.Execute is called
  254. controller.TempDataProvider = new EmptyTempDataProvider();
  255. ControllerContext context = GetControllerContext("Foo");
  256. Mock<IActionInvoker> mockInvoker = new Mock<IActionInvoker>();
  257. mockInvoker.Setup(o => o.InvokeAction(context, "Foo")).Returns(false);
  258. controller.ActionInvoker = mockInvoker.Object;
  259. // Act
  260. ((IController)controller).Execute(context.RequestContext);
  261. // Assert
  262. Assert.True(controller.WasCalled);
  263. }
  264. [Fact]
  265. public void FileWithContents()
  266. {
  267. // Arrange
  268. EmptyController controller = new EmptyController();
  269. byte[] fileContents = new byte[0];
  270. // Act
  271. FileContentResult result = controller.File(fileContents, "someContentType");
  272. // Assert
  273. Assert.NotNull(result);
  274. Assert.Same(fileContents, result.FileContents);
  275. Assert.Equal("someContentType", result.ContentType);
  276. Assert.Equal(String.Empty, result.FileDownloadName);
  277. }
  278. [Fact]
  279. public void FileWithContentsAndFileDownloadName()
  280. {
  281. // Arrange
  282. EmptyController controller = new EmptyController();
  283. byte[] fileContents = new byte[0];
  284. // Act
  285. FileContentResult result = controller.File(fileContents, "someContentType", "someDownloadName");
  286. // Assert
  287. Assert.NotNull(result);
  288. Assert.Same(fileContents, result.FileContents);
  289. Assert.Equal("someContentType", result.ContentType);
  290. Assert.Equal("someDownloadName", result.FileDownloadName);
  291. }
  292. [Fact]
  293. public void FileWithPath()
  294. {
  295. // Arrange
  296. EmptyController controller = new EmptyController();
  297. // Act
  298. FilePathResult result = controller.File("somePath", "someContentType");
  299. // Assert
  300. Assert.NotNull(result);
  301. Assert.Equal("somePath", result.FileName);
  302. Assert.Equal("someContentType", result.ContentType);
  303. Assert.Equal(String.Empty, result.FileDownloadName);
  304. }
  305. [Fact]
  306. public void FileWithPathAndFileDownloadName()
  307. {
  308. // Arrange
  309. EmptyController controller = new EmptyController();
  310. // Act
  311. FilePathResult result = controller.File("somePath", "someContentType", "someDownloadName");
  312. // Assert
  313. Assert.NotNull(result);
  314. Assert.Equal("somePath", result.FileName);
  315. Assert.Equal("someContentType", result.ContentType);
  316. Assert.Equal("someDownloadName", result.FileDownloadName);
  317. }
  318. [Fact]
  319. public void FileWithStream()
  320. {
  321. // Arrange
  322. EmptyController controller = new EmptyController();
  323. Stream fileStream = Stream.Null;
  324. // Act
  325. FileStreamResult result = controller.File(fileStream, "someContentType");
  326. // Assert
  327. Assert.NotNull(result);
  328. Assert.Same(fileStream, result.FileStream);
  329. Assert.Equal("someContentType", result.ContentType);
  330. Assert.Equal(String.Empty, result.FileDownloadName);
  331. }
  332. [Fact]
  333. public void FileWithStreamAndFileDownloadName()
  334. {
  335. // Arrange
  336. EmptyController controller = new EmptyController();
  337. Stream fileStream = Stream.Null;
  338. // Act
  339. FileStreamResult result = controller.File(fileStream, "someContentType", "someDownloadName");
  340. // Assert
  341. Assert.NotNull(result);
  342. Assert.Same(fileStream, result.FileStream);
  343. Assert.Equal("someContentType", result.ContentType);
  344. Assert.Equal("someDownloadName", result.FileDownloadName);
  345. }
  346. [Fact]
  347. public void HandleUnknownActionThrows()
  348. {
  349. var controller = new EmptyController();
  350. Assert.Throws<HttpException>(
  351. delegate { controller.HandleUnknownAction("UnknownAction"); },
  352. "A public action method 'UnknownAction' was not found on controller 'System.Web.Mvc.Test.ControllerTest+EmptyController'.");
  353. }
  354. [Fact]
  355. public void JavaScript()
  356. {
  357. // Arrange
  358. Controller controller = GetEmptyController();
  359. string script = "alert('foo');";
  360. // Act
  361. JavaScriptResult result = controller.JavaScript(script);
  362. // Assert
  363. Assert.Equal(script, result.Script);
  364. }
  365. [Fact]
  366. public void PartialView()
  367. {
  368. // Arrange
  369. Controller controller = GetEmptyController();
  370. // Act
  371. PartialViewResult result = controller.PartialView();
  372. // Assert
  373. Assert.Same(controller.TempData, result.TempData);
  374. Assert.Same(controller.ViewData, result.ViewData);
  375. Assert.Same(ViewEngines.Engines, result.ViewEngineCollection);
  376. }
  377. [Fact]
  378. public void PartialView_Model()
  379. {
  380. // Arrange
  381. Controller controller = GetEmptyController();
  382. object model = new object();
  383. // Act
  384. PartialViewResult result = controller.PartialView(model);
  385. // Assert
  386. Assert.Same(model, result.ViewData.Model);
  387. Assert.Same(controller.TempData, result.TempData);
  388. Assert.Same(controller.ViewData, result.ViewData);
  389. }
  390. [Fact]
  391. public void PartialView_ViewName()
  392. {
  393. // Arrange
  394. Controller controller = GetEmptyController();
  395. // Act
  396. PartialViewResult result = controller.PartialView("Some partial view");
  397. // Assert
  398. Assert.Equal("Some partial view", result.ViewName);
  399. Assert.Same(controller.TempData, result.TempData);
  400. Assert.Same(controller.ViewData, result.ViewData);
  401. }
  402. [Fact]
  403. public void PartialView_ViewName_Model()
  404. {
  405. // Arrange
  406. Controller controller = GetEmptyController();
  407. object model = new object();
  408. // Act
  409. PartialViewResult result = controller.PartialView("Some partial view", model);
  410. // Assert
  411. Assert.Equal("Some partial view", result.ViewName);
  412. Assert.Same(model, result.ViewData.Model);
  413. Assert.Same(controller.TempData, result.TempData);
  414. Assert.Same(controller.ViewData, result.ViewData);
  415. }
  416. [Fact]
  417. public void PartialView_ViewEngineCollection()
  418. {
  419. // Arrange
  420. Controller controller = GetEmptyController();
  421. ViewEngineCollection viewEngines = new ViewEngineCollection();
  422. controller.ViewEngineCollection = viewEngines;
  423. // Act
  424. PartialViewResult result = controller.PartialView();
  425. // Assert
  426. Assert.Same(viewEngines, result.ViewEngineCollection);
  427. }
  428. [Fact]
  429. public void RedirectToActionClonesRouteValueDictionary()
  430. {
  431. // The RedirectToAction() method should clone the provided dictionary, then operate on the clone.
  432. // The original dictionary should remain unmodified throughout the helper's execution.
  433. // Arrange
  434. Controller controller = GetEmptyController();
  435. RouteValueDictionary values = new RouteValueDictionary(new { Action = "SomeAction", Controller = "SomeController" });
  436. // Act
  437. controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
  438. // Assert
  439. Assert.Equal(2, values.Count);
  440. Assert.Equal("SomeAction", values["action"]);
  441. Assert.Equal("SomeController", values["controller"]);
  442. }
  443. [Fact]
  444. public void RedirectToActionOverwritesActionDictionaryKey()
  445. {
  446. // Arrange
  447. Controller controller = GetEmptyController();
  448. object values = new { Action = "SomeAction" };
  449. // Act
  450. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
  451. RouteValueDictionary newValues = result.RouteValues;
  452. // Assert
  453. Assert.Equal("SomeOtherAction", newValues["action"]);
  454. }
  455. [Fact]
  456. public void RedirectToActionOverwritesControllerDictionaryKeyIfSpecified()
  457. {
  458. // Arrange
  459. Controller controller = GetEmptyController();
  460. object values = new { Action = "SomeAction", Controller = "SomeController" };
  461. // Act
  462. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
  463. RouteValueDictionary newValues = result.RouteValues;
  464. // Assert
  465. Assert.Equal("SomeOtherController", newValues["controller"]);
  466. }
  467. [Fact]
  468. public void RedirectToActionPreservesControllerDictionaryKeyIfNotSpecified()
  469. {
  470. // Arrange
  471. Controller controller = GetEmptyController();
  472. object values = new { Controller = "SomeController" };
  473. // Act
  474. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
  475. RouteValueDictionary newValues = result.RouteValues;
  476. // Assert
  477. Assert.Equal("SomeController", newValues["controller"]);
  478. }
  479. [Fact]
  480. public void RedirectToActionWithActionName()
  481. {
  482. // Arrange
  483. Controller controller = GetEmptyController();
  484. // Act
  485. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction");
  486. // Assert
  487. Assert.Equal("", result.RouteName);
  488. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  489. Assert.False(result.Permanent);
  490. }
  491. [Fact]
  492. public void RedirectToActionWithActionNameAndControllerName()
  493. {
  494. // Arrange
  495. Controller controller = GetEmptyController();
  496. // Act
  497. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController");
  498. // Assert
  499. Assert.Equal("", result.RouteName);
  500. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  501. Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
  502. Assert.False(result.Permanent);
  503. }
  504. [Fact]
  505. public void RedirectToActionWithActionNameAndControllerNameAndValuesDictionary()
  506. {
  507. // Arrange
  508. Controller controller = GetEmptyController();
  509. RouteValueDictionary values = new RouteValueDictionary(new { Foo = "SomeFoo" });
  510. // Act
  511. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
  512. // Assert
  513. Assert.Equal("", result.RouteName);
  514. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  515. Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
  516. Assert.Equal("SomeFoo", result.RouteValues["foo"]);
  517. Assert.False(result.Permanent);
  518. }
  519. [Fact]
  520. public void RedirectToActionWithActionNameAndControllerNameAndValuesObject()
  521. {
  522. // Arrange
  523. Controller controller = GetEmptyController();
  524. object values = new { Foo = "SomeFoo" };
  525. // Act
  526. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", "SomeOtherController", values);
  527. // Assert
  528. Assert.Equal("", result.RouteName);
  529. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  530. Assert.Equal("SomeOtherController", result.RouteValues["controller"]);
  531. Assert.Equal("SomeFoo", result.RouteValues["foo"]);
  532. Assert.False(result.Permanent);
  533. }
  534. [Fact]
  535. public void RedirectToActionSelectsCurrentControllerByDefault()
  536. {
  537. // Arrange
  538. TestRouteController controller = new TestRouteController();
  539. controller.ControllerContext = GetControllerContext("SomeAction", "TestRoute");
  540. // Act
  541. RedirectToRouteResult route = controller.Index() as RedirectToRouteResult;
  542. // Assert
  543. Assert.Equal("SomeAction", route.RouteValues["action"]);
  544. Assert.Equal("TestRoute", route.RouteValues["controller"]);
  545. }
  546. [Fact]
  547. public void RedirectToActionDictionaryOverridesDefaultControllerName()
  548. {
  549. // Arrange
  550. TestRouteController controller = new TestRouteController();
  551. object values = new { controller = "SomeOtherController" };
  552. controller.ControllerContext = GetControllerContext("SomeAction", "TestRoute");
  553. // Act
  554. RedirectToRouteResult route = controller.RedirectToAction("SomeOtherAction", values);
  555. // Assert
  556. Assert.Equal("SomeOtherAction", route.RouteValues["action"]);
  557. Assert.Equal("SomeOtherController", route.RouteValues["controller"]);
  558. }
  559. [Fact]
  560. public void RedirectToActionSimpleOverridesCallLegacyMethod()
  561. {
  562. // The simple overrides need to call RedirectToAction(string, string, RouteValueDictionary) to maintain backwards compat
  563. // Arrange
  564. int invocationCount = 0;
  565. Mock<Controller> controllerMock = new Mock<Controller>();
  566. controllerMock.Setup(c => c.RedirectToAction(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<RouteValueDictionary>())).Callback(() => { invocationCount++; });
  567. Controller controller = controllerMock.Object;
  568. // Act
  569. controller.RedirectToAction("SomeAction");
  570. controller.RedirectToAction("SomeAction", (object)null);
  571. controller.RedirectToAction("SomeAction", (RouteValueDictionary)null);
  572. controller.RedirectToAction("SomeAction", "SomeController");
  573. controller.RedirectToAction("SomeAction", "SomeController", (object)null);
  574. // Assert
  575. Assert.Equal(5, invocationCount);
  576. }
  577. [Fact]
  578. public void RedirectToActionWithActionNameAndValuesDictionary()
  579. {
  580. // Arrange
  581. Controller controller = GetEmptyController();
  582. RouteValueDictionary values = new RouteValueDictionary(new { Foo = "SomeFoo" });
  583. // Act
  584. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
  585. // Assert
  586. Assert.Equal("", result.RouteName);
  587. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  588. Assert.Equal("SomeFoo", result.RouteValues["foo"]);
  589. Assert.False(result.Permanent);
  590. }
  591. [Fact]
  592. public void RedirectToActionWithActionNameAndValuesObject()
  593. {
  594. // Arrange
  595. Controller controller = GetEmptyController();
  596. object values = new { Foo = "SomeFoo" };
  597. // Act
  598. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", values);
  599. // Assert
  600. Assert.Equal("", result.RouteName);
  601. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  602. Assert.Equal("SomeFoo", result.RouteValues["foo"]);
  603. Assert.False(result.Permanent);
  604. }
  605. [Fact]
  606. public void RedirectToActionWithNullRouteValueDictionary()
  607. {
  608. // Arrange
  609. Controller controller = GetEmptyController();
  610. // Act
  611. RedirectToRouteResult result = controller.RedirectToAction("SomeOtherAction", (RouteValueDictionary)null);
  612. RouteValueDictionary newValues = result.RouteValues;
  613. // Assert
  614. Assert.Single(newValues);
  615. Assert.Equal("SomeOtherAction", newValues["action"]);
  616. Assert.False(result.Permanent);
  617. }
  618. [Fact]
  619. public void RedirectToActionPermanent()
  620. {
  621. // Arrange
  622. Controller controller = GetEmptyController();
  623. // Act
  624. RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction");
  625. // Assert
  626. Assert.True(result.Permanent);
  627. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  628. Assert.Null(result.RouteValues["controller"]);
  629. }
  630. [Fact]
  631. public void RedirectToActionPermanentWithObjectDictionary()
  632. {
  633. // Arrange
  634. Controller controller = GetEmptyController();
  635. // Act
  636. RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction", controllerName: "SomeController", routeValues: new { foo = "bar" });
  637. // Assert
  638. Assert.True(result.Permanent);
  639. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  640. Assert.Equal("bar", result.RouteValues["foo"]);
  641. Assert.Equal("SomeController", result.RouteValues["controller"]);
  642. }
  643. [Fact]
  644. public void RedirectToActionPermanentWithRouteValueDictionary()
  645. {
  646. // Arrange
  647. Controller controller = GetEmptyController();
  648. // Act
  649. RedirectToRouteResult result = controller.RedirectToActionPermanent("SomeOtherAction", routeValues: new RouteValueDictionary(new { foo = "bar" }));
  650. // Assert
  651. Assert.True(result.Permanent);
  652. Assert.Equal("SomeOtherAction", result.RouteValues["action"]);
  653. Assert.Equal("bar", result.RouteValues["foo"]);
  654. }
  655. [Fact]
  656. public void RedirectToRouteSimpleOverridesCallLegacyMethod()
  657. {
  658. // The simple overrides need to call RedirectToRoute(string, RouteValueDictionary) to maintain backwards compat
  659. // Arrange
  660. int invocationCount = 0;
  661. Mock<Controller> controllerMock = new Mock<Controller>();
  662. controllerMock.Setup(c => c.RedirectToRoute(It.IsAny<string>(), It.IsAny<RouteValueDictionary>())).Callback(() => { invocationCount++; });
  663. Controller controller = controllerMock.Object;
  664. // Act
  665. controller.RedirectToRoute("SomeRoute");
  666. controller.RedirectToRoute("SomeRoute", (object)null);
  667. controller.RedirectToRoute((object)null);
  668. controller.RedirectToRoute((RouteValueDictionary)null);
  669. // Assert
  670. Assert.Equal(4, invocationCount);
  671. }
  672. [Fact]
  673. public void RedirectToRouteWithNullRouteValueDictionary()
  674. {
  675. // Arrange
  676. Controller controller = GetEmptyController();
  677. // Act
  678. RedirectToRouteResult result = controller.RedirectToRoute((RouteValueDictionary)null);
  679. // Assert
  680. Assert.Empty(result.RouteValues);
  681. Assert.False(result.Permanent);
  682. }
  683. [Fact]
  684. public void RedirectToRouteWithObjectDictionary()
  685. {
  686. // Arrange
  687. Controller controller = GetEmptyController();
  688. var values = new { Foo = "MyFoo" };
  689. // Act
  690. RedirectToRouteResult result = controller.RedirectToRoute(values);
  691. // Assert
  692. Assert.Single(result.RouteValues);
  693. Assert.Equal("MyFoo", result.RouteValues["Foo"]);
  694. Assert.False(result.Permanent);
  695. }
  696. [Fact]
  697. public void RedirectToRouteWithRouteValueDictionary()
  698. {
  699. // Arrange
  700. Controller controller = GetEmptyController();
  701. RouteValueDictionary values = new RouteValueDictionary() { { "Foo", "MyFoo" } };
  702. // Act
  703. RedirectToRouteResult result = controller.RedirectToRoute(values);
  704. // Assert
  705. Assert.Single(result.RouteValues);
  706. Assert.Equal("MyFoo", result.RouteValues["Foo"]);
  707. Assert.NotSame(values, result.RouteValues);
  708. Assert.False(result.Permanent);
  709. }
  710. [Fact]
  711. public void RedirectToRouteWithName()
  712. {
  713. // Arrange
  714. Controller controller = GetEmptyController();
  715. // Act
  716. RedirectToRouteResult result = controller.RedirectToRoute("foo");
  717. // Assert
  718. Assert.Empty(result.RouteValues);
  719. Assert.Equal("foo", result.RouteName);
  720. Assert.False(result.Permanent);
  721. }
  722. [Fact]
  723. public void RedirectToRouteWithNameAndNullRouteValueDictionary()
  724. {
  725. // Arrange
  726. Controller controller = GetEmptyController();
  727. // Act
  728. RedirectToRouteResult result = controller.RedirectToRoute("foo", (RouteValueDictionary)null);
  729. // Assert
  730. Assert.Empty(result.RouteValues);
  731. Assert.Equal("foo", result.RouteName);
  732. Assert.False(result.Permanent);
  733. }
  734. [Fact]
  735. public void RedirectToRouteWithNullNameAndNullRouteValueDictionary()
  736. {
  737. // Arrange
  738. Controller controller = GetEmptyController();
  739. // Act
  740. RedirectToRouteResult result = controller.RedirectToRoute(null, (RouteValueDictionary)null);
  741. // Assert
  742. Assert.Empty(result.RouteValues);
  743. Assert.Equal(String.Empty, result.RouteName);
  744. Assert.False(result.Permanent);
  745. }
  746. [Fact]
  747. public void RedirectToRouteWithNameAndObjectDictionary()
  748. {
  749. // Arrange
  750. Controller controller = GetEmptyController();
  751. var values = new { Foo = "MyFoo" };
  752. // Act
  753. RedirectToRouteResult result = controller.RedirectToRoute("foo", values);
  754. // Assert
  755. Assert.Single(result.RouteValues);
  756. Assert.Equal("MyFoo", result.RouteValues["Foo"]);
  757. Assert.Equal("foo", result.RouteName);
  758. Assert.False(result.Permanent);
  759. }
  760. [Fact]
  761. public void RedirectToRouteWithNameAndRouteValueDictionary()
  762. {
  763. // Arrange
  764. Controller controller = GetEmptyController();
  765. RouteValueDictionary values = new RouteValueDictionary() { { "Foo", "MyFoo" } };
  766. // Act
  767. RedirectToRouteResult result = controller.RedirectToRoute("foo", values);
  768. // Assert
  769. Assert.Single(result.RouteValues);
  770. Assert.Equal("MyFoo", result.RouteValues["Foo"]);
  771. Assert.NotSame(values, result.RouteValues);
  772. Assert.Equal("foo", result.RouteName);
  773. Assert.False(result.Permanent);
  774. }
  775. [Fact]
  776. public void RedirectToRoutePermanentWithObjectDictionary()
  777. {
  778. // Arrange
  779. Controller controller = GetEmptyController();
  780. // Act
  781. RedirectToRouteResult result = controller.RedirectToRoutePermanent(routeValues: new { Foo = "Bar" });
  782. // Assert
  783. Assert.True(result.Permanent);
  784. Assert.Equal("Bar", result.RouteValues["Foo"]);
  785. }
  786. [Fact]
  787. public void RedirectToRoutePermanentWithRouteValueDictionary()
  788. {
  789. // Arrange
  790. Controller controller = GetEmptyController();
  791. // Act
  792. RedirectToRouteResult result = controller.RedirectToRoutePermanent(routeValues: new RouteValueDictionary(new { Foo = "Bar" }));
  793. // Assert
  794. Assert.True(result.Permanent);
  795. Assert.Equal("Bar", result.RouteValues["Foo"]);
  796. }
  797. [Fact]
  798. public void RedirectReturnsCorrectActionResult()
  799. {
  800. // Arrange
  801. Controller controller = GetEmptyController();
  802. // Act & Assert
  803. var result = controller.Redirect("http://www.contoso.com/");
  804. // Assert
  805. Assert.Equal("http://www.contoso.com/", result.Url);
  806. Assert.False(result.Permanent);
  807. }
  808. [Fact]
  809. public void RedirectPermanentReturnsCorrectActionResult()
  810. {
  811. // Arrange
  812. Controller controller = GetEmptyController();
  813. // Act & Assert
  814. var result = controller.RedirectPermanent("http://www.contoso.com/");
  815. // Assert
  816. Assert.Equal("http://www.contoso.com/", result.Url);
  817. Assert.True(result.Permanent);
  818. }
  819. [Fact]
  820. public void RedirectWithEmptyUrlThrows()
  821. {
  822. // Arrange
  823. Controller controller = GetEmptyController();
  824. // Act & Assert
  825. Assert.ThrowsArgumentNullOrEmpty(
  826. delegate { controller.Redirect(String.Empty); },
  827. "url");
  828. }
  829. [Fact]
  830. public void RedirectPermanentWithEmptyUrlThrows()
  831. {
  832. // Arrange
  833. Controller controller = GetEmptyController();
  834. // Act & Assert
  835. Assert.ThrowsArgumentNullOrEmpty(
  836. delegate { controller.RedirectPermanent(String.Empty); },
  837. "url");
  838. }
  839. [Fact]
  840. public void RedirectWithNullUrlThrows()
  841. {
  842. // Arrange
  843. Controller controller = GetEmptyController();
  844. // Act & Assert
  845. Assert.ThrowsArgumentNullOrEmpty(
  846. delegate { controller.Redirect(url: null); },
  847. "url");
  848. }
  849. [Fact]
  850. public void RedirectPermanentWithNullUrlThrows()
  851. {
  852. // Arrange
  853. Controller controller = GetEmptyController();
  854. // Act & Assert
  855. Assert.ThrowsArgumentNullOrEmpty(
  856. delegate { controller.RedirectPermanent(url: null); },
  857. "url");
  858. }
  859. [Fact]
  860. public void View()
  861. {
  862. // Arrange
  863. Controller controller = GetEmptyController();
  864. // Act
  865. ViewResult result = controller.View();
  866. // Assert
  867. Assert.Same(controller.ViewData, result.ViewData);
  868. Assert.Same(controller.TempData, result.TempData);
  869. Assert.Same(ViewEngines.Engines, result.ViewEngineCollection);
  870. }
  871. [Fact]
  872. public void View_Model()
  873. {
  874. // Arrange
  875. Controller controller = GetEmptyController();
  876. object viewItem = new object();
  877. // Act
  878. ViewResult result = controller.View(viewItem);
  879. // Assert
  880. Assert.Same(viewItem, result.ViewData.Model);
  881. Assert.Same(controller.TempData, result.TempData);
  882. }
  883. [Fact]
  884. public void View_ViewName()
  885. {
  886. // Arrange
  887. Controller controller = GetEmptyController();
  888. // Act
  889. ViewResult result = controller.View("Foo");
  890. // Assert
  891. Assert.Equal("Foo", result.ViewName);
  892. Assert.Same(controller.ViewData, result.ViewData);
  893. Assert.Same(controller.TempData, result.TempData);
  894. }
  895. [Fact]
  896. public void View_ViewName_Model()
  897. {
  898. // Arrange
  899. Controller controller = GetEmptyController();
  900. object viewItem = new object();
  901. // Act
  902. ViewResult result = controller.View("Foo", viewItem);
  903. // Assert
  904. Assert.Equal("Foo", result.ViewName);
  905. Assert.Same(viewItem, result.ViewData.Model);
  906. Assert.Same(controller.TempData, result.TempData);
  907. }
  908. [Fact]
  909. public void View_ViewName_MasterViewName()
  910. {
  911. // Arrange
  912. Controller controller = GetEmptyController();
  913. // Act
  914. ViewResult result = controller.View("Foo", "Bar");
  915. // Assert
  916. Assert.Equal("Foo", result.ViewName);
  917. Assert.Equal("Bar", result.MasterName);
  918. Assert.Same(controller.ViewData, result.ViewData);
  919. Assert.Same(controller.TempData, result.TempData);
  920. }
  921. [Fact]
  922. public void View_ViewName_MasterViewName_Model()
  923. {
  924. // Arrange
  925. Controller controller = GetEmptyController();
  926. object viewItem = new object();
  927. // Act
  928. ViewResult result = controller.View("Foo", "Bar", viewItem);
  929. // Assert
  930. Assert.Equal("Foo", result.ViewName);
  931. Assert.Equal("Bar", result.MasterName);
  932. Assert.Same(viewItem, result.ViewData.Model);
  933. Assert.Same(controller.TempData, result.TempData);
  934. }
  935. [Fact]
  936. public void View_View()
  937. {
  938. // Arrange
  939. Controller controller = GetEmptyController();
  940. IView view = new Mock<IView>().Object;
  941. // Act
  942. ViewResult result = controller.View(view);
  943. // Assert
  944. Assert.Same(result.View, view);
  945. Assert.Same(controller.ViewData, result.ViewData);
  946. Assert.Same(controller.TempData, result.TempData);
  947. }
  948. [Fact]
  949. public void View_View_Model()
  950. {
  951. // Arrange
  952. Controller controller = GetEmptyController();
  953. IView view = new Mock<IView>().Object;
  954. object model = new object();
  955. // Act
  956. ViewResult result = controller.View(view, model);
  957. // Assert
  958. Assert.Same(result.View, view);
  959. Assert.Same(controller.ViewData, result.ViewData);
  960. Assert.Same(controller.TempData, result.TempData);
  961. Assert.Same(model, result.ViewData.Model);
  962. }
  963. [Fact]
  964. public void View_ViewEngineCollection()
  965. {
  966. // Arrange
  967. Controller controller = GetEmptyController();
  968. ViewEngineCollection viewEngines = new ViewEngineCollection();
  969. controller.ViewEngineCollection = viewEngines;
  970. // Act
  971. ViewResult result = controller.View();
  972. // Assert
  973. Assert.Same(viewEngines, result.ViewEngineCollection);
  974. }
  975. internal static void AddRequestParams(Mock<HttpRequestBase> requestMock, object paramValues)
  976. {
  977. PropertyDescriptorCollection props = TypeDescriptor.GetProperties(paramValues);
  978. foreach (PropertyDescriptor prop in props)
  979. {
  980. requestMock.Setup(o => o[It.Is<string>(item => String.Equals(prop.Name, item, StringComparison.OrdinalIgnoreCase))]).Returns((string)prop.GetValue(paramValues));
  981. }
  982. }
  983. [Fact]
  984. public void TempDataGreetUserWithNoUserIDRedirects()
  985. {
  986. // Arrange
  987. TempDataHomeController tempDataHomeController = new TempDataHomeController();
  988. // Act
  989. RedirectToRouteResult result = tempDataHomeController.GreetUser() as RedirectToRouteResult;
  990. RouteValueDictionary values = result.RouteValues;
  991. // Assert
  992. Assert.True(values.ContainsKey("action"));
  993. Assert.Equal("ErrorPage", values["action"]);
  994. Assert.Empty(tempDataHomeController.TempData);
  995. }
  996. [Fact]
  997. public void TempDataGreetUserWithUserIDCopiesToViewDataAndRenders()
  998. {
  999. // Arrange
  1000. TempDataHomeController tempDataHomeController = new TempDataHomeController();
  1001. tempDataHomeController.TempData["UserID"] = "TestUserID";
  1002. // Act
  1003. ViewResult result = tempDataHomeController.GreetUser() as ViewResult;
  1004. ViewDataDictionary viewData = tempDataHomeController.ViewData;
  1005. // Assert
  1006. Assert.Equal("GreetUser", result.ViewName);
  1007. Assert.NotNull(viewData);
  1008. Assert.True(viewData.ContainsKey("NewUserID"));
  1009. Assert.Equal("TestUserID", viewData["NewUserID"]);
  1010. }
  1011. [Fact]
  1012. public void TempDataIndexSavesUserIDAndRedirects()
  1013. {
  1014. // Arrange
  1015. TempDataHomeController tempDataHomeController = new TempDataHomeController();
  1016. // Act
  1017. RedirectToRouteResult result = tempDataHomeController.Index() as RedirectToRouteResult;
  1018. RouteValueDictionary values = result.RouteValues;
  1019. // Assert
  1020. Assert.True(values.ContainsKey("action"));
  1021. Assert.Equal("GreetUser", values["action"]);
  1022. Assert.True(tempDataHomeController.TempData.ContainsKey("UserID"));
  1023. Assert.Equal("user123", tempDataHomeController.TempData["UserID"]);
  1024. }
  1025. [Fact]
  1026. public void TempDataSavedWhenControllerThrows()
  1027. {
  1028. // Arrange
  1029. BrokenController controller = new BrokenController() { ValidateRequest = false };
  1030. Mock<HttpContextBase> mockContext = HttpContextHelpers.GetMockHttpContext();
  1031. HttpSessionStateBase session = GetEmptySession();
  1032. mockContext.Setup(o => o.Session).Returns(session);
  1033. RouteData rd = new RouteData();
  1034. rd.Values.Add("action", "Crash");
  1035. controller.ControllerContext = new ControllerContext(mockContext.Object, rd, controller);
  1036. // Assert
  1037. Assert.Throws<InvalidOperationException>(
  1038. delegate { ((IController)controller).Execute(controller.ControllerContext.RequestContext); });
  1039. Assert.NotEqual(mockContext.Object.Session[SessionStateTempDataProvider.TempDataSessionStateKey], null);
  1040. TempDataDictionary tempData = new TempDataDictionary();
  1041. tempData.Load(controller.ControllerContext, controller.TempDataProvider);
  1042. Assert.Equal(tempData["Key1"], "Value1");
  1043. }
  1044. [Fact]
  1045. public void TempDataMovedToPreviousTempDataInDestinationController()
  1046. {
  1047. // Arrange
  1048. Mock<Controller> mockController = new Mock<Controller>() { CallBase = true };
  1049. Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
  1050. HttpSessionStateBase session = GetEmptySession();
  1051. mockContext.Setup(o => o.Session).Returns(session);
  1052. mockController.Object.ControllerContext = new ControllerContext(mockContext.Object, new RouteData(), mockController.Object);
  1053. // Act
  1054. mockController.Object.TempData.Add("Key", "Value");
  1055. mockController.Object.TempData.Save(mockController.Object.ControllerContext, mockController.Object.TempDataProvider);
  1056. // Assert
  1057. Assert.True(mockController.Object.TempData.ContainsKey("Key"));
  1058. Assert.True(mockController.Object.TempData.ContainsValue("Value"));
  1059. // Instantiate "destination" controller with the same session state and see that it gets the temp data
  1060. Mock<Controller> mockDestinationController = new Mock<Controller>() { CallBase = true };
  1061. Mock<HttpContextBase> mockDestinationContext = new Mock<HttpContextBase>();
  1062. mockDestinationContext.Setup(o => o.Session).Returns(session);
  1063. mockDestinationController.Object.ControllerContext = new ControllerContext(mockDestinationContext.Object, new RouteData(), mockDestinationController.Object);
  1064. mockDestinationController.Object.TempData.Load(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
  1065. // Assert
  1066. Assert.True(mockDestinationController.Object.TempData.ContainsKey("Key"));
  1067. // Act
  1068. mockDestinationController.Object.TempData["NewKey"] = "NewValue";
  1069. Assert.True(mockDestinationController.Object.TempData.ContainsKey("NewKey"));
  1070. mockDestinationController.Object.TempData.Save(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
  1071. // Instantiate "second destination" controller with the same session state and see that it gets the temp data
  1072. Mock<Controller> mockSecondDestinationController = new Mock<Controller>() { CallBase = true };
  1073. Mock<HttpContextBase> mockSecondDestinationContext = new Mock<HttpContextBase>();
  1074. mockSecondDestinationContext.Setup(o => o.Session).Returns(session);
  1075. mockSecondDestinationController.Object.ControllerContext = new ControllerContext(mockSecondDestinationContext.Object, new RouteData(), mockSecondDestinationController.Object);
  1076. mockSecondDestinationController.Object.TempData.Load(mockSecondDestinationController.Object.ControllerContext, mockSecondDestinationController.Object.TempDataProvider);
  1077. // Assert
  1078. Assert.True(mockSecondDestinationController.Object.TempData.ContainsKey("Key"));
  1079. Assert.True(mockSecondDestinationController.Object.TempData.ContainsKey("NewKey"));
  1080. }
  1081. [Fact]
  1082. public void TempDataRemovesKeyWhenRead()
  1083. {
  1084. // Arrange
  1085. Mock<Controller> mockController = new Mock<Controller>() { CallBase = true };
  1086. Mock<HttpContextBase> mockContext = new Mock<HttpContextBase>();
  1087. HttpSessionStateBase session = GetEmptySession();
  1088. mockContext.Setup(o => o.Session).Returns(session);
  1089. mockController.Object.ControllerContext = new ControllerContext(mockContext.Object, new RouteData(), mockController.Object);
  1090. // Act
  1091. mockController.Object.TempData.Add("Key", "Value");
  1092. mockController.Object.TempData.Save(mockController.Object.ControllerContext, mockController.Object.TempDataProvider);
  1093. // Assert
  1094. Assert.True(mockController.Object.TempData.ContainsKey("Key"));
  1095. Assert.True(mockController.Object.TempData.ContainsValue("Value"));
  1096. // Instantiate "destination" controller with the same session state and see that it gets the temp data
  1097. Mock<Controller> mockDestinationController = new Mock<Controller>() { CallBase = true };
  1098. Mock<HttpContextBase> mockDestinationContext = new Mock<HttpContextBase>();
  1099. mockDestinationContext.Setup(o => o.Session).Returns(session);
  1100. mockDestinationController.Object.ControllerContext = new ControllerContext(mockDestinationContext.Object, new RouteData(), mockDestinationController.Object);
  1101. mockDestinationController.Object.TempData.Load(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
  1102. // Assert
  1103. Assert.True(mockDestinationController.Object.TempData.ContainsKey("Key"));
  1104. // Act
  1105. object value = mockDestinationController.Object.TempData["Key"];
  1106. mockDestinationController.Object.TempData.Save(mockDestinationController.Object.ControllerContext, mockDestinationController.Object.TempDataProvider);
  1107. // Instantiate "second destination" con