/ToMigrate/Raven.Tests.Bundles/CascadeDelete/CascadeDelete.cs

https://github.com/fitzchak/ravendb · C# · 398 lines · 267 code · 73 blank · 58 comment · 0 complexity · 6f7131e2e4ff02a0b0c7d40838d88b2a MD5 · raw file

  1. //-----------------------------------------------------------------------
  2. // <copyright file="CascadeDelete.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System.ComponentModel.Composition.Hosting;
  7. using System.IO;
  8. using Raven.Abstractions.Data;
  9. using Raven.Bundles.CascadeDelete;
  10. using Raven.Client.Document;
  11. using Raven.Json.Linq;
  12. using Raven.Tests.Common;
  13. using Xunit;
  14. namespace Raven.Tests.Bundles.CascadeDelete
  15. {
  16. public class CascadeDelete : RavenTest
  17. {
  18. private readonly DocumentStore documentStore;
  19. public CascadeDelete()
  20. {
  21. var ravenDbServer = GetNewServer(activeBundles: "Cascade Delete", databaseName: Constants.SystemDatabase, configureConfig: configuration =>
  22. {
  23. configuration.Catalog.Catalogs.Add(new AssemblyCatalog(typeof (CascadeDeleteTrigger).Assembly));
  24. });
  25. documentStore = NewRemoteDocumentStore(ravenDbServer: ravenDbServer, databaseName: Constants.SystemDatabase);
  26. }
  27. [Fact]
  28. public void Can_delete_document_with_no_cascades_specified()
  29. {
  30. var master = new CascadeTester { Name = "Master" };
  31. using (var session = documentStore.OpenSession())
  32. {
  33. session.Store(master);
  34. session.SaveChanges();
  35. }
  36. // assert initial creation
  37. using (var session = documentStore.OpenSession())
  38. {
  39. // assert master created
  40. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  41. }
  42. using (var session = documentStore.OpenSession())
  43. {
  44. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  45. session.SaveChanges();
  46. // assert master deleted
  47. Assert.Null(session.Load<CascadeTester>(master.Id));
  48. }
  49. }
  50. [Fact]
  51. public void Can_delete_document_with_not_existing_cascades_specified()
  52. {
  53. var master = new CascadeTester { Name = "Master" };
  54. using (var session = documentStore.OpenSession())
  55. {
  56. session.Store(master);
  57. session.Advanced.GetMetadataFor(master)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray {"I_Dont_Exist"};
  58. session.Advanced.GetMetadataFor(master)[MetadataKeys.AttachmentsToCascadeDelete] = new RavenJArray {"Neither_Do_I"};
  59. session.SaveChanges();
  60. }
  61. // assert initial creation
  62. using (var session = documentStore.OpenSession())
  63. {
  64. // assert master created
  65. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  66. }
  67. using (var session = documentStore.OpenSession())
  68. {
  69. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  70. session.SaveChanges();
  71. // assert master deleted
  72. Assert.Null(session.Load<CascadeTester>(master.Id));
  73. }
  74. }
  75. [Fact]
  76. public void Can_cascade_delete_single_referenced_document()
  77. {
  78. var master = new CascadeTester {Name="Master"};
  79. var child = new CascadeTester {Name="Child"};
  80. using (var session = documentStore.OpenSession())
  81. {
  82. session.Store(master);
  83. session.Store(child);
  84. session.Advanced.GetMetadataFor(master)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray {child.Id};
  85. session.SaveChanges();
  86. }
  87. // assert initial creation
  88. using (var session = documentStore.OpenSession())
  89. {
  90. // assert master created
  91. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  92. // assert child created
  93. Assert.NotNull(session.Load<CascadeTester>(child.Id));
  94. }
  95. using (var session = documentStore.OpenSession())
  96. {
  97. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  98. session.SaveChanges();
  99. // assert master deleted
  100. Assert.Null(session.Load<CascadeTester>(master.Id));
  101. // assert child deleted
  102. Assert.Null(session.Load<CascadeTester>(child.Id));
  103. }
  104. }
  105. [Fact]
  106. public void Can_cascade_delete_multiple_referenced_documents()
  107. {
  108. var master = new CascadeTester {Name="Master"};
  109. var child1 = new CascadeTester {Name="Child 1"};
  110. var child2 = new CascadeTester {Name="Child 2"};
  111. using (var session = documentStore.OpenSession())
  112. {
  113. session.Store(master);
  114. session.Store(child1);
  115. session.Store(child2);
  116. session.Advanced.GetMetadataFor(master)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray(child1.Id, child2.Id);
  117. session.SaveChanges();
  118. }
  119. // assert initial creation
  120. using (var session = documentStore.OpenSession())
  121. {
  122. // assert master created
  123. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  124. // assert child 1 created
  125. Assert.NotNull(session.Load<CascadeTester>(child1.Id));
  126. // assert child 2 created
  127. Assert.NotNull(session.Load<CascadeTester>(child2.Id));
  128. }
  129. using (var session = documentStore.OpenSession())
  130. {
  131. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  132. session.SaveChanges();
  133. // assert master deleted
  134. Assert.Null(session.Load<CascadeTester>(master.Id));
  135. // assert child 1 deleted
  136. Assert.Null(session.Load<CascadeTester>(child1.Id));
  137. // assert child 2 deleted
  138. Assert.Null(session.Load<CascadeTester>(child1.Id));
  139. }
  140. }
  141. [Fact]
  142. public void Can_cascade_delete_single_referenced_attachment()
  143. {
  144. var master = new CascadeTester {Name="Master"};
  145. using (var session = documentStore.OpenSession())
  146. {
  147. session.Store(master);
  148. documentStore.DatabaseCommands.PutAttachment("Cascade-Delete-Me", null, new MemoryStream(new byte[] { 1, 2, 3 }), new RavenJObject());
  149. session.Advanced.GetMetadataFor(master)[MetadataKeys.AttachmentsToCascadeDelete] = new RavenJArray{"Cascade-Delete-Me"};
  150. session.SaveChanges();
  151. }
  152. // assert initial creation
  153. using (var session = documentStore.OpenSession())
  154. {
  155. // assert master created
  156. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  157. // assert attachment created
  158. Assert.NotNull(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me"));
  159. }
  160. using (var session = documentStore.OpenSession())
  161. {
  162. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  163. session.SaveChanges();
  164. // assert master deleted
  165. Assert.Null(session.Load<CascadeTester>(master.Id));
  166. // assert attachment deleted
  167. Assert.Null(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me"));
  168. }
  169. }
  170. [Fact]
  171. public void Can_cascade_delete_multiple_referenced_attachments()
  172. {
  173. var master = new CascadeTester {Name="Master"};
  174. using (var session = documentStore.OpenSession())
  175. {
  176. session.Store(master);
  177. documentStore.DatabaseCommands.PutAttachment("Cascade-Delete-Me-1", null, new MemoryStream(new byte[] { 1, 2, 3 }), new RavenJObject());
  178. documentStore.DatabaseCommands.PutAttachment("Cascade-Delete-Me-2", null, new MemoryStream(new byte[] { 1, 2, 3 }), new RavenJObject());
  179. session.Advanced.GetMetadataFor(master)[MetadataKeys.AttachmentsToCascadeDelete] = new RavenJArray("Cascade-Delete-Me-1","Cascade-Delete-Me-2");
  180. session.SaveChanges();
  181. }
  182. // assert initial creation
  183. using (var session = documentStore.OpenSession())
  184. {
  185. // assert master created
  186. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  187. // assert attachment 1 created
  188. Assert.NotNull(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-1"));
  189. // assert attachment 2 created
  190. Assert.NotNull(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-2"));
  191. }
  192. using (var session = documentStore.OpenSession())
  193. {
  194. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  195. session.SaveChanges();
  196. // assert master deleted
  197. Assert.Null(session.Load<CascadeTester>(master.Id));
  198. // assert attachment 1 deleted
  199. Assert.Null(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-1"));
  200. // assert attachment 2 deleted
  201. Assert.Null(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-2"));
  202. }
  203. }
  204. [Fact]
  205. public void Can_cascade_delete_multiple_referenced_documents_and_attachments()
  206. {
  207. var master = new CascadeTester {Name="Master"};
  208. var child1 = new CascadeTester {Name="Child 1"};
  209. var child2 = new CascadeTester {Name="Child 2"};
  210. using (var session = documentStore.OpenSession())
  211. {
  212. session.Store(master);
  213. session.Store(child1);
  214. session.Store(child2);
  215. session.Advanced.GetMetadataFor(master)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray(child1.Id, child2.Id);
  216. documentStore.DatabaseCommands.PutAttachment("Cascade-Delete-Me-1", null, new MemoryStream(new byte[] { 1, 2, 3 }), new RavenJObject());
  217. documentStore.DatabaseCommands.PutAttachment("Cascade-Delete-Me-2", null, new MemoryStream(new byte[] { 1, 2, 3 }), new RavenJObject());
  218. session.Advanced.GetMetadataFor(master)[MetadataKeys.AttachmentsToCascadeDelete] = new RavenJArray("Cascade-Delete-Me-1", "Cascade-Delete-Me-2");
  219. session.SaveChanges();
  220. }
  221. // assert initial creation
  222. using (var session = documentStore.OpenSession())
  223. {
  224. // assert master created
  225. Assert.NotNull(session.Load<CascadeTester>(master.Id));
  226. // assert child 1 created
  227. Assert.NotNull(session.Load<CascadeTester>(child1.Id));
  228. // assert child 2 created
  229. Assert.NotNull(session.Load<CascadeTester>(child2.Id));
  230. // assert attachment 1 created
  231. Assert.NotNull(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-1"));
  232. // assert attachment 2 created
  233. Assert.NotNull(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-2"));
  234. }
  235. using (var session = documentStore.OpenSession())
  236. {
  237. session.Delete<CascadeTester>(session.Load<CascadeTester>(master.Id));
  238. session.SaveChanges();
  239. // assert master deleted
  240. Assert.Null(session.Load<CascadeTester>(master.Id));
  241. // assert child 1 deleted
  242. Assert.Null(session.Load<CascadeTester>(child1.Id));
  243. // assert child 2 deleted
  244. Assert.Null(session.Load<CascadeTester>(child2.Id));
  245. // assert attachment 1 deleted
  246. Assert.Null(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-1"));
  247. // assert attachment 2 deleted
  248. Assert.Null(documentStore.DatabaseCommands.GetAttachment("Cascade-Delete-Me-2"));
  249. }
  250. }
  251. [Fact]
  252. public void Can_cascade_delete_documents_that_specify_each_other_as_cascade_deletes()
  253. {
  254. var master1 = new CascadeTester { Name = "Master 1" };
  255. var master2 = new CascadeTester { Name = "Master 2" };
  256. using (var session = documentStore.OpenSession())
  257. {
  258. session.Store(master1);
  259. session.Store(master2);
  260. session.Advanced.GetMetadataFor(master1)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray { master2.Id };
  261. session.Advanced.GetMetadataFor(master2)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray { master1.Id };
  262. session.SaveChanges();
  263. }
  264. // assert initial creation
  265. using (var session = documentStore.OpenSession())
  266. {
  267. // assert master 1 created
  268. Assert.NotNull(session.Load<CascadeTester>(master1.Id));
  269. // assert master 2 created
  270. Assert.NotNull(session.Load<CascadeTester>(master2.Id));
  271. }
  272. using (var session = documentStore.OpenSession())
  273. {
  274. session.Delete<CascadeTester>(session.Load<CascadeTester>(master1.Id));
  275. session.SaveChanges();
  276. // assert master 1 deleted
  277. Assert.Null(session.Load<CascadeTester>(master1.Id));
  278. // assert master 2 deleted
  279. Assert.Null(session.Load<CascadeTester>(master2.Id));
  280. }
  281. }
  282. [Fact]
  283. public void Can_cascade_delete_documents_recursively()
  284. {
  285. var master1 = new CascadeTester { Name = "Master 1" };
  286. var middle1 = new CascadeTester { Name = "Middle 1" };
  287. var child1 = new CascadeTester { Name = "Child 1" };
  288. using (var session = documentStore.OpenSession())
  289. {
  290. session.Store(master1);
  291. session.Store(middle1);
  292. session.Store(child1);
  293. session.Advanced.GetMetadataFor(master1)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray { middle1.Id };
  294. session.Advanced.GetMetadataFor(middle1)[MetadataKeys.DocumentsToCascadeDelete] = new RavenJArray { child1.Id };
  295. session.SaveChanges();
  296. }
  297. // assert initial creation
  298. using (var session = documentStore.OpenSession())
  299. {
  300. // assert master 1 created
  301. Assert.NotNull(session.Load<CascadeTester>(master1.Id));
  302. // assert middle 1 created
  303. Assert.NotNull(session.Load<CascadeTester>(middle1.Id));
  304. // assert child 1 created
  305. Assert.NotNull(session.Load<CascadeTester>(child1.Id));
  306. }
  307. using (var session = documentStore.OpenSession())
  308. {
  309. session.Delete<CascadeTester>(session.Load<CascadeTester>(master1.Id));
  310. session.SaveChanges();
  311. // assert master 1 deleted
  312. Assert.Null(session.Load<CascadeTester>(master1.Id));
  313. // assert middle 1 deleted
  314. Assert.Null(session.Load<CascadeTester>(middle1.Id));
  315. // assert child 1 deleted
  316. Assert.Null(session.Load<CascadeTester>(child1.Id));
  317. }
  318. }
  319. public class CascadeTester
  320. {
  321. public string Name { get; set; }
  322. public string Id { get; set; }
  323. }
  324. }
  325. }