/ToMigrate/Raven.Tests.Issues/RavenDb_1977.cs

https://github.com/fitzchak/ravendb · C# · 632 lines · 558 code · 74 blank · 0 comment · 13 complexity · 1def67eeecd049f2b82de8c22ffdaa8c MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Raven.Abstractions.Data;
  5. using Raven.Client;
  6. using Raven.Json.Linq;
  7. using Raven.Tests.Common;
  8. using Xunit;
  9. namespace Raven.Tests.Issues
  10. {
  11. public class RavenDb_1977 : RavenTest
  12. {
  13. [Fact]
  14. public void CanDetectObjectAddChanges()
  15. {
  16. using (var store = NewDocumentStore())
  17. {
  18. using (var session = store.OpenSession())
  19. {
  20. session.Store(new UserData
  21. {
  22. Id = 123,
  23. Name = "user1",
  24. Salary = 12.5,
  25. Date = DateTime.Now,
  26. Exam1Marks = new[] {88, 99, 77}
  27. }, "UserDatas/1");
  28. session.Store(new UserData
  29. {
  30. Id = 1234,
  31. Name = "user2",
  32. Salary = 12.51,
  33. Date = new DateTime(2014, 1, 1)
  34. }, "UserDatas/2");
  35. session.Store(new UserData
  36. {
  37. Id = 1235,
  38. Name = "user3",
  39. Salary = 12.45,
  40. Date = new DateTime(2014, 1, 2)
  41. }, "UserDatas/3");
  42. IDictionary<string, DocumentsChanges[]> resChanges1 = session.Advanced.WhatChanged();
  43. int supposedChangesNumber = 3;
  44. Assert.Equal(supposedChangesNumber, resChanges1.Count);
  45. Assert.True(resChanges1.ContainsKey("UserDatas/1"));
  46. Assert.True(resChanges1.ContainsKey("UserDatas/2"));
  47. Assert.True(resChanges1.ContainsKey("UserDatas/3"));
  48. session.SaveChanges();
  49. IDictionary<string, DocumentsChanges[]> resChanges2 = session.Advanced.WhatChanged();
  50. supposedChangesNumber = 0;
  51. Assert.Equal(supposedChangesNumber, resChanges2.Count);
  52. var userdata1 = session.Load<UserData>("UserDatas/1");
  53. int[] newMark = { 67, 65 };
  54. List<int> list = userdata1.Exam1Marks.ToList();
  55. list.AddRange(newMark);
  56. userdata1.Exam1Marks = list.ToArray();
  57. IDictionary<string, DocumentsChanges[]> changes4 = session.Advanced.WhatChanged();
  58. DocumentsChanges[] data4 = { };
  59. if (changes4.TryGetValue("UserDatas/1", out data4))
  60. {
  61. Assert.Equal(data4.Length, 2);
  62. }
  63. session.SaveChanges();
  64. }
  65. }
  66. }
  67. [Fact]
  68. public void CanDetectManyObjectChanges()
  69. {
  70. using (var store = NewDocumentStore())
  71. {
  72. using (var session = store.OpenSession())
  73. {
  74. session.Store(new UserData
  75. {
  76. Id = 123,
  77. Name = "user1",
  78. Salary = 12.5,
  79. Date = DateTime.Now,
  80. Exam1Marks = new[] { 88, 99, 77 }
  81. }, "UserDatas/1");
  82. session.Store(new UserData
  83. {
  84. Id = 1234,
  85. Name = "user2",
  86. Salary = 12.51,
  87. Date = new DateTime(2014, 1, 1)
  88. }, "UserDatas/2");
  89. session.Store(new UserData
  90. {
  91. Id = 1235,
  92. Name = "user3",
  93. Salary = 12.45,
  94. Date = new DateTime(2014, 1, 2)
  95. }, "UserDatas/3");
  96. IDictionary<string, DocumentsChanges[]> resChanges1 = session.Advanced.WhatChanged();
  97. int supposedChangesNumber = 3;
  98. Assert.Equal(supposedChangesNumber, resChanges1.Count);
  99. Assert.True(resChanges1.ContainsKey("UserDatas/1"));
  100. Assert.True(resChanges1.ContainsKey("UserDatas/2"));
  101. Assert.True(resChanges1.ContainsKey("UserDatas/3"));
  102. session.SaveChanges();
  103. IDictionary<string, DocumentsChanges[]> resChanges2 = session.Advanced.WhatChanged();
  104. supposedChangesNumber = 0;
  105. Assert.Equal(supposedChangesNumber, resChanges2.Count);
  106. }
  107. using (IDocumentSession session = store.OpenSession())
  108. {
  109. var userdata2 = session.Load<UserData>("UserDatas/2");
  110. userdata2.Salary = 556;
  111. var userdata1 = session.Load<UserData>("UserDatas/1");
  112. userdata1.Exam1Marks[0] = 56;
  113. userdata1.Salary = 54.7;
  114. IDictionary<string, DocumentsChanges[]> changes3 = session.Advanced.WhatChanged();
  115. int ExpectedChangesCount = 2;
  116. Assert.Equal(ExpectedChangesCount, changes3.Count);
  117. Assert.True(changes3.ContainsKey("UserDatas/1"));
  118. Assert.True(changes3.ContainsKey("UserDatas/2"));
  119. var supposedChanges = new DocumentsChanges
  120. {
  121. Change = DocumentsChanges.ChangeType.FieldChanged,
  122. FieldName = "Salary",
  123. FieldNewType = "Float",
  124. FieldNewValue = "556",
  125. FieldOldType = "Float",
  126. FieldOldValue = "12.51"
  127. };
  128. DocumentsChanges[] data2 = { };
  129. if (changes3.TryGetValue("UserDatas/2", out data2))
  130. {
  131. Assert.Equal(data2.Length, 1);
  132. Assert.Equal(data2[0], supposedChanges);
  133. }
  134. DocumentsChanges[] data1 = { };
  135. if (changes3.TryGetValue("UserDatas/1", out data1))
  136. {
  137. Assert.Equal(data1.Length, ExpectedChangesCount); //UserDatas/1 was changed twice
  138. }
  139. session.SaveChanges();
  140. userdata1 = session.Load<UserData>("UserDatas/1");
  141. int[] newMark = { 67, 65 };
  142. List<int> list = userdata1.Exam1Marks.ToList();
  143. list.AddRange(newMark);
  144. userdata1.Exam1Marks = list.ToArray();
  145. IDictionary<string, DocumentsChanges[]> changes4 = session.Advanced.WhatChanged();
  146. DocumentsChanges[] data4 = { };
  147. if (changes4.TryGetValue("UserDatas/1", out data4))
  148. {
  149. Assert.Equal(data4.Length, 2);
  150. }
  151. session.SaveChanges();
  152. userdata1 = session.Load<UserData>("UserDatas/1");
  153. int numToRemove = 99;
  154. int numIndex = Array.IndexOf(userdata1.Exam1Marks, numToRemove);
  155. userdata1.Exam1Marks = userdata1.Exam1Marks.Where((val, idx) => idx != numIndex).ToArray();
  156. numToRemove = 77;
  157. numIndex = Array.IndexOf(userdata1.Exam1Marks, numToRemove);
  158. userdata1.Exam1Marks = userdata1.Exam1Marks.Where((val, idx) => idx != numIndex).ToArray();
  159. var userdata = session.Load<UserData>("UserDatas/3");
  160. session.Delete(userdata);
  161. session.Store(new UserData
  162. {
  163. Id = 2235,
  164. Name = "user4",
  165. Salary = 32.45,
  166. Date = new DateTime(2014, 2, 2)
  167. }, "UserDatas/4");
  168. ExpectedChangesCount = 3;
  169. IDictionary<string, DocumentsChanges[]> changes7 = session.Advanced.WhatChanged();
  170. Assert.Equal(ExpectedChangesCount, changes7.Count);
  171. Assert.True(changes7.ContainsKey("UserDatas/1"));
  172. Assert.True(changes7.ContainsKey("UserDatas/3"));
  173. Assert.True(changes7.ContainsKey("UserDatas/4"));
  174. session.SaveChanges();
  175. }
  176. }
  177. }
  178. [Fact]
  179. public void CanDetectObjectUpdateChanges()
  180. {
  181. using (var store = NewDocumentStore())
  182. {
  183. using (var session = store.OpenSession())
  184. {
  185. session.Store(new UserData
  186. {
  187. Id = 123,
  188. Name = "user1",
  189. Salary = 12.5,
  190. Date = DateTime.Now,
  191. Exam1Marks = new[] { 88, 99, 77 },
  192. Exam2Marks = new[] { 77, 78, 79 }
  193. }, "UserDatas/1");
  194. session.Store(new UserData
  195. {
  196. Id = 1234,
  197. Name = "user2",
  198. Salary = 12.51,
  199. Date = new DateTime(2014, 1, 1)
  200. }, "UserDatas/2");
  201. session.Store(new UserData
  202. {
  203. Id = 1235,
  204. Name = "user3",
  205. Salary = 12.45,
  206. Date = new DateTime(2014, 1, 2)
  207. }, "UserDatas/3");
  208. session.SaveChanges();
  209. }
  210. using (var session = store.OpenSession())
  211. {
  212. var userdata2 = session.Load<UserData>("UserDatas/2");
  213. userdata2.Salary = 556;
  214. var userdata1 = session.Load<UserData>("UserDatas/1");
  215. userdata1.Exam1Marks[0] = 56;
  216. userdata1.Exam2Marks[0] = 88;
  217. userdata1.Salary = 54.7;
  218. IDictionary<string, DocumentsChanges[]> changes3 = session.Advanced.WhatChanged();
  219. int supposedChangesNumber = 2;
  220. Assert.Equal(supposedChangesNumber, changes3.Count);
  221. Assert.True(changes3.ContainsKey("UserDatas/1"));
  222. Assert.True(changes3.ContainsKey("UserDatas/2"));
  223. var supposedChanges = new DocumentsChanges
  224. {
  225. Change = DocumentsChanges.ChangeType.FieldChanged,
  226. FieldName = "Salary",
  227. FieldNewType = "Float",
  228. FieldNewValue = "556",
  229. FieldOldType = "Float",
  230. FieldOldValue = "12.51"
  231. };
  232. DocumentsChanges[] data2;
  233. if (changes3.TryGetValue("UserDatas/2", out data2))
  234. {
  235. Assert.Equal(data2.Length, 1);
  236. Assert.Equal(data2[0], supposedChanges);
  237. }
  238. DocumentsChanges[] data1;
  239. if (changes3.TryGetValue("UserDatas/1", out data1))
  240. {
  241. Assert.Equal(data1.Length, 3);
  242. }
  243. session.SaveChanges();
  244. }
  245. }
  246. }
  247. [Fact]
  248. public void CanDetectObjectDeleteChanges()
  249. {
  250. using (var store = NewDocumentStore())
  251. {
  252. using (var session = store.OpenSession())
  253. {
  254. session.Store(new UserData
  255. {
  256. Id = 123,
  257. Name = "user1",
  258. Salary = 12.5,
  259. Date = DateTime.Now,
  260. Exam1Marks = new[] { 88, 99, 77 },
  261. Exam2Marks = new[] { 94, 95, 96 }
  262. }, "UserDatas/1");
  263. session.Store(new UserData
  264. {
  265. Id = 1234,
  266. Name = "user2",
  267. Salary = 12.51,
  268. Date = new DateTime(2014, 1, 1)
  269. }, "UserDatas/2");
  270. session.Store(new UserData
  271. {
  272. Id = 1235,
  273. Name = "user3",
  274. Salary = 12.45,
  275. Date = new DateTime(2014, 1, 2)
  276. }, "UserDatas/3");
  277. session.SaveChanges();
  278. }
  279. using (var session = store.OpenSession())
  280. {
  281. var userdata1 = session.Load<UserData>("UserDatas/1");
  282. int numToRemove = 99;
  283. int numIndex = Array.IndexOf(userdata1.Exam1Marks, numToRemove);
  284. userdata1.Exam1Marks = userdata1.Exam1Marks.Where((val, idx) => idx != numIndex).ToArray();
  285. numToRemove = 77;
  286. numIndex = Array.IndexOf(userdata1.Exam1Marks, numToRemove);
  287. userdata1.Exam1Marks = userdata1.Exam1Marks.Where((val, idx) => idx != numIndex).ToArray();
  288. numToRemove = 96;
  289. numIndex = Array.IndexOf(userdata1.Exam2Marks, numToRemove);
  290. userdata1.Exam2Marks = userdata1.Exam2Marks.Where((val, idx) => idx != numIndex).ToArray();
  291. numToRemove = 95;
  292. numIndex = Array.IndexOf(userdata1.Exam2Marks, numToRemove);
  293. userdata1.Exam2Marks = userdata1.Exam2Marks.Where((val, idx) => idx != numIndex).ToArray();
  294. var userdata = session.Load<UserData>("UserDatas/3");
  295. session.Delete(userdata);
  296. IDictionary<string, DocumentsChanges[]> changes1 = session.Advanced.WhatChanged();
  297. var supposedChangesNumber = 2;
  298. Assert.Equal(supposedChangesNumber, changes1.Count);
  299. Assert.True(changes1.ContainsKey("UserDatas/1"));
  300. Assert.True(changes1.ContainsKey("UserDatas/3"));
  301. session.SaveChanges();
  302. }
  303. }
  304. }
  305. [Fact]
  306. public void CanDetectAddMetadataChanges()
  307. {
  308. using (var store = NewDocumentStore())
  309. {
  310. using (var session = store.OpenSession())
  311. {
  312. session.Store(new UserData
  313. {
  314. Id = 123,
  315. Name = "user1",
  316. Salary = 12.5,
  317. Date = DateTime.Now
  318. }, "UserDatas/1");
  319. session.Store(new UserData
  320. {
  321. Id = 1234,
  322. Name = "user2",
  323. Salary = 12.51,
  324. Date = new DateTime(2014, 1, 1)
  325. }, "UserDatas/2");
  326. session.Store(new UserData
  327. {
  328. Id = 1235,
  329. Name = "user3",
  330. Salary = 12.45,
  331. Date = new DateTime(2014, 1, 2)
  332. }, "UserDatas/3");
  333. session.SaveChanges();
  334. }
  335. using (var session = store.OpenSession())
  336. {
  337. var userdata3 = session.Load<UserData>("UserDatas/3");
  338. RavenJObject metadata3 = session.Advanced.GetMetadataFor(userdata3);
  339. metadata3["tel"] = 1;
  340. metadata3["fax"] = 221;
  341. metadata3["mail"] = "test_mail";
  342. IDictionary<string, DocumentsChanges[]> changes3 = session.Advanced.WhatChanged();
  343. int supposedChangesNumber = 1;
  344. Assert.Equal(supposedChangesNumber, changes3.Count);
  345. Assert.True(changes3.ContainsKey("UserDatas/3"));
  346. DocumentsChanges[] data3 = { };
  347. if (changes3.TryGetValue("UserDatas/3", out data3))
  348. {
  349. Assert.Equal(data3.Length, 3);
  350. }
  351. session.SaveChanges();
  352. }
  353. }
  354. }
  355. [Fact]
  356. public void CanDetectUpdateMetadataChanges()
  357. {
  358. using (var store = NewDocumentStore())
  359. {
  360. using (var session = store.OpenSession())
  361. {
  362. session.Store(new UserData
  363. {
  364. Id = 123,
  365. Name = "user1",
  366. Salary = 12.5,
  367. Date = DateTime.Now
  368. }, "UserDatas/1");
  369. session.Store(new UserData
  370. {
  371. Id = 1234,
  372. Name = "user2",
  373. Salary = 12.51,
  374. Date = new DateTime(2014, 1, 1)
  375. }, "UserDatas/2");
  376. session.Store(new UserData
  377. {
  378. Id = 1235,
  379. Name = "user3",
  380. Salary = 12.45,
  381. Date = new DateTime(2014, 1, 2)
  382. }, "UserDatas/3");
  383. session.SaveChanges();
  384. }
  385. const string propName1 = "test1";
  386. const string propName2 = "test2";
  387. using (var session = store.OpenSession())
  388. {
  389. var userdata1 = session.Load<UserData>("UserDatas/1");
  390. RavenJObject metadata = session.Advanced.GetMetadataFor(userdata1);
  391. metadata.Add(propName1, null);
  392. metadata.Add(propName2, null);
  393. session.SaveChanges();
  394. }
  395. using (var session = store.OpenSession())
  396. {
  397. var userdata2 = session.Load<UserData>("UserDatas/2");
  398. RavenJObject metadata2 = session.Advanced.GetMetadataFor(userdata2);
  399. metadata2[propName1] = "changes";
  400. metadata2[propName2] = "add changes";
  401. IDictionary<string, DocumentsChanges[]> changes3 = session.Advanced.WhatChanged();
  402. Assert.Equal(1, changes3.Count);
  403. Assert.True(changes3.ContainsKey("UserDatas/2"));
  404. DocumentsChanges[] data3;
  405. changes3.TryGetValue("UserDatas/2", out data3);
  406. Assert.NotNull(data3);
  407. Assert.Equal(2, data3.Length);
  408. session.SaveChanges();
  409. }
  410. }
  411. }
  412. [Fact]
  413. public void CanDetectDeleteMetadataChanges()
  414. {
  415. using (var store = NewDocumentStore())
  416. {
  417. using (var session = store.OpenSession())
  418. {
  419. session.Store(new UserData
  420. {
  421. Id = 123,
  422. Name = "user1",
  423. Salary = 12.5,
  424. Date = DateTime.Now
  425. }, "UserDatas/1");
  426. session.Store(new UserData
  427. {
  428. Id = 1234,
  429. Name = "user2",
  430. Salary = 12.51,
  431. Date = new DateTime(2014, 1, 1)
  432. }, "UserDatas/2");
  433. session.Store(new UserData
  434. {
  435. Id = 1235,
  436. Name = "user3",
  437. Salary = 12.45,
  438. Date = new DateTime(2014, 1, 2)
  439. }, "UserDatas/3");
  440. session.SaveChanges();
  441. }
  442. const string propName1 = "test1";
  443. const string propName2 = "test2";
  444. using (var session = store.OpenSession())
  445. {
  446. var userdata1 = session.Load<UserData>("UserDatas/1");
  447. RavenJObject metadata = session.Advanced.GetMetadataFor(userdata1);
  448. metadata.Add(propName1, null);
  449. metadata.Add(propName2, null);
  450. session.SaveChanges();
  451. }
  452. using (var session = store.OpenSession())
  453. {
  454. var userdata1 = session.Load<UserData>("UserDatas/1");
  455. RavenJObject metadata = session.Advanced.GetMetadataFor(userdata1);
  456. RavenJToken value;
  457. metadata.TryGetValue(propName1, out value);
  458. Assert.NotNull(value);
  459. metadata.TryGetValue(propName2, out value);
  460. Assert.NotNull(value);
  461. metadata.Remove(propName1);
  462. metadata.Remove(propName2);
  463. IDictionary<string, DocumentsChanges[]> changes3 = session.Advanced.WhatChanged();
  464. Assert.Equal(1, changes3.Count);
  465. Assert.True(changes3.ContainsKey("UserDatas/1"));
  466. DocumentsChanges[] data3;
  467. changes3.TryGetValue("UserDatas/1", out data3);
  468. Assert.NotNull(data3);
  469. Assert.Equal(2, data3.Length);
  470. session.SaveChanges();
  471. }
  472. }
  473. }
  474. [Fact]
  475. public void CanDetectChangesInNestedObject()
  476. {
  477. using (var store = NewDocumentStore())
  478. {
  479. using (var session = store.OpenSession())
  480. {
  481. session.Store(new Friend
  482. {
  483. UserData = new UserData
  484. {
  485. Id = 123,
  486. Name = "user1",
  487. Salary = 12.5,
  488. Exam1Marks = new []{1,2,},
  489. Date = DateTime.Now
  490. }
  491. }, "friends/1");
  492. session.SaveChanges();
  493. }
  494. using (var session = store.OpenSession())
  495. {
  496. var friend = session.Load<Friend>(1);
  497. friend.UserData.Name = "Foo";
  498. friend.UserData.Exam1Marks = new[] {1, 2, 3};
  499. var changes3 = session.Advanced.WhatChanged();
  500. Assert.Equal("UserData.Name", changes3["friends/1"][0].FieldName);
  501. Assert.Equal("UserData.Exam1Marks[2]", changes3["friends/1"][1].FieldName);
  502. }
  503. }
  504. }
  505. [Fact]
  506. public void CanDetectBigChangesInNestedObject()
  507. {
  508. using (var store = NewDocumentStore())
  509. {
  510. using (var session = store.OpenSession())
  511. {
  512. session.Store(new BigFriend
  513. {
  514. Descr="Test",
  515. UserData = new UserData
  516. {
  517. Id = 123,
  518. Name = "user1",
  519. Salary = 12.5,
  520. Exam1Marks = new[] { 1, 2, },
  521. Date = DateTime.Now
  522. }
  523. }, "bigfriends/1");
  524. session.SaveChanges();
  525. }
  526. using (var session = store.OpenSession())
  527. {
  528. var bigFriend = session.Load<BigFriend>(1);
  529. bigFriend.Descr = "New descr";
  530. bigFriend.UserData.Name = "Foo";
  531. bigFriend.UserData.Exam1Marks = new[] { 1, 2, 3 };
  532. var changes3 = session.Advanced.WhatChanged();
  533. Assert.Equal("Descr", changes3["bigfriends/1"][0].FieldName);
  534. Assert.Equal("UserData.Name", changes3["bigfriends/1"][1].FieldName);
  535. Assert.Equal("UserData.Exam1Marks[2]", changes3["bigfriends/1"][2].FieldName);
  536. }
  537. }
  538. }
  539. public class UserData
  540. {
  541. public DateTime Date;
  542. public int[] Exam1Marks;
  543. public int[] Exam2Marks;
  544. public int Id;
  545. public string Name;
  546. public double Salary;
  547. }
  548. public class Friend
  549. {
  550. public UserData UserData { get; set; }
  551. }
  552. public class BigFriend
  553. {
  554. public UserData UserData { get; set; }
  555. public string Descr;
  556. }
  557. }
  558. }