PageRenderTime 68ms CodeModel.GetById 20ms RepoModel.GetById 2ms app.codeStats 0ms

/test/System.Web.Http.Test/Metadata/ModelMetadataTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 418 lines | 285 code | 73 blank | 60 comment | 0 complexity | c7951481f45d6db8cb949350fa08fb08 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using System.Web.Http.Metadata.Providers;
  4. using Moq;
  5. using Xunit;
  6. using Assert = Microsoft.TestCommon.AssertEx;
  7. namespace System.Web.Http.Metadata
  8. {
  9. public class ModelMetadataTest
  10. {
  11. // Guard clauses
  12. [Fact]
  13. public void NullProviderThrows()
  14. {
  15. // Act & Assert
  16. Assert.ThrowsArgumentNull(
  17. () => new ModelMetadata(null /* provider */, null /* containerType */, null /* model */, typeof(object), null /* propertyName */),
  18. "provider");
  19. }
  20. [Fact]
  21. public void NullTypeThrows()
  22. {
  23. // Arrange
  24. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  25. // Act & Assert
  26. Assert.ThrowsArgumentNull(
  27. () => new ModelMetadata(provider.Object, null /* containerType */, null /* model */, null /* modelType */, null /* propertyName */),
  28. "modelType");
  29. }
  30. // Constructor
  31. [Fact]
  32. public void DefaultValues()
  33. {
  34. // Arrange
  35. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  36. // Act
  37. ModelMetadata metadata = new ModelMetadata(provider.Object, typeof(Exception), () => "model", typeof(string), "propertyName");
  38. // Assert
  39. Assert.Equal(typeof(Exception), metadata.ContainerType);
  40. Assert.True(metadata.ConvertEmptyStringToNull);
  41. Assert.Null(metadata.DataTypeName);
  42. Assert.Null(metadata.Description);
  43. Assert.Null(metadata.DisplayFormatString);
  44. Assert.Null(metadata.DisplayName);
  45. Assert.Null(metadata.EditFormatString);
  46. Assert.False(metadata.HideSurroundingHtml);
  47. Assert.Equal("model", metadata.Model);
  48. Assert.Equal(typeof(string), metadata.ModelType);
  49. Assert.Null(metadata.NullDisplayText);
  50. Assert.Equal(10000, metadata.Order);
  51. Assert.Equal("propertyName", metadata.PropertyName);
  52. Assert.False(metadata.IsReadOnly);
  53. Assert.True(metadata.RequestValidationEnabled);
  54. Assert.Null(metadata.ShortDisplayName);
  55. Assert.True(metadata.ShowForDisplay);
  56. Assert.True(metadata.ShowForEdit);
  57. Assert.Null(metadata.TemplateHint);
  58. Assert.Null(metadata.Watermark);
  59. }
  60. // IsComplexType
  61. struct IsComplexTypeModel
  62. {
  63. }
  64. [Fact]
  65. public void IsComplexTypeTests()
  66. {
  67. // Arrange
  68. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  69. // Act & Assert
  70. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(Object), null).IsComplexType);
  71. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(string), null).IsComplexType);
  72. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(IDisposable), null).IsComplexType);
  73. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(Nullable<int>), null).IsComplexType);
  74. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(int), null).IsComplexType);
  75. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(IsComplexTypeModel), null).IsComplexType);
  76. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(Nullable<IsComplexTypeModel>), null).IsComplexType);
  77. }
  78. // IsNullableValueType
  79. [Fact]
  80. public void IsNullableValueTypeTests()
  81. {
  82. // Arrange
  83. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  84. // Act & Assert
  85. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(string), null).IsNullableValueType);
  86. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(IDisposable), null).IsNullableValueType);
  87. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(Nullable<int>), null).IsNullableValueType);
  88. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(int), null).IsNullableValueType);
  89. }
  90. // IsRequired
  91. [Fact]
  92. public void IsRequiredTests()
  93. {
  94. // Arrange
  95. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  96. // Act & Assert
  97. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(string), null).IsRequired); // Reference type not required
  98. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(IDisposable), null).IsRequired); // Interface not required
  99. Assert.False(new ModelMetadata(provider.Object, null, null, typeof(Nullable<int>), null).IsRequired); // Nullable value type not required
  100. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(int), null).IsRequired); // Value type required
  101. Assert.True(new ModelMetadata(provider.Object, null, null, typeof(DayOfWeek), null).IsRequired); // Enum (implicit value type) is required
  102. }
  103. // Properties
  104. [Fact]
  105. public void PropertiesCallsProvider()
  106. {
  107. // Arrange
  108. Type modelType = typeof(string);
  109. List<ModelMetadata> propertyMetadata = new List<ModelMetadata>();
  110. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  111. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, modelType, null);
  112. provider.Setup(p => p.GetMetadataForProperties(null, modelType))
  113. .Returns(propertyMetadata)
  114. .Verifiable();
  115. // Act
  116. IEnumerable<ModelMetadata> result = metadata.Properties;
  117. // Assert
  118. Assert.Equal(propertyMetadata, result.ToList());
  119. provider.Verify();
  120. }
  121. [Fact]
  122. public void PropertiesAreSortedByOrder()
  123. {
  124. // Arrange
  125. Type modelType = typeof(string);
  126. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  127. List<ModelMetadata> propertyMetadata = new List<ModelMetadata>
  128. {
  129. new ModelMetadata(provider.Object, null, () => 1, typeof(int), null) { Order = 20 },
  130. new ModelMetadata(provider.Object, null, () => 2, typeof(int), null) { Order = 30 },
  131. new ModelMetadata(provider.Object, null, () => 3, typeof(int), null) { Order = 10 },
  132. };
  133. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, modelType, null);
  134. provider.Setup(p => p.GetMetadataForProperties(null, modelType))
  135. .Returns(propertyMetadata)
  136. .Verifiable();
  137. // Act
  138. List<ModelMetadata> result = metadata.Properties.ToList();
  139. // Assert
  140. Assert.Equal(3, result.Count);
  141. Assert.Equal(3, result[0].Model);
  142. Assert.Equal(1, result[1].Model);
  143. Assert.Equal(2, result[2].Model);
  144. }
  145. [Fact]
  146. public void PropertiesListGetsResetWhenModelGetsReset()
  147. { // Dev10 Bug #923263
  148. // Arrange
  149. var provider = new CachedDataAnnotationsModelMetadataProvider();
  150. var metadata = new ModelMetadata(provider, null, () => new Class1(), typeof(Class1), null);
  151. // Act
  152. ModelMetadata[] originalProps = metadata.Properties.ToArray();
  153. metadata.Model = new Class2();
  154. ModelMetadata[] newProps = metadata.Properties.ToArray();
  155. // Assert
  156. ModelMetadata originalProp = Assert.Single(originalProps);
  157. Assert.Equal(typeof(string), originalProp.ModelType);
  158. Assert.Equal("Prop1", originalProp.PropertyName);
  159. ModelMetadata newProp = Assert.Single(newProps);
  160. Assert.Equal(typeof(int), newProp.ModelType);
  161. Assert.Equal("Prop2", newProp.PropertyName);
  162. }
  163. class Class1
  164. {
  165. public string Prop1 { get; set; }
  166. }
  167. class Class2
  168. {
  169. public int Prop2 { get; set; }
  170. }
  171. // SimpleDisplayText
  172. [Fact]
  173. public void SimpleDisplayTextReturnsNullDisplayTextForNullModel()
  174. {
  175. // Arrange
  176. string nullText = "(null)";
  177. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  178. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), null) { NullDisplayText = nullText };
  179. // Act
  180. string result = metadata.SimpleDisplayText;
  181. // Assert
  182. Assert.Equal(nullText, result);
  183. }
  184. private class SimpleDisplayTextModelWithToString
  185. {
  186. public override string ToString()
  187. {
  188. return "Custom ToString Value";
  189. }
  190. }
  191. [Fact]
  192. public void SimpleDisplayTextReturnsToStringValueWhenOverridden()
  193. {
  194. // Arrange
  195. SimpleDisplayTextModelWithToString model = new SimpleDisplayTextModelWithToString();
  196. EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
  197. ModelMetadata metadata = new ModelMetadata(provider, null, () => model, typeof(SimpleDisplayTextModelWithToString), null);
  198. // Act
  199. string result = metadata.SimpleDisplayText;
  200. // Assert
  201. Assert.Equal(model.ToString(), result);
  202. }
  203. private class SimpleDisplayTextModelWithoutToString
  204. {
  205. public string FirstProperty { get; set; }
  206. public int SecondProperty { get; set; }
  207. }
  208. [Fact]
  209. public void SimpleDisplayTextReturnsFirstPropertyValueForNonNullModel()
  210. {
  211. // Arrange
  212. SimpleDisplayTextModelWithoutToString model = new SimpleDisplayTextModelWithoutToString
  213. {
  214. FirstProperty = "First Property Value"
  215. };
  216. EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
  217. ModelMetadata metadata = new ModelMetadata(provider, null, () => model, typeof(SimpleDisplayTextModelWithoutToString), null);
  218. // Act
  219. string result = metadata.SimpleDisplayText;
  220. // Assert
  221. Assert.Equal(model.FirstProperty, result);
  222. }
  223. [Fact]
  224. public void SimpleDisplayTextReturnsFirstPropertyNullDisplayTextForNonNullModelWithNullDisplayColumnPropertyValue()
  225. {
  226. // Arrange
  227. SimpleDisplayTextModelWithoutToString model = new SimpleDisplayTextModelWithoutToString();
  228. EmptyModelMetadataProvider propertyProvider = new EmptyModelMetadataProvider();
  229. ModelMetadata propertyMetadata = propertyProvider.GetMetadataForProperty(() => model.FirstProperty, typeof(SimpleDisplayTextModelWithoutToString), "FirstProperty");
  230. propertyMetadata.NullDisplayText = "Null Display Text";
  231. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  232. provider.Setup(p => p.GetMetadataForProperties(model, typeof(SimpleDisplayTextModelWithoutToString)))
  233. .Returns(new[] { propertyMetadata });
  234. ModelMetadata metadata = new ModelMetadata(provider.Object, null, () => model, typeof(SimpleDisplayTextModelWithoutToString), null);
  235. // Act
  236. string result = metadata.SimpleDisplayText;
  237. // Assert
  238. Assert.Equal(propertyMetadata.NullDisplayText, result);
  239. }
  240. private class SimpleDisplayTextModelWithNoProperties
  241. {
  242. }
  243. [Fact]
  244. public void SimpleDisplayTextReturnsEmptyStringForNonNullModelWithNoVisibleProperties()
  245. {
  246. // Arrange
  247. SimpleDisplayTextModelWithNoProperties model = new SimpleDisplayTextModelWithNoProperties();
  248. EmptyModelMetadataProvider provider = new EmptyModelMetadataProvider();
  249. ModelMetadata metadata = new ModelMetadata(provider, null, () => model, typeof(SimpleDisplayTextModelWithNoProperties), null);
  250. // Act
  251. string result = metadata.SimpleDisplayText;
  252. // Assert
  253. Assert.Equal(String.Empty, result);
  254. }
  255. private class ObjectWithToStringOverride
  256. {
  257. private string _toStringValue;
  258. public ObjectWithToStringOverride(string toStringValue)
  259. {
  260. _toStringValue = toStringValue;
  261. }
  262. public override string ToString()
  263. {
  264. return _toStringValue;
  265. }
  266. }
  267. [Fact]
  268. public void SimpleDisplayTextReturnsToStringOfModelForNonNullModel()
  269. {
  270. // Arrange
  271. string toStringText = "text from ToString()";
  272. ObjectWithToStringOverride model = new ObjectWithToStringOverride(toStringText);
  273. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  274. ModelMetadata metadata = new ModelMetadata(provider.Object, null, () => model, typeof(ObjectWithToStringOverride), null);
  275. // Act
  276. string result = metadata.SimpleDisplayText;
  277. // Assert
  278. Assert.Equal(toStringText, result);
  279. }
  280. [Fact]
  281. public void SimpleDisplayTextReturnsEmptyStringForNonNullModelWithToStringNull()
  282. {
  283. // Arrange
  284. string toStringText = null;
  285. ObjectWithToStringOverride model = new ObjectWithToStringOverride(toStringText);
  286. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  287. ModelMetadata metadata = new ModelMetadata(provider.Object, null, () => model, typeof(ObjectWithToStringOverride), null);
  288. // Act
  289. string result = metadata.SimpleDisplayText;
  290. // Assert
  291. Assert.Equal(String.Empty, result);
  292. }
  293. // GetDisplayName()
  294. [Fact]
  295. public void ReturnsDisplayNameWhenSet()
  296. {
  297. // Arrange
  298. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  299. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), "PropertyName") { DisplayName = "Display Name" };
  300. // Act
  301. string result = metadata.GetDisplayName();
  302. // Assert
  303. Assert.Equal("Display Name", result);
  304. }
  305. [Fact]
  306. public void ReturnsPropertyNameWhenSetAndDisplayNameIsNull()
  307. {
  308. // Arrange
  309. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  310. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), "PropertyName");
  311. // Act
  312. string result = metadata.GetDisplayName();
  313. // Assert
  314. Assert.Equal("PropertyName", result);
  315. }
  316. [Fact]
  317. public void ReturnsTypeNameWhenPropertyNameAndDisplayNameAreNull()
  318. {
  319. // Arrange
  320. Mock<ModelMetadataProvider> provider = new Mock<ModelMetadataProvider>();
  321. ModelMetadata metadata = new ModelMetadata(provider.Object, null, null, typeof(object), null);
  322. // Act
  323. string result = metadata.GetDisplayName();
  324. // Assert
  325. Assert.Equal("Object", result);
  326. }
  327. // Helpers
  328. private class DummyContactModel
  329. {
  330. public int IntField = 0;
  331. public string FirstName { get; set; }
  332. public string LastName { get; set; }
  333. public Nullable<int> NullableIntValue { get; set; }
  334. public int[] Array { get; set; }
  335. public string this[int index]
  336. {
  337. get { return "Indexed into " + index; }
  338. }
  339. }
  340. private class DummyModelContainer
  341. {
  342. public DummyContactModel Model { get; set; }
  343. }
  344. }
  345. }