PageRenderTime 45ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/1.31/src/Tests/ExtensionModel/MetadataApiTests.cs

#
C# | 238 lines | 179 code | 35 blank | 24 comment | 5 complexity | 42547ebd3d4bfcf8652c9abbdfcd5e08 MD5 | raw file
Possible License(s): AGPL-1.0, LGPL-2.1
  1. /****************************************************************************************************
  2. Copyright (C) 2010 RapidWebDev Organization (http://rapidwebdev.org)
  3. Author: Eunge, Legal Name: Jian Liu, Email: eunge.liu@RapidWebDev.org
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. ****************************************************************************************************/
  15. using System;
  16. using System.IO;
  17. using System.Configuration;
  18. using System.Drawing;
  19. using System.Data;
  20. using System.Data.SqlClient;
  21. using System.Collections.Generic;
  22. using System.Collections.ObjectModel;
  23. using System.Linq;
  24. using System.Text;
  25. using NUnit.Framework;
  26. using BaoJianSoft.Common;
  27. using BaoJianSoft.Common.Data;
  28. using BaoJianSoft.ExtensionModel;
  29. using BaoJianSoft.ExtensionModel.Linq;
  30. using BaoJianSoft.Platform;
  31. using BaoJianSoft.Platform.Linq;
  32. namespace BaoJianSoft.Tests.ExtensionModel
  33. {
  34. /// <summary>
  35. /// MetadataAPI的测试
  36. /// </summary>
  37. [TestFixture]
  38. public class MetadataApiTests
  39. {
  40. private Collection<Guid> addedGlobalObjectMetadataTypeIds = new Collection<Guid>();
  41. [TearDown]
  42. public void TearDown()
  43. {
  44. using (ExtensionModelDataContext ctx = DataContextFactory.Create<ExtensionModelDataContext>())
  45. {
  46. IAuthenticationContext authenticationContext = SpringContext.Current.GetObject<IAuthenticationContext>();
  47. List<ObjectMetadata> objectMetadataToDelete = ctx.ObjectMetadatas.Where(o => o.ApplicationId == authenticationContext.ApplicationId || addedGlobalObjectMetadataTypeIds.ToArray().Contains(o.ObjectMetadataId)).ToList();
  48. List<FieldMetadata> fieldMetadataToDelete = ctx.FieldMetadatas.Where(f => objectMetadataToDelete.Select(o => o.ObjectMetadataId).ToArray().Contains(f.ObjectMetadataId)).ToList();
  49. ctx.FieldMetadatas.DeleteAllOnSubmit(fieldMetadataToDelete);
  50. ctx.ObjectMetadatas.DeleteAllOnSubmit(objectMetadataToDelete);
  51. ctx.SubmitChanges();
  52. }
  53. }
  54. [Test(Description = "测试扩展类型的CRUD")]
  55. public void CRUDObjectMetadataTypeTest()
  56. {
  57. IMetadataApi metadataApi = SpringContext.Current.GetObject<IMetadataApi>();
  58. Guid baseTypeId = metadataApi.AddType("BaseType", "Organization", "BaseType.Desc", ObjectMetadataTypes.Custom, true, null);
  59. addedGlobalObjectMetadataTypeIds.Add(baseTypeId);
  60. Guid localTypeId = metadataApi.AddType("LocalType", "Organization", "LocalType.Desc", ObjectMetadataTypes.Custom, false, baseTypeId);
  61. IObjectMetadata objectMetadata = metadataApi.GetType(baseTypeId);
  62. Assert.AreEqual("BaseType", objectMetadata.Name);
  63. Assert.AreEqual("Organization", objectMetadata.Category);
  64. Assert.AreEqual("BaseType.Desc", objectMetadata.Description);
  65. Assert.IsFalse(objectMetadata.ParentObjectMetadataId.HasValue);
  66. objectMetadata = metadataApi.GetType(localTypeId);
  67. Assert.AreEqual("LocalType", objectMetadata.Name);
  68. Assert.AreEqual("Organization", objectMetadata.Category);
  69. Assert.AreEqual("LocalType.Desc", objectMetadata.Description);
  70. Assert.AreEqual(baseTypeId, objectMetadata.ParentObjectMetadataId.Value);
  71. metadataApi.UpdateType(baseTypeId, "BaseType", "Common", "Common Extension Type", null);
  72. objectMetadata = metadataApi.GetType(baseTypeId);
  73. Assert.AreEqual("BaseType", objectMetadata.Name);
  74. Assert.AreEqual("Common", objectMetadata.Category);
  75. Assert.AreEqual("Common Extension Type", objectMetadata.Description);
  76. metadataApi.UpdateType(localTypeId, "User", "Membership", "User Extension Type", baseTypeId);
  77. objectMetadata = metadataApi.GetType(localTypeId);
  78. Assert.AreEqual("User", objectMetadata.Name);
  79. Assert.AreEqual("Membership", objectMetadata.Category);
  80. Assert.AreEqual("User Extension Type", objectMetadata.Description);
  81. metadataApi.DeleteType(localTypeId);
  82. metadataApi.DeleteType(baseTypeId);
  83. Assert.IsNull(metadataApi.GetType(baseTypeId));
  84. Assert.IsNull(metadataApi.GetType(localTypeId));
  85. }
  86. [Test(Description = "测试各个类型的扩展属性的CRUD,该扩展类型没有继承于其它的类型")]
  87. public void AllFieldMetadataOfIndividualObjectMetadataTest()
  88. {
  89. IMetadataApi metadataApi = SpringContext.Current.GetObject<IMetadataApi>();
  90. Guid userTypeId = metadataApi.AddType("User", "Membership", "User Extension Description", ObjectMetadataTypes.Custom, false, null);
  91. metadataApi.SaveField(userTypeId, new StringFieldMetadata() { Name = "Name", IsRequired = true, MaxLengthSpecified = true, MaxLength = 32, Ordinal = 1 });
  92. metadataApi.SaveField(userTypeId, new DateTimeFieldMetadata() { Name = "Birthday", DefaultValue = new DateTimeValue { DateTimeValueType = DateTimeValueTypes.Now }, Ordinal = 2 });
  93. metadataApi.SaveField(userTypeId, new IntegerFieldMetadata() { Name = "Level", IsRequired = true, DefaultSpecified = true, Default = 10, Ordinal = 3 });
  94. metadataApi.SaveField(userTypeId, new DecimalFieldMetadata() { Name = "Salary", IsRequired = true, MinValueSpecified = true, MinValue = 800m, DefaultSpecified = true, Default = 2500m, Ordinal = 4 });
  95. HierarchyNode hierarchyNodeQA = new HierarchyNode { Name = "QA", Value = "QA" };
  96. HierarchyNode hierarchyNodeDev = new HierarchyNode { Name = "Dev", Value = "Dev" };
  97. HierarchyNode hierarchyNodeLeader = new HierarchyNode { Name = "Leader", Value = "Leader", Node = new HierarchyNode[] { hierarchyNodeQA, hierarchyNodeDev } };
  98. HierarchyNode hierarchyNodeManager = new HierarchyNode { Name = "Manager", Value = "Manager", Node = new HierarchyNode[] { hierarchyNodeLeader } };
  99. HierarchyNode hierarchyNodeDirector = new HierarchyNode { Name = "Director", Value = "Director", Node = new HierarchyNode[] { hierarchyNodeManager } };
  100. HierarchyFieldMetadata hierarchyFieldMetadata = new HierarchyFieldMetadata { Name = "Position", Description = "Position in hierarchy", IsRequired = true, Ordinal = 5, SelectionMode = SelectionModes.Single, Node = new HierarchyNode[] { hierarchyNodeDirector } };
  101. metadataApi.SaveField(userTypeId, hierarchyFieldMetadata);
  102. SelectionItem selectionItemShangHai = new SelectionItem { Name = "ShangHai", Value = "ShangHai" };
  103. SelectionItem selectionItemJiangSu = new SelectionItem { Name = "JiangSu", Value = "JiangSu" };
  104. SelectionItem selectionItemSiChuan = new SelectionItem { Name = "SiChuan", Value = "SiChuan" };
  105. SelectionItem selectionItemBlank = new SelectionItem { Name = "", Value = "" };
  106. EnumerationFieldMetadata enumerationFieldMetadata = new EnumerationFieldMetadata { Name = "HuKou", Ordinal = 6, SelectionMode = SelectionModes.Single, Items = new SelectionItem[] { selectionItemBlank, selectionItemJiangSu, selectionItemShangHai, selectionItemSiChuan } };
  107. metadataApi.SaveField(userTypeId, enumerationFieldMetadata);
  108. // 测试获取各个属性
  109. AssertFieldMetadata(metadataApi, userTypeId);
  110. // 测试删除一个属性
  111. metadataApi.DeleteField(userTypeId, "HuKou");
  112. Assert.AreEqual(5, metadataApi.GetFields(userTypeId).Count());
  113. // 测试更新一个属性的默认值
  114. IntegerFieldMetadata fieldMetadataLevel = metadataApi.GetField(userTypeId, "Level") as IntegerFieldMetadata;
  115. fieldMetadataLevel.Default = 9;
  116. metadataApi.SaveField(userTypeId, fieldMetadataLevel);
  117. fieldMetadataLevel = metadataApi.GetField(userTypeId, "Level") as IntegerFieldMetadata;
  118. Assert.AreEqual(9, fieldMetadataLevel.Default);
  119. // 删除扩展类型,会自动删除其所有的属性定义
  120. metadataApi.DeleteType(userTypeId);
  121. Assert.AreEqual(0, metadataApi.GetFields(userTypeId).Count());
  122. }
  123. [Test(Description = "测试扩展类型的继承关系,以及关系变化对各扩展类型的影响")]
  124. public void ObjectInheritenaceTest()
  125. {
  126. IMetadataApi metadataApi = SpringContext.Current.GetObject<IMetadataApi>();
  127. Guid commonTypeId = metadataApi.AddType("MembershipBase", "Membership", "Membership Base Extension Description", ObjectMetadataTypes.Custom, true, null);
  128. addedGlobalObjectMetadataTypeIds.Add(commonTypeId);
  129. metadataApi.SaveField(commonTypeId, new StringFieldMetadata() { Name = "Name", IsRequired = true, MaxLengthSpecified = true, MaxLength = 32, Ordinal = 1 });
  130. metadataApi.SaveField(commonTypeId, new StringFieldMetadata() { Name = "Description", MaxLengthSpecified = true, MaxLength = 256, Ordinal = 2 });
  131. Guid userTypeId = metadataApi.AddType("Users", "Membership", "User Extension Type Description", ObjectMetadataTypes.Custom, false, commonTypeId);
  132. IEnumerable<IFieldMetadata> userFields = metadataApi.GetFields(userTypeId);
  133. Assert.AreEqual(2, userFields.Count());
  134. Assert.IsNotNull(userFields.FirstOrDefault(f => f.Name == "Name"));
  135. Assert.IsNotNull(userFields.FirstOrDefault(f => f.Name == "Description"));
  136. metadataApi.SaveField(userTypeId, new StringFieldMetadata() { Name = "Name", IsRequired = true, MaxLengthSpecified = true, MaxLength = 256, Ordinal = 1 });
  137. metadataApi.SaveField(userTypeId, new IntegerFieldMetadata() { Name = "Age", Ordinal = 2 });
  138. userFields = metadataApi.GetFields(userTypeId);
  139. Assert.AreEqual(3, userFields.Count());
  140. StringFieldMetadata nameField = userFields.FirstOrDefault(f => f.Name == "Name") as StringFieldMetadata;
  141. Assert.IsTrue(nameField.MaxLengthSpecified);
  142. Assert.AreEqual(256, nameField.MaxLength);
  143. metadataApi.SaveField(commonTypeId, new StringFieldMetadata() { Name = "EmployeeNo", MaxLengthSpecified = true, MaxLength = 8, Ordinal = 3 });
  144. userFields = metadataApi.GetFields(userTypeId);
  145. Assert.AreEqual(4, userFields.Count());
  146. metadataApi.DeleteField(commonTypeId, "Description");
  147. userFields = metadataApi.GetFields(userTypeId);
  148. Assert.AreEqual(3, userFields.Count());
  149. }
  150. [Test(Description = "被子类型继承的类型不能被删除")]
  151. [ExpectedException(typeof(InvalidOperationException))]
  152. public void ParentTypeCannotBeDeletedTest()
  153. {
  154. IMetadataApi metadataApi = SpringContext.Current.GetObject<IMetadataApi>();
  155. Guid commonTypeId = metadataApi.AddType("MembershipBase", "Membership", "Membership Base Extension Description", ObjectMetadataTypes.Custom, true, null);
  156. addedGlobalObjectMetadataTypeIds.Add(commonTypeId);
  157. metadataApi.SaveField(commonTypeId, new StringFieldMetadata() { Name = "Name", IsRequired = true, MaxLengthSpecified = true, MaxLength = 32, Ordinal = 1 });
  158. Guid userTypeId = metadataApi.AddType("Users", "Membership", "User Extension Type Description", ObjectMetadataTypes.Custom, false, commonTypeId);
  159. metadataApi.DeleteType(commonTypeId);
  160. }
  161. private static void AssertFieldMetadata(IMetadataApi metadataApi, Guid objectMetadataId)
  162. {
  163. IFieldMetadata fieldMetadata = metadataApi.GetField(objectMetadataId, "Name");
  164. Assert.AreEqual("Name", fieldMetadata.Name);
  165. Assert.AreEqual(FieldType.String, fieldMetadata.Type);
  166. Assert.AreEqual(1, fieldMetadata.Ordinal);
  167. Assert.IsTrue(fieldMetadata.IsRequired);
  168. fieldMetadata = metadataApi.GetField(objectMetadataId, "Birthday");
  169. Assert.AreEqual("Birthday", fieldMetadata.Name);
  170. Assert.AreEqual(FieldType.DateTime, fieldMetadata.Type);
  171. Assert.AreEqual(2, fieldMetadata.Ordinal);
  172. Assert.IsFalse(fieldMetadata.IsRequired);
  173. fieldMetadata = metadataApi.GetField(objectMetadataId, "Level");
  174. Assert.AreEqual("Level", fieldMetadata.Name);
  175. Assert.AreEqual(FieldType.Integer, fieldMetadata.Type);
  176. Assert.AreEqual(3, fieldMetadata.Ordinal);
  177. Assert.IsTrue(fieldMetadata.IsRequired);
  178. fieldMetadata = metadataApi.GetField(objectMetadataId, "Salary");
  179. Assert.AreEqual("Salary", fieldMetadata.Name);
  180. Assert.AreEqual(FieldType.Decimal, fieldMetadata.Type);
  181. Assert.AreEqual(4, fieldMetadata.Ordinal);
  182. Assert.IsTrue(fieldMetadata.IsRequired);
  183. fieldMetadata = metadataApi.GetField(objectMetadataId, "Position");
  184. Assert.AreEqual("Position", fieldMetadata.Name);
  185. Assert.AreEqual(FieldType.Hierarchy, fieldMetadata.Type);
  186. Assert.AreEqual(5, fieldMetadata.Ordinal);
  187. Assert.IsTrue(fieldMetadata.IsRequired);
  188. HierarchyFieldMetadata hierarchyFieldMetadata = fieldMetadata as HierarchyFieldMetadata;
  189. Assert.AreEqual(1, hierarchyFieldMetadata.Node.Length);
  190. Assert.AreEqual("Director", hierarchyFieldMetadata.Node[0].Name);
  191. fieldMetadata = metadataApi.GetField(objectMetadataId, "HuKou");
  192. Assert.AreEqual("HuKou", fieldMetadata.Name);
  193. Assert.AreEqual(FieldType.Enumeration, fieldMetadata.Type);
  194. Assert.AreEqual(6, fieldMetadata.Ordinal);
  195. Assert.IsFalse(fieldMetadata.IsRequired);
  196. IEnumerable<IFieldMetadata> allFieldMetadata = metadataApi.GetFields(objectMetadataId);
  197. Assert.AreEqual(6, allFieldMetadata.Count());
  198. }
  199. }
  200. }