/ToMigrate/Raven.Tests.Bundles/Versioning/Versioning.cs

https://github.com/fitzchak/ravendb · C# · 559 lines · 488 code · 66 blank · 5 comment · 5 complexity · 21579fc86e66b949fc415e68b3c41d49 MD5 · raw file

  1. //-----------------------------------------------------------------------
  2. // <copyright file="Versioning.cs" company="Hibernating Rhinos LTD">
  3. // Copyright (c) Hibernating Rhinos LTD. All rights reserved.
  4. // </copyright>
  5. //-----------------------------------------------------------------------
  6. using System.IO;
  7. using System.Threading.Tasks;
  8. using Raven.Abstractions.Commands;
  9. using Raven.Abstractions.Connection;
  10. using Raven.Abstractions.Data;
  11. using Raven.Abstractions.Smuggler;
  12. using Raven.Bundles.Versioning.Data;
  13. using Raven.Client.Bundles.Versioning;
  14. using Raven.Smuggler;
  15. using Xunit;
  16. namespace Raven.Tests.Bundles.Versioning
  17. {
  18. public class Versioning : VersioningTest
  19. {
  20. [Fact]
  21. public async Task Can_get_all_revisions_async()
  22. {
  23. var company = new Company { Name = "Company Name" };
  24. using (var session = documentStore.OpenSession())
  25. {
  26. session.Store(company);
  27. session.SaveChanges();
  28. Assert.Equal(1, session.Advanced.GetMetadataFor(company).Value<int>("Raven-Document-Revision"));
  29. }
  30. using (var session = documentStore.OpenSession())
  31. {
  32. var company3 = session.Load<Company>(company.Id);
  33. company3.Name = "Hibernating Rhinos";
  34. session.SaveChanges();
  35. Assert.Equal(2, session.Advanced.GetMetadataFor(company3).Value<int>("Raven-Document-Revision"));
  36. }
  37. using (var session = documentStore.OpenAsyncSession())
  38. {
  39. var companiesRevisions = await session.Advanced.GetRevisionsForAsync<Company>(company.Id, 0, 25);
  40. Assert.Equal("Company Name", companiesRevisions[0].Name);
  41. Assert.Equal("Hibernating Rhinos", companiesRevisions[1].Name);
  42. }
  43. }
  44. [Fact]
  45. public void Will_automatically_set_metadata()
  46. {
  47. var company = new Company { Name = "Company Name" };
  48. using (var session = documentStore.OpenSession())
  49. {
  50. session.Store(company);
  51. session.SaveChanges();
  52. }
  53. using (var session = documentStore.OpenSession())
  54. {
  55. var company2 = session.Load<Company>(company.Id);
  56. var metadata = session.Advanced.GetMetadataFor(company2);
  57. Assert.Equal("Current", metadata.Value<string>("Raven-Document-Revision-Status"));
  58. Assert.Equal(1, metadata.Value<int>("Raven-Document-Revision"));
  59. }
  60. }
  61. [Fact]
  62. public void Can_exclude_entities_from_versioning()
  63. {
  64. var user = new User { Name = "User Name" };
  65. var comment = new Comment { Name = "foo" };
  66. using (var session = documentStore.OpenSession())
  67. {
  68. session.Store(user);
  69. session.Store(comment);
  70. session.SaveChanges();
  71. }
  72. using (var session = documentStore.OpenSession())
  73. {
  74. Assert.Null(session.Load<User>(user.Id + "/revisions/1"));
  75. Assert.Null(session.Load<Comment>(comment.Id + "/revisions/1"));
  76. }
  77. using (var session = documentStore.OpenSession())
  78. {
  79. var metadata = session.Advanced.GetMetadataFor(session.Load<User>(user.Id));
  80. Assert.Null(metadata.Value<string>("Raven-Document-Revision-Status"));
  81. Assert.Equal(0, metadata.Value<int>("Raven-Document-Revision"));
  82. }
  83. }
  84. [Fact]
  85. public void Will_automatically_update_metadata_on_next_insert()
  86. {
  87. var company = new Company { Name = "Company Name" };
  88. using (var session = documentStore.OpenSession())
  89. {
  90. session.Store(company);
  91. session.SaveChanges();
  92. company.Name = "Hibernating Rhinos";
  93. session.SaveChanges();
  94. }
  95. using (var session = documentStore.OpenSession())
  96. {
  97. var company2 = session.Load<Company>(company.Id);
  98. var metadata = session.Advanced.GetMetadataFor(company2);
  99. Assert.Equal("Current", metadata.Value<string>("Raven-Document-Revision-Status"));
  100. Assert.Equal(2, metadata.Value<int>("Raven-Document-Revision"));
  101. }
  102. }
  103. [Fact]
  104. public void Will_automatically_create_duplicate_on_first_insert()
  105. {
  106. var company = new Company { Name = "Company Name" };
  107. using (var session = documentStore.OpenSession())
  108. {
  109. session.Store(company);
  110. session.SaveChanges();
  111. }
  112. using (var session = documentStore.OpenSession())
  113. {
  114. var company2 = session.Load<Company>(company.Id + "/revisions/1");
  115. var metadata = session.Advanced.GetMetadataFor(company2);
  116. Assert.Equal(company.Name, company2.Name);
  117. Assert.Equal("Historical", metadata.Value<string>("Raven-Document-Revision-Status"));
  118. }
  119. }
  120. [Fact]
  121. public void Will_automatically_create_duplicate_on_next_insert()
  122. {
  123. var company = new Company { Name = "Company Name" };
  124. using (var session = documentStore.OpenSession())
  125. {
  126. session.Store(company);
  127. session.SaveChanges();
  128. Assert.Equal(1, session.Advanced.GetMetadataFor(company).Value<int>("Raven-Document-Revision"));
  129. }
  130. using (var session = documentStore.OpenSession())
  131. {
  132. var company3 = session.Load<Company>(company.Id);
  133. company3.Name = "Hibernating Rhinos";
  134. session.SaveChanges();
  135. Assert.Equal(2, session.Advanced.GetMetadataFor(company3).Value<int>("Raven-Document-Revision"));
  136. }
  137. using (var session = documentStore.OpenSession())
  138. {
  139. var company2 = session.Load<Company>(company.Id + "/revisions/1");
  140. var metadata = session.Advanced.GetMetadataFor(company2);
  141. Assert.Equal("Company Name", company2.Name);
  142. Assert.Equal("Historical", metadata.Value<string>("Raven-Document-Revision-Status"));
  143. Assert.Null(metadata.Value<string>("Raven-Document-Parent-Revision"));
  144. company2 = session.Load<Company>(company.Id + "/revisions/2");
  145. metadata = session.Advanced.GetMetadataFor(company2);
  146. Assert.Equal("Hibernating Rhinos", company2.Name);
  147. Assert.Equal("Historical", metadata.Value<string>("Raven-Document-Revision-Status"));
  148. Assert.Equal("companies/1/revisions/1", metadata.Value<string>("Raven-Document-Parent-Revision"));
  149. }
  150. }
  151. [Fact]
  152. public void Can_get_all_revisions()
  153. {
  154. var company = new Company { Name = "Company Name" };
  155. using (var session = documentStore.OpenSession())
  156. {
  157. session.Store(company);
  158. session.SaveChanges();
  159. Assert.Equal(1, session.Advanced.GetMetadataFor(company).Value<int>("Raven-Document-Revision"));
  160. }
  161. using (var session = documentStore.OpenSession())
  162. {
  163. var company3 = session.Load<Company>(company.Id);
  164. company3.Name = "Hibernating Rhinos";
  165. session.SaveChanges();
  166. Assert.Equal(2, session.Advanced.GetMetadataFor(company3).Value<int>("Raven-Document-Revision"));
  167. }
  168. using (var session = documentStore.OpenSession())
  169. {
  170. var companiesRevisions = session.Advanced.GetRevisionsFor<Company>(company.Id, 0, 25);
  171. Assert.Equal("Company Name", companiesRevisions[0].Name);
  172. Assert.Equal("Hibernating Rhinos", companiesRevisions[1].Name);
  173. }
  174. }
  175. [Fact]
  176. public void Will_create_revision_if_explicitly_requested()
  177. {
  178. var product = new Product() {Description = "A fine document db", Quantity = 5};
  179. using (var session = documentStore.OpenSession())
  180. {
  181. session.Store(product);
  182. session.Advanced.ExplicitlyVersion(product);
  183. session.SaveChanges();
  184. }
  185. using (var session = documentStore.OpenSession())
  186. {
  187. product = session.Load<Product>(product.Id);
  188. var metadata = session.Advanced.GetMetadataFor(product);
  189. Assert.Null(metadata[Constants.RavenCreateVersion]);
  190. Assert.Equal("Current", metadata.Value<string>("Raven-Document-Revision-Status"));
  191. }
  192. }
  193. [Fact]
  194. public void Will_not_create_revision_if_not_explicitly_requested()
  195. {
  196. var product = new Product() { Description = "A fine document db", Quantity = 5 };
  197. using (var session = documentStore.OpenSession())
  198. {
  199. session.Store(product);
  200. session.SaveChanges();
  201. }
  202. using (var session = documentStore.OpenSession())
  203. {
  204. product = session.Load<Product>(product.Id);
  205. var metadata = session.Advanced.GetMetadataFor(product);
  206. Assert.Null(metadata["Raven-Document-Revision-Status"]);
  207. }
  208. }
  209. [Fact]
  210. public void Will_delete_old_revisions()
  211. {
  212. var company = new Company { Name = "Company #1" };
  213. using (var session = documentStore.OpenSession())
  214. {
  215. session.Store(company);
  216. session.SaveChanges();
  217. for (int i = 0; i < 10; i++)
  218. {
  219. company.Name = "Company #" + i + 2;
  220. session.SaveChanges();
  221. }
  222. }
  223. using (var session = documentStore.OpenSession())
  224. {
  225. for (int i = 1; i < 7; i++)
  226. {
  227. Assert.Null(session.Load<Company>(company.Id + "/revisions/" + i));
  228. }
  229. for (int i = 7; i < 12; i++)
  230. {
  231. Assert.NotNull(session.Load<Company>(company.Id + "/revisions/" + i));
  232. }
  233. for (int i = 12; i < 21; i++)
  234. {
  235. Assert.Null(session.Load<Company>(company.Id + "/revisions/" + i));
  236. }
  237. }
  238. }
  239. [Fact]
  240. public void Will_not_delete_revisions_if_parent_exists()
  241. {
  242. var company = new Company { Name = "Company Name" };
  243. using (var session = documentStore.OpenSession())
  244. {
  245. session.Store(company);
  246. session.SaveChanges();
  247. }
  248. using (var session = documentStore.OpenSession())
  249. {
  250. var doc = session.Load<object>("companies/1/revisions/1");
  251. Assert.NotNull(doc);
  252. session.Advanced.Defer(new DeleteCommandData
  253. {
  254. Key = "companies/1/revisions/1",
  255. TransactionInformation = new TransactionInformation()
  256. });
  257. Assert.Throws<ErrorResponseException>(() => session.SaveChanges());
  258. }
  259. }
  260. [Fact]
  261. public void Will_delete_revisions_if_version_is_deleted()
  262. {
  263. var company = new Company { Name = "Company Name" };
  264. using (var session = documentStore.OpenSession())
  265. {
  266. session.Store(company);
  267. session.SaveChanges();
  268. }
  269. using (var session = documentStore.OpenSession())
  270. {
  271. var doc = session.Load<object>("companies/1/revisions/1");
  272. var comp = session.Load<object>("companies/1");
  273. Assert.NotNull(doc);
  274. session.Delete(comp);
  275. session.SaveChanges();
  276. }
  277. using (var session = documentStore.OpenSession())
  278. {
  279. var doc = session.Load<object>("companies/1/revisions/1");
  280. Assert.NotNull(doc);
  281. session.Advanced.Defer(new DeleteCommandData
  282. {
  283. Key = "companies/1/revisions/1",
  284. TransactionInformation = new TransactionInformation()
  285. });
  286. session.SaveChanges();
  287. }
  288. using (var session = documentStore.OpenSession())
  289. {
  290. var doc = session.Load<object>("companies/1/revisions/1");
  291. Assert.Null(doc);
  292. }
  293. }
  294. [Fact]
  295. public void Will_delete_child_revisions_if_purge_is_true()
  296. {
  297. using (var session = documentStore.OpenSession())
  298. {
  299. session.Store(new VersioningConfiguration
  300. {
  301. Exclude = false,
  302. PurgeOnDelete = true,
  303. Id = "Raven/Versioning/Companies"
  304. });
  305. session.SaveChanges();
  306. }
  307. var company = new Company { Name = "Company Name" };
  308. using (var session = documentStore.OpenSession())
  309. {
  310. session.Store(company);
  311. session.SaveChanges();
  312. }
  313. using (var session = documentStore.OpenSession())
  314. {
  315. var doc = session.Load<object>("companies/1");
  316. Assert.NotNull(doc);
  317. session.Delete(doc);
  318. session.SaveChanges();
  319. }
  320. using (var session = documentStore.OpenSession())
  321. {
  322. var doc = session.Load<object>("companies/1/revisions/1");
  323. Assert.Null(doc);
  324. }
  325. }
  326. [Fact]
  327. public void Will_not_delete_child_revisions_if_purge_is_false()
  328. {
  329. using (var session = documentStore.OpenSession())
  330. {
  331. session.Store(new VersioningConfiguration
  332. {
  333. Exclude = false,
  334. PurgeOnDelete = false,
  335. Id = "Raven/Versioning/Companies"
  336. });
  337. session.SaveChanges();
  338. }
  339. var company = new Company { Name = "Company Name" };
  340. using (var session = documentStore.OpenSession())
  341. {
  342. session.Store(company);
  343. session.SaveChanges();
  344. }
  345. using (var session = documentStore.OpenSession())
  346. {
  347. var doc = session.Load<object>("companies/1");
  348. Assert.NotNull(doc);
  349. session.Delete(doc);
  350. session.SaveChanges();
  351. }
  352. using (var session = documentStore.OpenSession())
  353. {
  354. var doc = session.Load<object>("companies/1/revisions/1");
  355. Assert.NotNull(doc);
  356. }
  357. }
  358. [Fact]
  359. public void After_a_put_delete_put_sequence_Will_continue_revision_numbers_from_last_value_if_purge_is_false()
  360. {
  361. using (var session = documentStore.OpenSession())
  362. {
  363. session.Store(new VersioningConfiguration
  364. {
  365. Exclude = false,
  366. PurgeOnDelete = false,
  367. Id = "Raven/Versioning/Companies",
  368. MaxRevisions = 5
  369. });
  370. session.SaveChanges();
  371. }
  372. var company = new Company { Id = "companies/1", Name = "Company Name" };
  373. using (var session = documentStore.OpenSession())
  374. {
  375. session.Store(company);
  376. session.SaveChanges();
  377. company.Name = "Company Name 2";
  378. session.SaveChanges();
  379. }
  380. using (var session = documentStore.OpenSession())
  381. {
  382. var doc = session.Load<Company>("companies/1");
  383. var metadata = session.Advanced.GetMetadataFor(doc);
  384. Assert.Equal(2, metadata.Value<int>("Raven-Document-Revision"));
  385. session.Delete(doc);
  386. session.SaveChanges();
  387. }
  388. using (var session = documentStore.OpenSession())
  389. {
  390. session.Store(company);
  391. session.SaveChanges();
  392. var metadata = session.Advanced.GetMetadataFor(company);
  393. Assert.Equal(3, metadata.Value<int>("Raven-Document-Revision"));
  394. }
  395. }
  396. [Fact, Trait("Category", "Smuggler")]
  397. public void Previously_deleted_docs_will_survive_export_import_cycle_if_purge_is_false()
  398. {
  399. using (var session = documentStore.OpenSession())
  400. {
  401. session.Store(new VersioningConfiguration
  402. {
  403. Exclude = false,
  404. PurgeOnDelete = false,
  405. Id = "Raven/Versioning/Companies",
  406. MaxRevisions = 5
  407. });
  408. session.SaveChanges();
  409. }
  410. var company = new Company { Id = "companies/1", Name = "Company Name" };
  411. using (var session = documentStore.OpenSession())
  412. {
  413. session.Store(company);
  414. session.SaveChanges();
  415. company.Name = "Company Name 2";
  416. session.SaveChanges();
  417. }
  418. using (var session = documentStore.OpenSession())
  419. {
  420. var doc = session.Load<Company>("companies/1");
  421. Assert.Equal(2, session.Advanced.GetMetadataFor(doc).Value<int>("Raven-Document-Revision"));
  422. session.Delete(doc);
  423. session.SaveChanges();
  424. }
  425. var file = Path.GetTempFileName();
  426. try
  427. {
  428. new SmugglerDatabaseApi().ExportData(new SmugglerExportOptions<RavenConnectionStringOptions> { ToFile = file, From = new RavenConnectionStringOptions { Url = documentStore.Url, DefaultDatabase = documentStore.DefaultDatabase } }).Wait();
  429. using (var documentStore2 = CreateDocumentStore(port: 8078))
  430. {
  431. var importSmuggler = new SmugglerDatabaseApi(new SmugglerDatabaseOptions()
  432. {
  433. ShouldDisableVersioningBundle = true
  434. });
  435. importSmuggler.ImportData(
  436. new SmugglerImportOptions<RavenConnectionStringOptions>
  437. {
  438. FromFile = file,
  439. To = new RavenConnectionStringOptions
  440. {
  441. Url = documentStore2.Url,
  442. Credentials = documentStore2.Credentials,
  443. DefaultDatabase = documentStore2.DefaultDatabase
  444. }
  445. }).Wait();
  446. using (var session = documentStore2.OpenSession())
  447. {
  448. session.Store(company);
  449. session.SaveChanges();
  450. Assert.Equal(3, session.Advanced.GetMetadataFor(company).Value<int>("Raven-Document-Revision"));
  451. }
  452. using (var session = documentStore2.OpenSession())
  453. {
  454. var doc = session.Load<Company>("companies/1");
  455. doc.Name = "Company Name 3";
  456. session.SaveChanges();
  457. Assert.Equal(4, session.Advanced.GetMetadataFor(doc).Value<int>("Raven-Document-Revision"));
  458. }
  459. }
  460. }
  461. finally
  462. {
  463. if (File.Exists(file))
  464. {
  465. File.Delete(file);
  466. }
  467. }
  468. }
  469. public class Comment
  470. {
  471. public string Id { get; set; }
  472. public string Name { get; set; }
  473. }
  474. public class User
  475. {
  476. public string Id { get; set; }
  477. public string Name { get; set; }
  478. }
  479. #region Nested type: Product
  480. public class Product
  481. {
  482. public string Id { get; set; }
  483. public string Description { get; set; }
  484. public int Quantity { get; set; }
  485. }
  486. #endregion
  487. }
  488. public class Company
  489. {
  490. public string Name { get; set; }
  491. public string Id { get; set; }
  492. }
  493. }