/Orchard.Core.Tests/Settings/Metadata/ContentDefinitionManagerTests.cs

https://bitbucket.org/oleg_ator/orchard.test · C# · 249 lines · 214 code · 35 blank · 0 comment · 3 complexity · b2de32121e840b12d69eb513ea5dfcb1 MD5 · raw file

  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using Autofac;
  5. using Moq;
  6. using NHibernate;
  7. using NUnit.Framework;
  8. using Orchard.Caching;
  9. using Orchard.ContentManagement.MetaData;
  10. using Orchard.ContentManagement.MetaData.Builders;
  11. using Orchard.ContentManagement.MetaData.Services;
  12. using Orchard.Core.Settings.Metadata;
  13. using Orchard.Core.Settings.Metadata.Records;
  14. using Orchard.Data;
  15. using Orchard.Tests;
  16. using Orchard.Tests.Stubs;
  17. using Orchard.Tests.Utility;
  18. namespace Orchard.Core.Tests.Settings.Metadata {
  19. [TestFixture]
  20. public class ContentDefinitionManagerTests {
  21. private string _databaseFileName;
  22. private ISessionFactory _sessionFactory;
  23. private ISession _session;
  24. private IContainer _container;
  25. [TestFixtureSetUp]
  26. public void InitFixture() {
  27. _databaseFileName = Path.GetTempFileName();
  28. _sessionFactory = DataUtility.CreateSessionFactory(
  29. _databaseFileName,
  30. typeof(ContentTypeDefinitionRecord),
  31. typeof(ContentTypePartDefinitionRecord),
  32. typeof(ContentPartDefinitionRecord),
  33. typeof(ContentPartFieldDefinitionRecord),
  34. typeof(ContentFieldDefinitionRecord)
  35. );
  36. }
  37. [SetUp]
  38. public void Init() {
  39. var builder = new ContainerBuilder();
  40. builder.RegisterAutoMocking();
  41. builder.RegisterType<ContentDefinitionManager>().As<IContentDefinitionManager>();
  42. builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
  43. builder.RegisterType(typeof(SettingsFormatter)).As(typeof(ISettingsFormatter));
  44. builder.RegisterType<Signals>().As<ISignals>();
  45. builder.RegisterType<StubCacheManager>().As<ICacheManager>();
  46. builder.RegisterType<StubParallelCacheContext>().As<IParallelCacheContext>();
  47. _container = builder.Build();
  48. _container.Mock<ISessionLocator>()
  49. .Setup(x => x.For(It.IsAny<Type>()))
  50. .Returns(() => _session);
  51. _session = _sessionFactory.OpenSession();
  52. foreach (var killType in new[] { typeof(ContentTypeDefinitionRecord), typeof(ContentPartDefinitionRecord), typeof(ContentFieldDefinitionRecord) }) {
  53. foreach (var killRecord in _session.CreateCriteria(killType).List()) {
  54. _session.Delete(killRecord);
  55. }
  56. }
  57. _session.Flush();
  58. }
  59. void ResetSession() {
  60. _session.Flush();
  61. _session.Dispose();
  62. _session = _sessionFactory.OpenSession();
  63. }
  64. [TearDown]
  65. public void Term() {
  66. _session.Dispose();
  67. }
  68. [TestFixtureTearDown]
  69. public void TermFixture() {
  70. File.Delete(_databaseFileName);
  71. }
  72. [Test]
  73. public void NoTypesAreAvailableByDefault() {
  74. var types = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions();
  75. Assert.That(types.Count(), Is.EqualTo(0));
  76. }
  77. [Test]
  78. public void TypeRecordsAreReturned() {
  79. var repository = _container.Resolve<IRepository<ContentTypeDefinitionRecord>>();
  80. repository.Create(new ContentTypeDefinitionRecord { Name = "alpha" });
  81. repository.Create(new ContentTypeDefinitionRecord { Name = "beta" });
  82. ResetSession();
  83. var types = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions();
  84. Assert.That(types.Count(), Is.EqualTo(2));
  85. }
  86. [Test]
  87. public void TypeSettingsAreParsed() {
  88. var repository = _container.Resolve<IRepository<ContentTypeDefinitionRecord>>();
  89. repository.Create(new ContentTypeDefinitionRecord { Name = "alpha", Settings = "<settings a='1' b='2'/>" });
  90. ResetSession();
  91. var alpha = _container.Resolve<IContentDefinitionManager>().ListTypeDefinitions().Single();
  92. Assert.That(alpha.Settings["a"], Is.EqualTo("1"));
  93. Assert.That(alpha.Settings["b"], Is.EqualTo("2"));
  94. }
  95. [Test]
  96. public void ContentTypesWithSettingsCanBeCreatedAndModified() {
  97. var manager = _container.Resolve<IContentDefinitionManager>();
  98. manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
  99. .Named("alpha")
  100. .WithSetting("a", "1")
  101. .WithSetting("b", "2")
  102. .Build());
  103. manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
  104. .Named("beta")
  105. .WithSetting("c", "3")
  106. .WithSetting("d", "4")
  107. .Build());
  108. ResetSession();
  109. var types1 = manager.ListTypeDefinitions();
  110. Assert.That(types1.Count(), Is.EqualTo(2));
  111. var alpha1 = types1.Single(t => t.Name == "alpha");
  112. Assert.That(alpha1.Settings["a"], Is.EqualTo("1"));
  113. manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder(alpha1).WithSetting("a", "5").Build());
  114. ResetSession();
  115. var types2 = manager.ListTypeDefinitions();
  116. Assert.That(types2.Count(), Is.EqualTo(2));
  117. var alpha2 = types2.Single(t => t.Name == "alpha");
  118. Assert.That(alpha2.Settings["a"], Is.EqualTo("5"));
  119. Assert.That(alpha2.Settings["a"], Is.EqualTo("5"));
  120. }
  121. [Test]
  122. public void StubPartDefinitionsAreCreatedWhenContentTypesAreStored() {
  123. var manager = _container.Resolve<IContentDefinitionManager>();
  124. manager.StoreTypeDefinition(new ContentTypeDefinitionBuilder()
  125. .Named("alpha")
  126. .WithPart("foo", pb => { })
  127. .Build());
  128. ResetSession();
  129. var fooRecord = _container.Resolve<IRepository<ContentPartDefinitionRecord>>().Fetch(r => r.Name == "foo").SingleOrDefault();
  130. Assert.That(fooRecord, Is.Not.Null);
  131. Assert.That(fooRecord.Name, Is.EqualTo("foo"));
  132. var foo = manager.GetPartDefinition("foo");
  133. Assert.That(foo, Is.Not.Null);
  134. Assert.That(foo.Name, Is.EqualTo("foo"));
  135. var alpha = manager.GetTypeDefinition("alpha");
  136. Assert.That(alpha, Is.Not.Null);
  137. Assert.That(alpha.Parts.Count(), Is.EqualTo(1));
  138. Assert.That(alpha.Parts.Single().PartDefinition.Name, Is.EqualTo("foo"));
  139. }
  140. [Test]
  141. public void GettingDefinitionsByNameCanReturnNullAndWillAcceptNullEmptyOrInvalidNames() {
  142. var manager = _container.Resolve<IContentDefinitionManager>();
  143. Assert.That(manager.GetTypeDefinition("no such name"), Is.Null);
  144. Assert.That(manager.GetTypeDefinition(string.Empty), Is.Null);
  145. Assert.That(manager.GetTypeDefinition(null), Is.Null);
  146. Assert.That(manager.GetPartDefinition("no such name"), Is.Null);
  147. Assert.That(manager.GetPartDefinition(string.Empty), Is.Null);
  148. Assert.That(manager.GetPartDefinition(null), Is.Null);
  149. }
  150. [Test]
  151. public void PartsAreRemovedWhenNotReferencedButPartDefinitionRemains() {
  152. var manager = _container.Resolve<IContentDefinitionManager>();
  153. manager.StoreTypeDefinition(
  154. new ContentTypeDefinitionBuilder()
  155. .Named("alpha")
  156. .WithPart("foo", pb => { })
  157. .WithPart("bar", pb => { })
  158. .Build());
  159. AssertThatTypeHasParts("alpha","foo","bar");
  160. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(2));
  161. ResetSession();
  162. AssertThatTypeHasParts("alpha","foo","bar");
  163. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(2));
  164. manager.StoreTypeDefinition(
  165. new ContentTypeDefinitionBuilder(manager.GetTypeDefinition("alpha"))
  166. .WithPart("frap", pb => { })
  167. .RemovePart("bar")
  168. .Build());
  169. AssertThatTypeHasParts("alpha","foo","frap");
  170. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(3));
  171. ResetSession();
  172. AssertThatTypeHasParts("alpha","foo","frap");
  173. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(3));
  174. }
  175. [Test]
  176. public void PartsCanBeDeleted() {
  177. var manager = _container.Resolve<IContentDefinitionManager>();
  178. manager.StoreTypeDefinition(
  179. new ContentTypeDefinitionBuilder()
  180. .Named("alpha")
  181. .WithPart("foo", pb => { })
  182. .WithPart("bar", pb => { })
  183. .Build());
  184. AssertThatTypeHasParts("alpha", "foo", "bar");
  185. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(2));
  186. manager.DeletePartDefinition("foo");
  187. ResetSession();
  188. AssertThatTypeHasParts("alpha", "bar");
  189. Assert.That(manager.ListPartDefinitions().Count(), Is.EqualTo(1));
  190. }
  191. [Test]
  192. public void ContentTypesCanBeDeleted() {
  193. var manager = _container.Resolve<IContentDefinitionManager>();
  194. manager.StoreTypeDefinition(
  195. new ContentTypeDefinitionBuilder()
  196. .Named("alpha")
  197. .WithPart("foo", pb => { })
  198. .WithPart("bar", pb => { })
  199. .Build());
  200. Assert.That(manager.GetTypeDefinition("alpha"), Is.Not.Null);
  201. manager.DeleteTypeDefinition("alpha");
  202. ResetSession();
  203. Assert.That(manager.GetTypeDefinition("alpha"), Is.Null);
  204. }
  205. private void AssertThatTypeHasParts(string typeName, params string[] partNames) {
  206. var type = _container.Resolve<IContentDefinitionManager>().GetTypeDefinition(typeName);
  207. Assert.That(type, Is.Not.Null);
  208. Assert.That(type.Parts.Count(), Is.EqualTo(partNames.Count()));
  209. foreach(var partName in partNames) {
  210. Assert.That(type.Parts.Select(p=>p.PartDefinition.Name), Has.Some.EqualTo(partName));
  211. }
  212. }
  213. }
  214. }