PageRenderTime 37ms CodeModel.GetById 0ms RepoModel.GetById 2ms app.codeStats 0ms

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

https://bitbucket.org/mdavid/aspnetwebstack
C# | 538 lines | 392 code | 83 blank | 63 comment | 2 complexity | 6a06bf16a3dbab6b0a5b2738ded7687e MD5 | raw file
  1. using System.IO;
  2. using System.Web.Routing;
  3. using System.Web.TestUtil;
  4. using System.Web.UI;
  5. using Moq;
  6. using Xunit;
  7. using Assert = Microsoft.TestCommon.AssertEx;
  8. namespace System.Web.Mvc.Test
  9. {
  10. public class ViewUserControlTest
  11. {
  12. [Fact]
  13. public void ModelProperty()
  14. {
  15. // Arrange
  16. object model = new object();
  17. ViewDataDictionary viewData = new ViewDataDictionary(model);
  18. ViewUserControl viewUserControl = new ViewUserControl();
  19. viewUserControl.ViewData = viewData;
  20. // Act
  21. object viewPageModel = viewUserControl.Model;
  22. // Assert
  23. Assert.Equal(model, viewPageModel);
  24. Assert.Equal(model, viewUserControl.ViewData.Model);
  25. }
  26. [Fact]
  27. public void ModelPropertyStronglyTyped()
  28. {
  29. // Arrange
  30. FooModel model = new FooModel();
  31. ViewDataDictionary<FooModel> viewData = new ViewDataDictionary<FooModel>(model);
  32. ViewUserControl<FooModel> viewUserControl = new ViewUserControl<FooModel>();
  33. viewUserControl.ViewData = viewData;
  34. // Act
  35. object viewPageModelObject = ((ViewUserControl)viewUserControl).Model;
  36. FooModel viewPageModelPerson = viewUserControl.Model;
  37. // Assert
  38. Assert.Equal(model, viewPageModelObject);
  39. Assert.Equal(model, viewPageModelPerson);
  40. }
  41. [Fact]
  42. public void RenderViewAndRestoreContentType()
  43. {
  44. // Arrange
  45. Mock<ViewContext> mockViewContext = new Mock<ViewContext>();
  46. mockViewContext.SetupProperty(c => c.HttpContext.Response.ContentType);
  47. ViewContext vc = mockViewContext.Object;
  48. Mock<ViewPage> mockViewPage = new Mock<ViewPage>();
  49. mockViewPage.Setup(vp => vp.RenderView(vc)).Callback(() => vc.HttpContext.Response.ContentType = "newContentType");
  50. // Act
  51. vc.HttpContext.Response.ContentType = "oldContentType";
  52. ViewUserControl.RenderViewAndRestoreContentType(mockViewPage.Object, vc);
  53. string postContentType = vc.HttpContext.Response.ContentType;
  54. // Assert
  55. Assert.Equal("oldContentType", postContentType);
  56. }
  57. [Fact]
  58. public void SetViewItem()
  59. {
  60. // Arrange
  61. ViewUserControl vuc = new ViewUserControl();
  62. object viewItem = new object();
  63. vuc.ViewData = new ViewDataDictionary(viewItem);
  64. // Act
  65. vuc.ViewData.Model = viewItem;
  66. object newViewItem = vuc.ViewData.Model;
  67. // Assert
  68. Assert.Same(viewItem, newViewItem);
  69. }
  70. [Fact]
  71. public void SetViewItemOnBaseClassPropagatesToDerivedClass()
  72. {
  73. // Arrange
  74. ViewUserControl<object> vucInt = new ViewUserControl<object>();
  75. ViewUserControl vuc = vucInt;
  76. vuc.ViewData = new ViewDataDictionary();
  77. object o = new object();
  78. // Act
  79. vuc.ViewData.Model = o;
  80. // Assert
  81. Assert.Equal(o, vucInt.ViewData.Model);
  82. Assert.Equal(o, vuc.ViewData.Model);
  83. }
  84. [Fact]
  85. public void SetViewItemOnDerivedClassPropagatesToBaseClass()
  86. {
  87. // Arrange
  88. ViewUserControl<object> vucInt = new ViewUserControl<object>();
  89. ViewUserControl vuc = vucInt;
  90. vucInt.ViewData = new ViewDataDictionary<object>();
  91. object o = new object();
  92. // Act
  93. vucInt.ViewData.Model = o;
  94. // Assert
  95. Assert.Equal(o, vucInt.ViewData.Model);
  96. Assert.Equal(o, vuc.ViewData.Model);
  97. }
  98. [Fact]
  99. public void SetViewItemToWrongTypeThrows()
  100. {
  101. // Arrange
  102. ViewUserControl<string> vucString = new ViewUserControl<string>();
  103. vucString.ViewData = new ViewDataDictionary<string>();
  104. ViewUserControl vuc = vucString;
  105. // Act & Assert
  106. Assert.Throws<InvalidOperationException>(
  107. delegate { vuc.ViewData.Model = 50; },
  108. "The model item passed into the dictionary is of type 'System.Int32', but this dictionary requires a model item of type 'System.String'.");
  109. }
  110. [Fact]
  111. public void GetViewDataWhenNoPageSetThrows()
  112. {
  113. ViewUserControl vuc = new ViewUserControl();
  114. vuc.AppRelativeVirtualPath = "~/Foo.ascx";
  115. Assert.Throws<InvalidOperationException>(
  116. delegate { var foo = vuc.ViewData["Foo"]; },
  117. "The ViewUserControl '~/Foo.ascx' cannot find an IViewDataContainer object. The ViewUserControl must be inside a ViewPage, a ViewMasterPage, or another ViewUserControl.");
  118. }
  119. [Fact]
  120. public void GetViewDataWhenRegularPageSetThrows()
  121. {
  122. Page p = new Page();
  123. p.Controls.Add(new Control());
  124. ViewUserControl vuc = new ViewUserControl();
  125. p.Controls[0].Controls.Add(vuc);
  126. vuc.AppRelativeVirtualPath = "~/Foo.ascx";
  127. Assert.Throws<InvalidOperationException>(
  128. delegate { var foo = vuc.ViewData["Foo"]; },
  129. "The ViewUserControl '~/Foo.ascx' cannot find an IViewDataContainer object. The ViewUserControl must be inside a ViewPage, a ViewMasterPage, or another ViewUserControl.");
  130. }
  131. [Fact]
  132. public void GetViewDataFromViewPage()
  133. {
  134. // Arrange
  135. ViewPage p = new ViewPage();
  136. p.Controls.Add(new Control());
  137. ViewUserControl vuc = new ViewUserControl();
  138. p.Controls[0].Controls.Add(vuc);
  139. p.ViewData = new ViewDataDictionary { { "FirstName", "Joe" }, { "LastName", "Schmoe" } };
  140. // Act
  141. object firstName = vuc.ViewData.Eval("FirstName");
  142. object lastName = vuc.ViewData.Eval("LastName");
  143. // Assert
  144. Assert.Equal("Joe", firstName);
  145. Assert.Equal("Schmoe", lastName);
  146. }
  147. [Fact]
  148. public void GetViewDataFromViewPageWithViewDataKeyPointingToObject()
  149. {
  150. // Arrange
  151. ViewDataDictionary vdd = new ViewDataDictionary()
  152. {
  153. { "Foo", "FooParent" },
  154. { "Bar", "BarParent" },
  155. { "Child", new object() }
  156. };
  157. ViewPage p = new ViewPage();
  158. p.Controls.Add(new Control());
  159. ViewUserControl vuc = new ViewUserControl() { ViewDataKey = "Child" };
  160. p.Controls[0].Controls.Add(vuc);
  161. p.ViewData = vdd;
  162. // Act
  163. object oFoo = vuc.ViewData.Eval("Foo");
  164. object oBar = vuc.ViewData.Eval("Bar");
  165. // Assert
  166. Assert.Equal(vdd["Child"], vuc.ViewData.Model);
  167. Assert.Equal("FooParent", oFoo);
  168. Assert.Equal("BarParent", oBar);
  169. }
  170. [Fact]
  171. public void GetViewDataFromViewPageWithViewDataKeyPointingToViewDataDictionary()
  172. {
  173. // Arrange
  174. ViewDataDictionary vdd = new ViewDataDictionary()
  175. {
  176. { "Foo", "FooParent" },
  177. { "Bar", "BarParent" },
  178. {
  179. "Child",
  180. new ViewDataDictionary()
  181. {
  182. { "Foo", "FooChild" },
  183. { "Bar", "BarChild" }
  184. }
  185. }
  186. };
  187. ViewPage p = new ViewPage();
  188. p.Controls.Add(new Control());
  189. ViewUserControl vuc = new ViewUserControl() { ViewDataKey = "Child" };
  190. p.Controls[0].Controls.Add(vuc);
  191. p.ViewData = vdd;
  192. // Act
  193. object oFoo = vuc.ViewData.Eval("Foo");
  194. object oBar = vuc.ViewData.Eval("Bar");
  195. // Assert
  196. Assert.Equal(vdd["Child"], vuc.ViewData);
  197. Assert.Equal("FooChild", oFoo);
  198. Assert.Equal("BarChild", oBar);
  199. }
  200. [Fact]
  201. public void GetViewDataFromViewUserControl()
  202. {
  203. // Arrange
  204. ViewPage p = new ViewPage();
  205. p.Controls.Add(new Control());
  206. ViewUserControl outerVuc = new ViewUserControl();
  207. p.Controls[0].Controls.Add(outerVuc);
  208. outerVuc.Controls.Add(new Control());
  209. ViewUserControl vuc = new ViewUserControl();
  210. outerVuc.Controls[0].Controls.Add(vuc);
  211. p.ViewData = new ViewDataDictionary { { "FirstName", "Joe" }, { "LastName", "Schmoe" } };
  212. // Act
  213. object firstName = vuc.ViewData.Eval("FirstName");
  214. object lastName = vuc.ViewData.Eval("LastName");
  215. // Assert
  216. Assert.Equal("Joe", firstName);
  217. Assert.Equal("Schmoe", lastName);
  218. }
  219. [Fact]
  220. public void GetViewDataFromViewUserControlWithViewDataKeyOnInnerControl()
  221. {
  222. // Arrange
  223. ViewPage p = new ViewPage();
  224. p.Controls.Add(new Control());
  225. ViewUserControl outerVuc = new ViewUserControl();
  226. p.Controls[0].Controls.Add(outerVuc);
  227. outerVuc.Controls.Add(new Control());
  228. ViewUserControl vuc = new ViewUserControl() { ViewDataKey = "SubData" };
  229. outerVuc.Controls[0].Controls.Add(vuc);
  230. p.ViewData = new ViewDataDictionary { { "FirstName", "Joe" }, { "LastName", "Schmoe" } };
  231. p.ViewData["SubData"] = new ViewDataDictionary { { "FirstName", "SubJoe" }, { "LastName", "SubSchmoe" } };
  232. // Act
  233. object firstName = vuc.ViewData.Eval("FirstName");
  234. object lastName = vuc.ViewData.Eval("LastName");
  235. // Assert
  236. Assert.Equal("SubJoe", firstName);
  237. Assert.Equal("SubSchmoe", lastName);
  238. }
  239. [Fact]
  240. public void GetViewDataFromViewUserControlWithViewDataKeyOnOuterControl()
  241. {
  242. // Arrange
  243. ViewPage p = new ViewPage();
  244. p.Controls.Add(new Control());
  245. ViewUserControl outerVuc = new ViewUserControl() { ViewDataKey = "SubData" };
  246. p.Controls[0].Controls.Add(outerVuc);
  247. outerVuc.Controls.Add(new Control());
  248. ViewUserControl vuc = new ViewUserControl();
  249. outerVuc.Controls[0].Controls.Add(vuc);
  250. p.ViewData = new ViewDataDictionary { { "FirstName", "Joe" }, { "LastName", "Schmoe" } };
  251. p.ViewData["SubData"] = new ViewDataDictionary { { "FirstName", "SubJoe" }, { "LastName", "SubSchmoe" } };
  252. // Act
  253. object firstName = vuc.ViewData.Eval("FirstName");
  254. object lastName = vuc.ViewData.Eval("LastName");
  255. // Assert
  256. Assert.Equal("SubJoe", firstName);
  257. Assert.Equal("SubSchmoe", lastName);
  258. }
  259. [Fact]
  260. public void ViewDataKeyProperty()
  261. {
  262. MemberHelper.TestStringProperty(new ViewUserControl(), "ViewDataKey", String.Empty, testDefaultValueAttribute: true);
  263. }
  264. [Fact]
  265. public void GetWrongGenericViewItemTypeThrows()
  266. {
  267. // Arrange
  268. ViewPage p = new ViewPage();
  269. p.ViewData = new ViewDataDictionary();
  270. p.ViewData["Foo"] = new DummyViewData { MyInt = 123, MyString = "Whatever" };
  271. MockViewUserControl<MyViewData> vuc = new MockViewUserControl<MyViewData>() { ViewDataKey = "FOO" };
  272. vuc.AppRelativeVirtualPath = "~/Foo.aspx";
  273. p.Controls.Add(new Control());
  274. p.Controls[0].Controls.Add(vuc);
  275. // Act
  276. Assert.Throws<InvalidOperationException>(
  277. delegate { var foo = vuc.ViewData.Model.IntProp; },
  278. @"The model item passed into the dictionary is of type 'System.Web.Mvc.Test.ViewUserControlTest+DummyViewData', but this dictionary requires a model item of type 'System.Web.Mvc.Test.ViewUserControlTest+MyViewData'.");
  279. }
  280. [Fact]
  281. public void GetGenericViewItemType()
  282. {
  283. // Arrange
  284. ViewPage p = new ViewPage();
  285. p.Controls.Add(new Control());
  286. MockViewUserControl<MyViewData> vuc = new MockViewUserControl<MyViewData>() { ViewDataKey = "FOO" };
  287. p.Controls[0].Controls.Add(vuc);
  288. p.ViewData = new ViewDataDictionary();
  289. p.ViewData["Foo"] = new MyViewData { IntProp = 123, StringProp = "miao" };
  290. // Act
  291. int intProp = vuc.ViewData.Model.IntProp;
  292. string stringProp = vuc.ViewData.Model.StringProp;
  293. // Assert
  294. Assert.Equal(123, intProp);
  295. Assert.Equal("miao", stringProp);
  296. }
  297. [Fact]
  298. public void GetHtmlHelperFromViewPage()
  299. {
  300. // Arrange
  301. ViewUserControl vuc = new ViewUserControl();
  302. ViewPage containerPage = new ViewPage();
  303. containerPage.Controls.Add(vuc);
  304. ViewContext vc = new Mock<ViewContext>().Object;
  305. vuc.ViewContext = vc;
  306. // Act
  307. HtmlHelper htmlHelper = vuc.Html;
  308. // Assert
  309. Assert.Equal(vc, htmlHelper.ViewContext);
  310. Assert.Equal(vuc, htmlHelper.ViewDataContainer);
  311. }
  312. [Fact]
  313. public void GetHtmlHelperFromRegularPage()
  314. {
  315. // Arrange
  316. ViewUserControl vuc = new ViewUserControl();
  317. Page containerPage = new Page();
  318. containerPage.Controls.Add(vuc);
  319. // Assert
  320. Assert.Throws<InvalidOperationException>(
  321. delegate { HtmlHelper foo = vuc.Html; },
  322. "A ViewUserControl can be used only in pages that derive from ViewPage or ViewPage<TModel>.");
  323. }
  324. [Fact]
  325. public void GetUrlHelperFromViewPage()
  326. {
  327. // Arrange
  328. ViewUserControl vuc = new ViewUserControl();
  329. ViewPage containerPage = new ViewPage();
  330. containerPage.Controls.Add(vuc);
  331. RequestContext rc = new RequestContext(new Mock<HttpContextBase>().Object, new RouteData());
  332. UrlHelper urlHelper = new UrlHelper(rc);
  333. containerPage.Url = urlHelper;
  334. // Assert
  335. Assert.Equal(vuc.Url, urlHelper);
  336. }
  337. [Fact]
  338. public void GetUrlHelperFromRegularPage()
  339. {
  340. // Arrange
  341. ViewUserControl vuc = new ViewUserControl();
  342. Page containerPage = new Page();
  343. containerPage.Controls.Add(vuc);
  344. // Assert
  345. Assert.Throws<InvalidOperationException>(
  346. delegate { UrlHelper foo = vuc.Url; },
  347. "A ViewUserControl can be used only in pages that derive from ViewPage or ViewPage<TModel>.");
  348. }
  349. [Fact]
  350. public void GetWriterFromViewPage()
  351. {
  352. // Arrange
  353. MockViewUserControl vuc = new MockViewUserControl();
  354. MockViewUserControlContainerPage containerPage = new MockViewUserControlContainerPage(vuc);
  355. bool triggered = false;
  356. HtmlTextWriter writer = new HtmlTextWriter(TextWriter.Null);
  357. containerPage.RenderCallback = delegate()
  358. {
  359. triggered = true;
  360. Assert.Equal(writer, vuc.Writer);
  361. };
  362. // Act & Assert
  363. Assert.Null(vuc.Writer);
  364. containerPage.RenderControl(writer);
  365. Assert.Null(vuc.Writer);
  366. Assert.True(triggered);
  367. }
  368. [Fact]
  369. public void GetWriterFromRegularPageThrows()
  370. {
  371. // Arrange
  372. MockViewUserControl vuc = new MockViewUserControl();
  373. Page containerPage = new Page();
  374. containerPage.Controls.Add(vuc);
  375. // Act
  376. Assert.Throws<InvalidOperationException>(
  377. delegate { HtmlTextWriter writer = vuc.Writer; },
  378. "A ViewUserControl can be used only in pages that derive from ViewPage or ViewPage<TModel>.");
  379. }
  380. [Fact]
  381. public void ViewBagProperty_ReflectsViewData()
  382. {
  383. // Arrange
  384. ViewPage containerPage = new ViewPage();
  385. ViewUserControl userControl = new ViewUserControl();
  386. containerPage.Controls.Add(userControl);
  387. userControl.ViewData["A"] = 1;
  388. // Act & Assert
  389. Assert.NotNull(userControl.ViewBag);
  390. Assert.Equal(1, userControl.ViewBag.A);
  391. }
  392. [Fact]
  393. public void ViewBagProperty_ReflectsNewViewDataInstance()
  394. {
  395. // Arrange
  396. ViewPage containerPage = new ViewPage();
  397. ViewUserControl userControl = new ViewUserControl();
  398. containerPage.Controls.Add(userControl);
  399. userControl.ViewData["A"] = 1;
  400. userControl.ViewData = new ViewDataDictionary() { { "A", "bar" } };
  401. // Act & Assert
  402. Assert.Equal("bar", userControl.ViewBag.A);
  403. }
  404. [Fact]
  405. public void ViewBagProperty_PropagatesChangesToViewData()
  406. {
  407. // Arrange
  408. ViewPage containerPage = new ViewPage();
  409. ViewUserControl userControl = new ViewUserControl();
  410. containerPage.Controls.Add(userControl);
  411. userControl.ViewData["A"] = 1;
  412. // Act
  413. userControl.ViewBag.A = "foo";
  414. userControl.ViewBag.B = 2;
  415. // Assert
  416. Assert.Equal("foo", userControl.ViewData["A"]);
  417. Assert.Equal(2, userControl.ViewData["B"]);
  418. }
  419. private sealed class DummyViewData
  420. {
  421. public int MyInt { get; set; }
  422. public string MyString { get; set; }
  423. }
  424. private sealed class MockViewUserControlContainerPage : ViewPage
  425. {
  426. public Action RenderCallback { get; set; }
  427. public MockViewUserControlContainerPage(ViewUserControl userControl)
  428. {
  429. Controls.Add(userControl);
  430. }
  431. protected override void RenderChildren(HtmlTextWriter writer)
  432. {
  433. if (RenderCallback != null)
  434. {
  435. RenderCallback();
  436. }
  437. base.RenderChildren(writer);
  438. }
  439. }
  440. private sealed class MockViewUserControl : ViewUserControl
  441. {
  442. }
  443. private sealed class MockViewUserControl<TViewData> : ViewUserControl<TViewData>
  444. {
  445. }
  446. private sealed class MyViewData
  447. {
  448. public int IntProp { get; set; }
  449. public string StringProp { get; set; }
  450. }
  451. private sealed class FooModel
  452. {
  453. }
  454. }
  455. }