PageRenderTime 55ms CodeModel.GetById 3ms RepoModel.GetById 1ms app.codeStats 0ms

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

https://bitbucket.org/mdavid/aspnetwebstack
C# | 516 lines | 324 code | 103 blank | 89 comment | 0 complexity | 86c03f35b8f71c8f74e4e92e48acbf63 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq.Expressions;
  3. using Moq;
  4. using Xunit;
  5. using Assert = Microsoft.TestCommon.AssertEx;
  6. namespace System.Web.Mvc.Html.Test
  7. {
  8. public class LabelExtensionsTest
  9. {
  10. Mock<ModelMetadataProvider> metadataProvider;
  11. Mock<ModelMetadata> metadata;
  12. ViewDataDictionary viewData;
  13. Mock<ViewContext> viewContext;
  14. Mock<IViewDataContainer> viewDataContainer;
  15. HtmlHelper<object> html;
  16. public LabelExtensionsTest()
  17. {
  18. metadataProvider = new Mock<ModelMetadataProvider>();
  19. metadata = new Mock<ModelMetadata>(metadataProvider.Object, null, null, typeof(object), null);
  20. viewData = new ViewDataDictionary();
  21. viewContext = new Mock<ViewContext>();
  22. viewContext.Setup(c => c.ViewData).Returns(viewData);
  23. viewDataContainer = new Mock<IViewDataContainer>();
  24. viewDataContainer.Setup(c => c.ViewData).Returns(viewData);
  25. html = new HtmlHelper<object>(viewContext.Object, viewDataContainer.Object);
  26. metadataProvider.Setup(p => p.GetMetadataForProperties(It.IsAny<object>(), It.IsAny<Type>()))
  27. .Returns(new ModelMetadata[0]);
  28. metadataProvider.Setup(p => p.GetMetadataForProperty(It.IsAny<Func<object>>(), It.IsAny<Type>(), It.IsAny<string>()))
  29. .Returns(metadata.Object);
  30. metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
  31. .Returns(metadata.Object);
  32. }
  33. // Label tests
  34. [Fact]
  35. public void LabelNullExpressionThrows()
  36. {
  37. // Act & Assert
  38. Assert.ThrowsArgumentNull(
  39. () => html.Label(null),
  40. "expression");
  41. }
  42. [Fact]
  43. public void LabelViewDataNotFound()
  44. {
  45. // Act
  46. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  47. // Assert
  48. Assert.Equal(@"<label for=""PropertyName"">PropertyName</label>", result.ToHtmlString());
  49. }
  50. [Fact]
  51. public void LabelViewDataNull()
  52. {
  53. // Act
  54. viewData["PropertyName"] = null;
  55. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  56. // Assert
  57. Assert.Equal(@"<label for=""PropertyName"">PropertyName</label>", result.ToHtmlString());
  58. }
  59. class Model
  60. {
  61. public string PropertyName { get; set; }
  62. }
  63. [Fact]
  64. public void LabelViewDataFromPropertyGetsActualPropertyType()
  65. {
  66. // Arrange
  67. Model model = new Model { PropertyName = "propertyValue" };
  68. HtmlHelper<Model> html = new HtmlHelper<Model>(viewContext.Object, viewDataContainer.Object);
  69. viewData.Model = model;
  70. metadataProvider.Setup(p => p.GetMetadataForProperty(It.IsAny<Func<object>>(), typeof(Model), "PropertyName"))
  71. .Returns(metadata.Object)
  72. .Verifiable();
  73. // Act
  74. html.Label("PropertyName", null, null, metadataProvider.Object);
  75. // Assert
  76. metadataProvider.Verify();
  77. }
  78. [Fact]
  79. public void LabelUsesTemplateInfoPrefix()
  80. {
  81. // Arrange
  82. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  83. // Act
  84. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  85. // Assert
  86. Assert.Equal(@"<label for=""Prefix_PropertyName"">PropertyName</label>", result.ToHtmlString());
  87. }
  88. [Fact]
  89. public void LabelUsesLabelTextBeforeMetadata()
  90. {
  91. // Arrange
  92. metadata = new Mock<ModelMetadata>(metadataProvider.Object, null, null, typeof(object), "Custom property name from metadata");
  93. metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
  94. .Returns(metadata.Object);
  95. //Act
  96. MvcHtmlString result = html.Label("PropertyName", "Label Text", null, metadataProvider.Object);
  97. // Assert
  98. Assert.Equal(@"<label for=""PropertyName"">Label Text</label>", result.ToHtmlString());
  99. }
  100. [Fact]
  101. public void LabelUsesMetadataForDisplayTextWhenLabelTextIsNull()
  102. {
  103. // Arrange
  104. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  105. // Act
  106. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  107. // Assert
  108. Assert.Equal(@"<label for=""PropertyName"">Custom display name from metadata</label>", result.ToHtmlString());
  109. }
  110. [Fact]
  111. public void LabelUsesMetadataForPropertyNameWhenDisplayNameIsNull()
  112. {
  113. // Arrange
  114. metadata = new Mock<ModelMetadata>(metadataProvider.Object, null, null, typeof(object), "Custom property name from metadata");
  115. metadataProvider.Setup(p => p.GetMetadataForType(It.IsAny<Func<object>>(), It.IsAny<Type>()))
  116. .Returns(metadata.Object);
  117. // Act
  118. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  119. // Assert
  120. Assert.Equal(@"<label for=""PropertyName"">Custom property name from metadata</label>", result.ToHtmlString());
  121. }
  122. [Fact]
  123. public void LabelEmptyDisplayNameReturnsEmptyLabelText()
  124. {
  125. // Arrange
  126. metadata.Setup(m => m.DisplayName).Returns(String.Empty);
  127. // Act
  128. MvcHtmlString result = html.Label("PropertyName", null, null, metadataProvider.Object);
  129. // Assert
  130. Assert.Equal(String.Empty, result.ToHtmlString());
  131. }
  132. [Fact]
  133. public void LabelWithAnonymousValues()
  134. {
  135. // Act
  136. MvcHtmlString result = html.Label("PropertyName", null, new { @for = "attrFor" }, metadataProvider.Object);
  137. // Assert
  138. Assert.Equal(@"<label for=""attrFor"">PropertyName</label>", result.ToHtmlString());
  139. }
  140. [Fact]
  141. public void LabelWithAnonymousValuesAndLabelText()
  142. {
  143. // Act
  144. MvcHtmlString result = html.Label("PropertyName", "Label Text", new { @for = "attrFor" }, metadataProvider.Object);
  145. // Assert
  146. Assert.Equal(@"<label for=""attrFor"">Label Text</label>", result.ToHtmlString());
  147. }
  148. [Fact]
  149. public void LabelWithTypedAttributes()
  150. {
  151. // Arrange
  152. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  153. {
  154. { "foo", "bar" },
  155. { "quux", "baz" }
  156. };
  157. // Act
  158. MvcHtmlString result = html.Label("PropertyName", null, htmlAttributes, metadataProvider.Object);
  159. // Assert
  160. Assert.Equal(@"<label foo=""bar"" for=""PropertyName"" quux=""baz"">PropertyName</label>", result.ToHtmlString());
  161. }
  162. [Fact]
  163. public void LabelWithTypedAttributesAndLabelText()
  164. {
  165. // Arrange
  166. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  167. {
  168. { "foo", "bar" },
  169. { "quux", "baz" }
  170. };
  171. // Act
  172. MvcHtmlString result = html.Label("PropertyName", "Label Text", htmlAttributes, metadataProvider.Object);
  173. // Assert
  174. Assert.Equal(@"<label foo=""bar"" for=""PropertyName"" quux=""baz"">Label Text</label>", result.ToHtmlString());
  175. }
  176. // LabelFor tests
  177. [Fact]
  178. public void LabelForNullExpressionThrows()
  179. {
  180. // Act & Assert
  181. Assert.ThrowsArgumentNull(
  182. () => html.LabelFor((Expression<Func<Object, Object>>)null),
  183. "expression");
  184. }
  185. [Fact]
  186. public void LabelForNonMemberExpressionThrows()
  187. {
  188. // Act & Assert
  189. Assert.Throws<InvalidOperationException>(
  190. () => html.LabelFor(model => new { foo = "Bar" }, null, metadataProvider.Object),
  191. "Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.");
  192. }
  193. [Fact]
  194. public void LabelForViewDataNotFound()
  195. {
  196. // Arrange
  197. string unknownKey = "this is a dummy parameter value";
  198. // Act
  199. MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object);
  200. // Assert
  201. Assert.Equal(@"<label for=""unknownKey"">unknownKey</label>", result.ToHtmlString());
  202. }
  203. [Fact]
  204. public void LabelForUsesTemplateInfoPrefix()
  205. {
  206. // Arrange
  207. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  208. string unknownKey = "this is a dummy parameter value";
  209. // Act
  210. MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object);
  211. // Assert
  212. Assert.Equal(@"<label for=""Prefix_unknownKey"">unknownKey</label>", result.ToHtmlString());
  213. }
  214. [Fact]
  215. public void LabelForUsesLabelTextBeforeModelMetadata()
  216. {
  217. // Arrange
  218. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  219. string unknownKey = "this is a dummy parameter value";
  220. //Act
  221. MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", null, metadataProvider.Object);
  222. // Assert
  223. Assert.Equal(@"<label for=""unknownKey"">Label Text</label>", result.ToHtmlString());
  224. }
  225. [Fact]
  226. public void LabelForUsesModelMetadata()
  227. {
  228. // Arrange
  229. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  230. string unknownKey = "this is a dummy parameter value";
  231. // Act
  232. MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object);
  233. // Assert
  234. Assert.Equal(@"<label for=""unknownKey"">Custom display name from metadata</label>", result.ToHtmlString());
  235. }
  236. [Fact]
  237. public void LabelForEmptyDisplayNameReturnsEmptyLabelText()
  238. {
  239. // Arrange
  240. metadata.Setup(m => m.DisplayName).Returns(String.Empty);
  241. string unknownKey = "this is a dummy parameter value";
  242. // Act
  243. MvcHtmlString result = html.LabelFor(model => unknownKey, null, null, metadataProvider.Object);
  244. // Assert
  245. Assert.Equal(String.Empty, result.ToHtmlString());
  246. }
  247. [Fact]
  248. public void LabelForWithAnonymousValues()
  249. {
  250. //Arrange
  251. string unknownKey = "this is a dummy parameter value";
  252. // Act
  253. MvcHtmlString result = html.LabelFor(model => unknownKey, null, new { @for = "attrFor" }, metadataProvider.Object);
  254. // Assert
  255. Assert.Equal(@"<label for=""attrFor"">unknownKey</label>", result.ToHtmlString());
  256. }
  257. [Fact]
  258. public void LabelForWithAnonymousValuesAndLabelText()
  259. {
  260. //Arrange
  261. string unknownKey = "this is a dummy parameter value";
  262. // Act
  263. MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", new { @for = "attrFor" }, metadataProvider.Object);
  264. // Assert
  265. Assert.Equal(@"<label for=""attrFor"">Label Text</label>", result.ToHtmlString());
  266. }
  267. [Fact]
  268. public void LabelForWithTypedAttributes()
  269. {
  270. //Arrange
  271. string unknownKey = "this is a dummy parameter value";
  272. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  273. {
  274. { "foo", "bar" },
  275. { "quux", "baz" }
  276. };
  277. // Act
  278. MvcHtmlString result = html.LabelFor(model => unknownKey, null, htmlAttributes, metadataProvider.Object);
  279. // Assert
  280. Assert.Equal(@"<label foo=""bar"" for=""unknownKey"" quux=""baz"">unknownKey</label>", result.ToHtmlString());
  281. }
  282. [Fact]
  283. public void LabelForWithTypedAttributesAndLabelText()
  284. {
  285. //Arrange
  286. string unknownKey = "this is a dummy parameter value";
  287. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  288. {
  289. { "foo", "bar" },
  290. { "quux", "baz" }
  291. };
  292. // Act
  293. MvcHtmlString result = html.LabelFor(model => unknownKey, "Label Text", htmlAttributes, metadataProvider.Object);
  294. // Assert
  295. Assert.Equal(@"<label foo=""bar"" for=""unknownKey"" quux=""baz"">Label Text</label>", result.ToHtmlString());
  296. }
  297. [Fact]
  298. public void LabelForWithNestedClass()
  299. { // Dev10 Bug #936323
  300. // Arrange
  301. HtmlHelper<NestedProduct> html = new HtmlHelper<NestedProduct>(viewContext.Object, viewDataContainer.Object);
  302. // Act
  303. MvcHtmlString result = html.LabelFor(nested => nested.product.Id, null, null, metadataProvider.Object);
  304. //Assert
  305. Assert.Equal(@"<label for=""product_Id"">Id</label>", result.ToHtmlString());
  306. }
  307. [Fact]
  308. public void LabelForWithArrayExpression()
  309. { // Dev10 Bug #905780
  310. // Arrange
  311. HtmlHelper<Cart> html = new HtmlHelper<Cart>(viewContext.Object, viewDataContainer.Object);
  312. // Act
  313. MvcHtmlString result = html.LabelFor(cart => cart.Products[0].Id, null, null, metadataProvider.Object);
  314. // Assert
  315. Assert.Equal(@"<label for=""Products_0__Id"">Id</label>", result.ToHtmlString());
  316. }
  317. private class Product
  318. {
  319. public int Id { get; set; }
  320. }
  321. private class Cart
  322. {
  323. public Product[] Products { get; set; }
  324. }
  325. private class NestedProduct
  326. {
  327. public Product product = new Product();
  328. }
  329. // LabelForModel tests
  330. [Fact]
  331. public void LabelForModelUsesLabelTextBeforeModelMetadata()
  332. {
  333. // Arrange
  334. viewData.ModelMetadata = metadata.Object;
  335. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  336. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  337. // Act
  338. MvcHtmlString result = html.LabelForModel("Label Text");
  339. // Assert
  340. Assert.Equal(@"<label for=""Prefix"">Label Text</label>", result.ToHtmlString());
  341. }
  342. [Fact]
  343. public void LabelForModelUsesModelMetadata()
  344. {
  345. // Arrange
  346. viewData.ModelMetadata = metadata.Object;
  347. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  348. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  349. // Act
  350. MvcHtmlString result = html.LabelForModel();
  351. // Assert
  352. Assert.Equal(@"<label for=""Prefix"">Custom display name from metadata</label>", result.ToHtmlString());
  353. }
  354. [Fact]
  355. public void LabelForModelWithAnonymousValues()
  356. {
  357. //Arrange
  358. viewData.ModelMetadata = metadata.Object;
  359. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  360. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  361. // Act
  362. MvcHtmlString result = html.LabelForModel(new { @for = "attrFor" });
  363. // Assert
  364. Assert.Equal(@"<label for=""attrFor"">Custom display name from metadata</label>", result.ToHtmlString());
  365. }
  366. [Fact]
  367. public void LabelForModelWithAnonymousValuesAndLabelText()
  368. {
  369. //Arrange
  370. viewData.ModelMetadata = metadata.Object;
  371. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  372. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  373. // Act
  374. MvcHtmlString result = html.LabelForModel("Label Text", new { @for = "attrFor" });
  375. // Assert
  376. Assert.Equal(@"<label for=""attrFor"">Label Text</label>", result.ToHtmlString());
  377. }
  378. [Fact]
  379. public void LabelForModelWithTypedAttributes()
  380. {
  381. //Arrange
  382. viewData.ModelMetadata = metadata.Object;
  383. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  384. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  385. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  386. {
  387. { "foo", "bar" },
  388. { "quux", "baz" }
  389. };
  390. // Act
  391. MvcHtmlString result = html.LabelForModel(htmlAttributes);
  392. // Assert
  393. Assert.Equal(@"<label foo=""bar"" for=""Prefix"" quux=""baz"">Custom display name from metadata</label>", result.ToHtmlString());
  394. }
  395. [Fact]
  396. public void LabelForModelWithTypedAttributesAndLabelText()
  397. {
  398. //Arrange
  399. viewData.ModelMetadata = metadata.Object;
  400. viewData.TemplateInfo.HtmlFieldPrefix = "Prefix";
  401. metadata.Setup(m => m.DisplayName).Returns("Custom display name from metadata");
  402. Dictionary<string, object> htmlAttributes = new Dictionary<string, object>
  403. {
  404. { "foo", "bar" },
  405. { "quux", "baz" }
  406. };
  407. // Act
  408. MvcHtmlString result = html.LabelForModel("Label Text", htmlAttributes);
  409. // Assert
  410. Assert.Equal(@"<label foo=""bar"" for=""Prefix"" quux=""baz"">Label Text</label>", result.ToHtmlString());
  411. }
  412. }
  413. }