PageRenderTime 42ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Web.Mvc.Test/Html/Test/DefaultDisplayTemplatesTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 560 lines | 392 code | 103 blank | 65 comment | 4 complexity | 1cea4002f7b45403a9a42ed75b95d547 MD5 | raw file
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Data.Objects.DataClasses;
  4. using System.IO;
  5. using System.Web.UI.WebControls;
  6. using Microsoft.Web.UnitTestUtil;
  7. using Moq;
  8. using Xunit;
  9. using Assert = Microsoft.TestCommon.AssertEx;
  10. namespace System.Web.Mvc.Html.Test
  11. {
  12. public class DefaultDisplayTemplatesTest
  13. {
  14. // BooleanTemplate
  15. [Fact]
  16. public void BooleanTemplateTests()
  17. {
  18. // Boolean values
  19. Assert.Equal(
  20. @"<input checked=""checked"" class=""check-box"" disabled=""disabled"" type=""checkbox"" />",
  21. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<bool>(true)));
  22. Assert.Equal(
  23. @"<input class=""check-box"" disabled=""disabled"" type=""checkbox"" />",
  24. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<bool>(false)));
  25. Assert.Equal(
  26. @"<input class=""check-box"" disabled=""disabled"" type=""checkbox"" />",
  27. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<bool>(null)));
  28. // Nullable<Boolean> values
  29. Assert.Equal(
  30. @"<select class=""tri-state list-box"" disabled=""disabled""><option value="""">Not Set</option><option selected=""selected"" value=""true"">True</option><option value=""false"">False</option></select>",
  31. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<Nullable<bool>>(true)));
  32. Assert.Equal(
  33. @"<select class=""tri-state list-box"" disabled=""disabled""><option value="""">Not Set</option><option value=""true"">True</option><option selected=""selected"" value=""false"">False</option></select>",
  34. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<Nullable<bool>>(false)));
  35. Assert.Equal(
  36. @"<select class=""tri-state list-box"" disabled=""disabled""><option selected=""selected"" value="""">Not Set</option><option value=""true"">True</option><option value=""false"">False</option></select>",
  37. DefaultDisplayTemplates.BooleanTemplate(MakeHtmlHelper<Nullable<bool>>(null)));
  38. }
  39. // CollectionTemplate
  40. private static string CollectionSpyCallback(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string templateName, DataBoundControlMode mode, object additionalViewData)
  41. {
  42. return String.Format(Environment.NewLine + "Model = {0}, ModelType = {1}, PropertyName = {2}, HtmlFieldName = {3}, TemplateName = {4}, Mode = {5}, TemplateInfo.HtmlFieldPrefix = {6}, AdditionalViewData = {7}",
  43. metadata.Model ?? "(null)",
  44. metadata.ModelType == null ? "(null)" : metadata.ModelType.FullName,
  45. metadata.PropertyName ?? "(null)",
  46. htmlFieldName == String.Empty ? "(empty)" : htmlFieldName ?? "(null)",
  47. templateName ?? "(null)",
  48. mode,
  49. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix,
  50. AnonymousObject.Inspect(additionalViewData));
  51. }
  52. [Fact]
  53. public void CollectionTemplateWithNullModel()
  54. {
  55. // Arrange
  56. HtmlHelper html = MakeHtmlHelper<object>(null);
  57. // Act
  58. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  59. // Assert
  60. Assert.Equal(String.Empty, result);
  61. }
  62. [Fact]
  63. public void CollectionTemplateNonEnumerableModelThrows()
  64. {
  65. // Arrange
  66. HtmlHelper html = MakeHtmlHelper<object>(new object());
  67. // Act & Assert
  68. Assert.Throws<InvalidOperationException>(
  69. () => DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback),
  70. "The Collection template was used with an object of type 'System.Object', which does not implement System.IEnumerable."
  71. );
  72. }
  73. [Fact]
  74. public void CollectionTemplateWithSingleItemCollectionWithoutPrefix()
  75. {
  76. // Arrange
  77. HtmlHelper html = MakeHtmlHelper<List<string>>(new List<string> { "foo" });
  78. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  79. // Act
  80. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  81. // Assert
  82. Assert.Equal(@"
  83. Model = foo, ModelType = System.String, PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  84. result);
  85. }
  86. [Fact]
  87. public void CollectionTemplateWithSingleItemCollectionWithPrefix()
  88. {
  89. // Arrange
  90. HtmlHelper html = MakeHtmlHelper<List<string>>(new List<string> { "foo" });
  91. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = "ModelProperty";
  92. // Act
  93. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  94. // Assert
  95. Assert.Equal(@"
  96. Model = foo, ModelType = System.String, PropertyName = (null), HtmlFieldName = ModelProperty[0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  97. result);
  98. }
  99. [Fact]
  100. public void CollectionTemplateWithMultiItemCollection()
  101. {
  102. // Arrange
  103. HtmlHelper html = MakeHtmlHelper<List<string>>(new List<string> { "foo", "bar", "baz" });
  104. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  105. // Act
  106. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  107. // Assert
  108. Assert.Equal(@"
  109. Model = foo, ModelType = System.String, PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  110. Model = bar, ModelType = System.String, PropertyName = (null), HtmlFieldName = [1], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  111. Model = baz, ModelType = System.String, PropertyName = (null), HtmlFieldName = [2], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  112. result);
  113. }
  114. [Fact]
  115. public void CollectionTemplateNullITemInWeaklyTypedCollectionUsesModelTypeOfString()
  116. {
  117. // Arrange
  118. HtmlHelper html = MakeHtmlHelper<ArrayList>(new ArrayList { null });
  119. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  120. // Act
  121. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  122. // Assert
  123. Assert.Equal(@"
  124. Model = (null), ModelType = System.String, PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  125. result);
  126. }
  127. [Fact]
  128. public void CollectionTemplateNullItemInStronglyTypedCollectionUsesModelTypeFromIEnumerable()
  129. {
  130. // Arrange
  131. HtmlHelper html = MakeHtmlHelper<List<IHttpHandler>>(new List<IHttpHandler> { null });
  132. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  133. // Act
  134. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  135. // Assert
  136. Assert.Equal(@"
  137. Model = (null), ModelType = System.Web.IHttpHandler, PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  138. result);
  139. }
  140. [Fact]
  141. public void CollectionTemplateUsesRealObjectTypes()
  142. {
  143. // Arrange
  144. HtmlHelper html = MakeHtmlHelper<List<Object>>(new List<Object> { 1, 2.3, "Hello World" });
  145. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  146. // Act
  147. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  148. // Assert
  149. Assert.Equal(@"
  150. Model = 1, ModelType = System.Int32, PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  151. Model = 2.3, ModelType = System.Double, PropertyName = (null), HtmlFieldName = [1], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  152. Model = Hello World, ModelType = System.String, PropertyName = (null), HtmlFieldName = [2], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  153. result);
  154. }
  155. [Fact]
  156. public void CollectionTemplateNullItemInCollectionOfNullableValueTypesDoesNotDiscardNullable()
  157. {
  158. // Arrange
  159. HtmlHelper html = MakeHtmlHelper<List<int?>>(new List<int?> { 1, null, 2 });
  160. html.ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = null;
  161. // Act
  162. string result = DefaultDisplayTemplates.CollectionTemplate(html, CollectionSpyCallback);
  163. // Assert
  164. Assert.Equal(@"
  165. Model = 1, ModelType = System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], PropertyName = (null), HtmlFieldName = [0], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  166. Model = (null), ModelType = System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], PropertyName = (null), HtmlFieldName = [1], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)
  167. Model = 2, ModelType = System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], PropertyName = (null), HtmlFieldName = [2], TemplateName = (null), Mode = ReadOnly, TemplateInfo.HtmlFieldPrefix = , AdditionalViewData = (null)",
  168. result);
  169. }
  170. // DecimalTemplate
  171. [Fact]
  172. public void DecimalTemplateTests()
  173. {
  174. Assert.Equal(
  175. @"12.35",
  176. DefaultDisplayTemplates.DecimalTemplate(MakeHtmlHelper<decimal>(12.3456M)));
  177. Assert.Equal(
  178. @"Formatted Value",
  179. DefaultDisplayTemplates.DecimalTemplate(MakeHtmlHelper<decimal>(12.3456M, "Formatted Value")));
  180. Assert.Equal(
  181. @"&lt;script&gt;alert(&#39;XSS!&#39;)&lt;/script&gt;",
  182. DefaultDisplayTemplates.DecimalTemplate(MakeHtmlHelper<decimal>(12.3456M, "<script>alert('XSS!')</script>")));
  183. }
  184. // EmailAddressTemplate
  185. [Fact]
  186. public void EmailAddressTemplateTests()
  187. {
  188. Assert.Equal(
  189. @"<a href=""mailto:foo@bar.com"">foo@bar.com</a>",
  190. DefaultDisplayTemplates.EmailAddressTemplate(MakeHtmlHelper<string>("foo@bar.com")));
  191. Assert.Equal(
  192. @"<a href=""mailto:foo@bar.com"">The FooBar User</a>",
  193. DefaultDisplayTemplates.EmailAddressTemplate(MakeHtmlHelper<string>("foo@bar.com", "The FooBar User")));
  194. Assert.Equal(
  195. @"<a href=""mailto:&lt;script>alert(&#39;XSS!&#39;)&lt;/script>"">&lt;script&gt;alert(&#39;XSS!&#39;)&lt;/script&gt;</a>",
  196. DefaultDisplayTemplates.EmailAddressTemplate(MakeHtmlHelper<string>("<script>alert('XSS!')</script>")));
  197. Assert.Equal(
  198. @"<a href=""mailto:&lt;script>alert(&#39;XSS!&#39;)&lt;/script>"">&lt;b&gt;Encode me!&lt;/b&gt;</a>",
  199. DefaultDisplayTemplates.EmailAddressTemplate(MakeHtmlHelper<string>("<script>alert('XSS!')</script>", "<b>Encode me!</b>")));
  200. }
  201. // HiddenInputTemplate
  202. [Fact]
  203. public void HiddenInputTemplateTests()
  204. {
  205. Assert.Equal(
  206. @"Hidden Value",
  207. DefaultDisplayTemplates.HiddenInputTemplate(MakeHtmlHelper<string>("Hidden Value")));
  208. Assert.Equal(
  209. @"&lt;b&gt;Encode me!&lt;/b&gt;",
  210. DefaultDisplayTemplates.HiddenInputTemplate(MakeHtmlHelper<string>("<script>alert('XSS!')</script>", "<b>Encode me!</b>")));
  211. var helperWithInvisibleHtml = MakeHtmlHelper<string>("<script>alert('XSS!')</script>", "<b>Encode me!</b>");
  212. helperWithInvisibleHtml.ViewData.ModelMetadata.HideSurroundingHtml = true;
  213. Assert.Equal(
  214. String.Empty,
  215. DefaultDisplayTemplates.HiddenInputTemplate(helperWithInvisibleHtml));
  216. }
  217. // HtmlTemplate
  218. [Fact]
  219. public void HtmlTemplateTests()
  220. {
  221. Assert.Equal(
  222. @"Hello, world!",
  223. DefaultDisplayTemplates.HtmlTemplate(MakeHtmlHelper<string>("", "Hello, world!")));
  224. Assert.Equal(
  225. @"<b>Hello, world!</b>",
  226. DefaultDisplayTemplates.HtmlTemplate(MakeHtmlHelper<string>("", "<b>Hello, world!</b>")));
  227. }
  228. // ObjectTemplate
  229. private static string SpyCallback(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string templateName, DataBoundControlMode mode, object additionalViewData)
  230. {
  231. return String.Format("Model = {0}, ModelType = {1}, PropertyName = {2}, HtmlFieldName = {3}, TemplateName = {4}, Mode = {5}, AdditionalViewData = {6}",
  232. metadata.Model ?? "(null)",
  233. metadata.ModelType == null ? "(null)" : metadata.ModelType.FullName,
  234. metadata.PropertyName ?? "(null)",
  235. htmlFieldName == String.Empty ? "(empty)" : htmlFieldName ?? "(null)",
  236. templateName ?? "(null)",
  237. mode,
  238. AnonymousObject.Inspect(additionalViewData));
  239. }
  240. class ObjectTemplateModel
  241. {
  242. public ObjectTemplateModel()
  243. {
  244. ComplexInnerModel = new object();
  245. }
  246. public string Property1 { get; set; }
  247. public string Property2 { get; set; }
  248. public object ComplexInnerModel { get; set; }
  249. }
  250. [Fact]
  251. public void ObjectTemplateDisplaysSimplePropertiesOnObjectByDefault()
  252. {
  253. string expected = @"<div class=""display-label"">Property1</div>
  254. <div class=""display-field"">Model = p1, ModelType = System.String, PropertyName = Property1, HtmlFieldName = Property1, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  255. <div class=""display-label"">Property2</div>
  256. <div class=""display-field"">Model = (null), ModelType = System.String, PropertyName = Property2, HtmlFieldName = Property2, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  257. ";
  258. // Arrange
  259. ObjectTemplateModel model = new ObjectTemplateModel { Property1 = "p1", Property2 = null };
  260. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  261. // Act
  262. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  263. // Assert
  264. Assert.Equal(expected, result);
  265. }
  266. [Fact]
  267. public void ObjectTemplateWithDisplayNameMetadata()
  268. {
  269. string expected = @"<div class=""display-field"">Model = (null), ModelType = System.String, PropertyName = Property1, HtmlFieldName = Property1, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  270. <div class=""display-label"">Custom display name</div>
  271. <div class=""display-field"">Model = (null), ModelType = System.String, PropertyName = Property2, HtmlFieldName = Property2, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  272. ";
  273. // Arrange
  274. ObjectTemplateModel model = new ObjectTemplateModel();
  275. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  276. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  277. Func<object> accessor = () => model;
  278. Mock<ModelMetadata> metadata = new Mock<ModelMetadata>(provider.Object, null, accessor, typeof(ObjectTemplateModel), null);
  279. ModelMetadata prop1Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), null, typeof(string), "Property1") { DisplayName = String.Empty };
  280. ModelMetadata prop2Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), null, typeof(string), "Property2") { DisplayName = "Custom display name" };
  281. html.ViewData.ModelMetadata = metadata.Object;
  282. metadata.Setup(p => p.Properties).Returns(() => new[] { prop1Metadata, prop2Metadata });
  283. // Act
  284. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  285. // Assert
  286. Assert.Equal(expected, result);
  287. }
  288. [Fact]
  289. public void ObjectTemplateWithShowForDisplayMetadata()
  290. {
  291. string expected = @"<div class=""display-label"">Property1</div>
  292. <div class=""display-field"">Model = (null), ModelType = System.String, PropertyName = Property1, HtmlFieldName = Property1, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  293. ";
  294. // Arrange
  295. ObjectTemplateModel model = new ObjectTemplateModel();
  296. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  297. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  298. Func<object> accessor = () => model;
  299. Mock<ModelMetadata> metadata = new Mock<ModelMetadata>(provider.Object, null, accessor, typeof(ObjectTemplateModel), null);
  300. ModelMetadata prop1Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), null, typeof(string), "Property1") { ShowForDisplay = true };
  301. ModelMetadata prop2Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), null, typeof(string), "Property2") { ShowForDisplay = false };
  302. html.ViewData.ModelMetadata = metadata.Object;
  303. metadata.Setup(p => p.Properties).Returns(() => new[] { prop1Metadata, prop2Metadata });
  304. // Act
  305. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  306. // Assert
  307. Assert.Equal(expected, result);
  308. }
  309. [Fact]
  310. public void ObjectTemplatePreventsRecursionOnModelValue()
  311. {
  312. string expected = @"<div class=""display-label"">Property2</div>
  313. <div class=""display-field"">Model = propValue2, ModelType = System.String, PropertyName = Property2, HtmlFieldName = Property2, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  314. ";
  315. // Arrange
  316. ObjectTemplateModel model = new ObjectTemplateModel();
  317. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  318. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  319. Func<object> accessor = () => model;
  320. Mock<ModelMetadata> metadata = new Mock<ModelMetadata>(provider.Object, null, accessor, typeof(ObjectTemplateModel), null);
  321. ModelMetadata prop1Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), () => "propValue1", typeof(string), "Property1");
  322. ModelMetadata prop2Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), () => "propValue2", typeof(string), "Property2");
  323. html.ViewData.ModelMetadata = metadata.Object;
  324. metadata.Setup(p => p.Properties).Returns(() => new[] { prop1Metadata, prop2Metadata });
  325. html.ViewData.TemplateInfo.VisitedObjects.Add("propValue1");
  326. // Act
  327. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  328. // Assert
  329. Assert.Equal(expected, result);
  330. }
  331. [Fact]
  332. public void ObjectTemplatePreventsRecursionOnModelTypeForNullModelValues()
  333. {
  334. string expected = @"<div class=""display-label"">Property2</div>
  335. <div class=""display-field"">Model = propValue2, ModelType = System.String, PropertyName = Property2, HtmlFieldName = Property2, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)</div>
  336. ";
  337. // Arrange
  338. ObjectTemplateModel model = new ObjectTemplateModel();
  339. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  340. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  341. Func<object> accessor = () => model;
  342. Mock<ModelMetadata> metadata = new Mock<ModelMetadata>(provider.Object, null, accessor, typeof(ObjectTemplateModel), null);
  343. ModelMetadata prop1Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), null, typeof(string), "Property1");
  344. ModelMetadata prop2Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), () => "propValue2", typeof(string), "Property2");
  345. html.ViewData.ModelMetadata = metadata.Object;
  346. metadata.Setup(p => p.Properties).Returns(() => new[] { prop1Metadata, prop2Metadata });
  347. html.ViewData.TemplateInfo.VisitedObjects.Add(typeof(string));
  348. // Act
  349. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  350. // Assert
  351. Assert.Equal(expected, result);
  352. }
  353. [Fact]
  354. public void ObjectTemplateDisplaysNullDisplayTextWhenObjectIsNull()
  355. {
  356. // Arrange
  357. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(null);
  358. ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(ObjectTemplateModel));
  359. metadata.NullDisplayText = "(null value)";
  360. html.ViewData.ModelMetadata = metadata;
  361. // Act
  362. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  363. // Assert
  364. Assert.Equal(metadata.NullDisplayText, result);
  365. }
  366. [Fact]
  367. public void ObjectTemplateDisplaysSimpleDisplayTextWhenTemplateDepthGreaterThanOne()
  368. {
  369. // Arrange
  370. ObjectTemplateModel model = new ObjectTemplateModel();
  371. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  372. ModelMetadata metadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(ObjectTemplateModel));
  373. metadata.SimpleDisplayText = "Simple Display Text";
  374. html.ViewData.ModelMetadata = metadata;
  375. html.ViewData.TemplateInfo.VisitedObjects.Add("foo");
  376. html.ViewData.TemplateInfo.VisitedObjects.Add("bar");
  377. // Act
  378. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  379. // Assert
  380. Assert.Equal(metadata.SimpleDisplayText, result);
  381. }
  382. [Fact]
  383. public void ObjectTemplateWithHiddenHtml()
  384. {
  385. string expected = @"Model = propValue1, ModelType = System.String, PropertyName = Property1, HtmlFieldName = Property1, TemplateName = (null), Mode = ReadOnly, AdditionalViewData = (null)";
  386. // Arrange
  387. ObjectTemplateModel model = new ObjectTemplateModel();
  388. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(model);
  389. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  390. Func<object> accessor = () => model;
  391. Mock<ModelMetadata> metadata = new Mock<ModelMetadata>(provider.Object, null, accessor, typeof(ObjectTemplateModel), null);
  392. ModelMetadata prop1Metadata = new ModelMetadata(provider.Object, typeof(ObjectTemplateModel), () => "propValue1", typeof(string), "Property1") { HideSurroundingHtml = true };
  393. html.ViewData.ModelMetadata = metadata.Object;
  394. metadata.Setup(p => p.Properties).Returns(() => new[] { prop1Metadata });
  395. // Act
  396. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  397. // Assert
  398. Assert.Equal(expected, result);
  399. }
  400. [Fact]
  401. public void ObjectTemplateAllPropertiesFromEntityObjectAreHidden()
  402. {
  403. // Arrange
  404. HtmlHelper html = MakeHtmlHelper<ObjectTemplateModel>(new MyEntityObject());
  405. // Act
  406. string result = DefaultDisplayTemplates.ObjectTemplate(html, SpyCallback);
  407. // Assert
  408. Assert.Equal(String.Empty, result);
  409. }
  410. private class MyEntityObject : EntityObject
  411. {
  412. }
  413. // StringTemplate
  414. [Fact]
  415. public void StringTemplateTests()
  416. {
  417. Assert.Equal(
  418. @"Hello, world!",
  419. DefaultDisplayTemplates.StringTemplate(MakeHtmlHelper<string>("", "Hello, world!")));
  420. Assert.Equal(
  421. @"&lt;b&gt;Hello, world!&lt;/b&gt;",
  422. DefaultDisplayTemplates.StringTemplate(MakeHtmlHelper<string>("", "<b>Hello, world!</b>")));
  423. }
  424. // UrlTemplate
  425. [Fact]
  426. public void UrlTemplateTests()
  427. {
  428. Assert.Equal(
  429. @"<a href=""http://www.microsoft.com/testing.aspx?value1=foo&amp;value2=bar"">http://www.microsoft.com/testing.aspx?value1=foo&amp;value2=bar</a>",
  430. DefaultDisplayTemplates.UrlTemplate(MakeHtmlHelper<string>("http://www.microsoft.com/testing.aspx?value1=foo&value2=bar")));
  431. Assert.Equal(
  432. @"<a href=""http://www.microsoft.com/testing.aspx?value1=foo&amp;value2=bar"">&lt;b&gt;Microsoft!&lt;/b&gt;</a>",
  433. DefaultDisplayTemplates.UrlTemplate(MakeHtmlHelper<string>("http://www.microsoft.com/testing.aspx?value1=foo&value2=bar", "<b>Microsoft!</b>")));
  434. }
  435. // Helpers
  436. private HtmlHelper MakeHtmlHelper<TModel>(object model)
  437. {
  438. return MakeHtmlHelper<TModel>(model, model);
  439. }
  440. private HtmlHelper MakeHtmlHelper<TModel>(object model, object formattedModelValue)
  441. {
  442. ViewDataDictionary viewData = new ViewDataDictionary(model);
  443. viewData.TemplateInfo.HtmlFieldPrefix = "FieldPrefix";
  444. viewData.TemplateInfo.FormattedModelValue = formattedModelValue;
  445. viewData.ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => model, typeof(TModel));
  446. ViewContext viewContext = new ViewContext(new ControllerContext(), new DummyView(), viewData, new TempDataDictionary(), new StringWriter());
  447. return new HtmlHelper(viewContext, new SimpleViewDataContainer(viewData));
  448. }
  449. private class DummyView : IView
  450. {
  451. public void Render(ViewContext viewContext, TextWriter writer)
  452. {
  453. throw new NotImplementedException();
  454. }
  455. }
  456. }
  457. }