/src/Framework/Management.Tests/Trash/TrashDeleteRelationsTests.cs

https://github.com/lundbeck/n2cms · C# · 297 lines · 224 code · 68 blank · 5 comment · 1 complexity · 303e38d04f8d2aacd34e711cf5f0e3bc MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NUnit.Framework;
  6. using N2.Edit.Trash;
  7. using N2.Edit.Tests.Trash;
  8. using System.Security.Principal;
  9. using Shouldly;
  10. using N2.Persistence;
  11. using N2.Edit.Versioning;
  12. namespace N2.Management.Tests.Trash
  13. {
  14. [TestFixture]
  15. public class TrashDeleteRelationsTests : N2.Tests.PersistenceAwareBase
  16. {
  17. private ITrashHandler trash;
  18. private ThrowableItem root, item, item2;
  19. private IPersister persister;
  20. private IVersionManager versions;
  21. [SetUp]
  22. public override void SetUp()
  23. {
  24. base.SetUp();
  25. persister = engine.Persister;
  26. versions = engine.Resolve<IVersionManager>();
  27. persister.Dispose();
  28. CreateDatabaseSchema();
  29. root = CreateOneItem<ThrowableItem>(0, "root", null);
  30. item = CreateOneItem<ThrowableItem>(0, "item", root);
  31. item2 = CreateOneItem<ThrowableItem>(0, "item2", root);
  32. trash = engine.Resolve<ITrashHandler>();
  33. System.Threading.Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("admin", "test"), new string[] { "Administrators" });
  34. }
  35. protected override T CreateOneItem<T>(int id, string name, ContentItem parent)
  36. {
  37. var item = base.CreateOneItem<T>(id, name, parent);
  38. engine.Persister.Save(item);
  39. return item;
  40. }
  41. [Test]
  42. public void Trash_CanBePurged()
  43. {
  44. trash.Throw(item);
  45. trash.PurgeAll();
  46. persister.Dispose();
  47. engine.Persister.Get(item.ID).ShouldBe(null);
  48. }
  49. [Test]
  50. public void AncestralTrail_IsChangedTo_Trashcan()
  51. {
  52. trash.Throw(item);
  53. persister.Dispose();
  54. engine.Persister.Get(item.ID).AncestralTrail.ShouldBe((trash.TrashContainer as ContentItem).GetTrail());
  55. }
  56. [Test]
  57. public void AncestralTrail_OfDescendants_IsChanged()
  58. {
  59. var child = CreateOneItem<ThrowableItem>(0, "child", item);
  60. engine.Persister.Save(child);
  61. trash.Throw(item);
  62. persister.Dispose();
  63. engine.Persister.Get(child.ID).AncestralTrail.ShouldStartWith((trash.TrashContainer as ContentItem).GetTrail());
  64. }
  65. [Test]
  66. public void RelationTo_TrashedItem_IsRemoved()
  67. {
  68. item2["Relation"] = item;
  69. engine.Persister.Save(item2);
  70. persister.Dispose();
  71. item = persister.Get<ThrowableItem>(item.ID);
  72. trash.Throw(item);
  73. trash.PurgeAll();
  74. persister.Dispose();
  75. item2 = persister.Get<ThrowableItem>(item2.ID);
  76. item2["Relation"].ShouldBe(null);
  77. }
  78. [Test]
  79. public void RelationTo_TrashedItem_IsRemoved_FromVersions()
  80. {
  81. item2["Relation"] = item;
  82. engine.Resolve<IVersionManager>().AddVersion(item2);
  83. engine.Persister.Save(item2);
  84. persister.Dispose();
  85. item = persister.Get<ThrowableItem>(item.ID);
  86. trash.Throw(item);
  87. trash.PurgeAll();
  88. persister.Dispose();
  89. item2 = persister.Get<ThrowableItem>(item2.ID);
  90. var versions = engine.Resolve<IVersionManager>().GetVersionsOf(item2).ToList();
  91. versions[0].Content["Relation"].ShouldBe(null);
  92. versions[1].Content["Relation"].ShouldBe(null);
  93. }
  94. [Test]
  95. public void RelationTo_TrashedItemDescendant_IsRemoved()
  96. {
  97. var item1_1 = CreateOneItem<ThrowableItem>(0, "child", item);
  98. engine.Persister.Save(item1_1);
  99. item2["Relation"] = item;
  100. item2["Relation2"] = item1_1;
  101. persister.Save(item2);
  102. persister.Dispose();
  103. item = persister.Get<ThrowableItem>(item.ID);
  104. trash.Throw(item);
  105. trash.PurgeAll();
  106. persister.Dispose();
  107. item2 = persister.Get<ThrowableItem>(item2.ID);
  108. item2["Relation"].ShouldBe(null);
  109. item2["Relation2"].ShouldBe(null);
  110. }
  111. [Test]
  112. public void Relation_InDetailCollection_IsRemoved()
  113. {
  114. // root
  115. // item1 <- deleted
  116. // item1_1
  117. // item2 <- references item1 & item1_1
  118. var item1_1 = CreateOneItem<ThrowableItem>(0, "child", item);
  119. engine.Persister.Save(item1_1);
  120. var collection = item2.GetDetailCollection("Links", true);
  121. collection.Add(item);
  122. collection.Add(item1_1);
  123. engine.Persister.Save(item2);
  124. persister.Dispose();
  125. item = persister.Get<ThrowableItem>(item.ID);
  126. trash.Throw(item);
  127. persister.Dispose();
  128. trash.PurgeAll();
  129. persister.Dispose();
  130. item2 = persister.Get<ThrowableItem>(item2.ID);
  131. item2.GetDetailCollection("Links", true).Count.ShouldBe(0);
  132. }
  133. [Test]
  134. public void Relation_InDetailCollection_OfVersion_IsRemoved()
  135. {
  136. var item1_1 = CreateOneItem<ThrowableItem>(0, "child", item);
  137. engine.Persister.Save(item1_1);
  138. var collection = item2.GetDetailCollection("Links", true);
  139. collection.Add(item);
  140. collection.Add(item1_1);
  141. engine.Persister.Save(item2);
  142. var version = versions.AddVersion(item2);
  143. persister.Dispose();
  144. item = persister.Get<ThrowableItem>(item.ID);
  145. trash.Throw(item);
  146. trash.PurgeAll();
  147. persister.Dispose();
  148. item2 = persister.Get<ThrowableItem>(item2.ID);
  149. var repository = engine.Resolve<ContentVersionRepository>();
  150. version = repository.DeserializeVersion(repository.GetVersion(item2, version.VersionIndex));
  151. // persister.Get<ThrowableItem>(version.ID);
  152. item2.GetDetailCollection("Links", false).Count.ShouldBe(0);
  153. version.GetDetailCollection("Links", false).Count.ShouldBe(0);
  154. }
  155. [Test]
  156. public void Relations_WithinDeletedBranch_AreDeleted()
  157. {
  158. var item1_1 = CreateOneItem<ThrowableItem>(0, "child", item);
  159. item1_1["Relation"] = item;
  160. item1_1.GetDetailCollection("Links", true).Add(item);
  161. engine.Persister.Save(item1_1);
  162. item["Relation"] = item1_1;
  163. item.GetDetailCollection("Links", true).Add(item1_1);
  164. engine.Persister.Save(item);
  165. persister.Dispose();
  166. item = persister.Get<ThrowableItem>(item.ID);
  167. trash.Throw(item);
  168. trash.PurgeAll();
  169. persister.Get(item.ID).ShouldBe(null);
  170. persister.Get(item1_1.ID).ShouldBe(null);
  171. }
  172. [Test]
  173. public void Multikulti()
  174. {
  175. var item1_1 = CreateOneItem<ThrowableItem>(0, "child", item);
  176. var item2_1 = CreateOneItem<ThrowableItem>(0, "child2", item2);
  177. Relate(item, item, item1_1, item2, item2_1);
  178. Relate(item2, item, item1_1, item2, item2_1);
  179. Relate(item1_1, item, item1_1, item2, item2_1);
  180. Relate(item2_1, item, item1_1, item2, item2_1);
  181. var version = versions.AddVersion(item2);
  182. persister.Dispose();
  183. item = persister.Get<ThrowableItem>(item.ID);
  184. trash.Throw(item);
  185. trash.PurgeAll();
  186. persister.Dispose();
  187. persister.Get(item.ID).ShouldBe(null);
  188. persister.Get(item1_1.ID).ShouldBe(null);
  189. var db1 = persister.Get(item2.ID);
  190. var db2 = persister.Get(item2_1.ID);
  191. db1["Relation0"].ShouldBe(null);
  192. db1["Relation1"].ShouldBe(null);
  193. db1["Relation2"].ShouldBe(db1);
  194. db1["Relation3"].ShouldBe(db2);
  195. db1.GetDetailCollection("Links", false).Count.ShouldBe(2);
  196. db1.GetDetailCollection("Links", false).Contains(db1).ShouldBe(true);
  197. db1.GetDetailCollection("Links", false).Contains(db2).ShouldBe(true);
  198. db2["Relation0"].ShouldBe(null);
  199. db2["Relation1"].ShouldBe(null);
  200. db2["Relation2"].ShouldBe(db1);
  201. db2["Relation3"].ShouldBe(db2);
  202. db2.GetDetailCollection("Links", false).Count.ShouldBe(2);
  203. db2.GetDetailCollection("Links", false).Contains(db1).ShouldBe(true);
  204. db2.GetDetailCollection("Links", false).Contains(db2).ShouldBe(true);
  205. }
  206. [Test]
  207. public void Relations_InMultiValues_AreDeleted()
  208. {
  209. N2.Details.ContentDetail.Multi("Relation", true, 1, 1.1, N2.Utility.CurrentTime(), "hello", item, null).AddTo(item2);
  210. engine.Persister.Save(item2);
  211. persister.Dispose();
  212. item = persister.Get<ThrowableItem>(item.ID);
  213. trash.Throw(item);
  214. trash.PurgeAll();
  215. persister.Dispose();
  216. item2 = persister.Get<ThrowableItem>(item2.ID);
  217. item2.Details["Relation"].ShouldBe(null);
  218. }
  219. private void Relate(ThrowableItem item, params ThrowableItem[] to)
  220. {
  221. for (int i = 0; i < to.Length; i++)
  222. {
  223. item["Relation" + i] = to[i];
  224. item.GetDetailCollection("Links", true).Add(to[i]);
  225. }
  226. persister.Save(item);
  227. }
  228. }
  229. }