/test/SlowTests/Core/Session/Advanced.cs

https://github.com/fitzchak/ravendb · C# · 462 lines · 377 code · 85 blank · 0 comment · 1 complexity · 3e0861c2c384562f9eb9d2159f520c5a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using FastTests;
  4. using Raven.Client.Documents.Commands.Batches;
  5. using Raven.Client.Exceptions;
  6. using Raven.Client.Util;
  7. using Sparrow.Json.Parsing;
  8. using Xunit;
  9. using Company = SlowTests.Core.Utils.Entities.Company;
  10. using User = SlowTests.Core.Utils.Entities.User;
  11. using Raven.Server.Documents.Replication;
  12. namespace SlowTests.Core.Session
  13. {
  14. public class Advanced : RavenTestBase
  15. {
  16. [Fact]
  17. public void CanGetChangesInformation()
  18. {
  19. using (var store = GetDocumentStore())
  20. {
  21. using (var session = store.OpenSession())
  22. {
  23. Assert.False(session.Advanced.HasChanges);
  24. var user = new User { Id = "users/1", Name = "John" };
  25. session.Store(user);
  26. Assert.True(session.Advanced.HasChanged(user));
  27. Assert.True(session.Advanced.HasChanges);
  28. session.SaveChanges();
  29. Assert.False(session.Advanced.HasChanged(user));
  30. Assert.False(session.Advanced.HasChanges);
  31. user.AddressId = "addresses/1";
  32. Assert.True(session.Advanced.HasChanged(user));
  33. Assert.True(session.Advanced.HasChanges);
  34. var whatChanged = session.Advanced.WhatChanged();
  35. Assert.Equal("AddressId", whatChanged["users/1"][0].FieldName);
  36. Assert.Equal(null, whatChanged["users/1"][0].FieldOldValue);
  37. Assert.True(whatChanged["users/1"][0].FieldNewValue.Equals("addresses/1"));
  38. session.Advanced.Clear();
  39. Assert.False(session.Advanced.HasChanges);
  40. var user2 = new User { Id = "users/2", Name = "John" };
  41. session.Store(user2);
  42. session.Delete(user2);
  43. Assert.True(session.Advanced.HasChanged(user2));
  44. Assert.True(session.Advanced.HasChanges);
  45. }
  46. }
  47. }
  48. [Fact]
  49. public void CanUseEvict()
  50. {
  51. using (var store = GetDocumentStore())
  52. {
  53. using (var session = store.OpenSession())
  54. {
  55. var user = new User { Id = "users/1", Name = "John" };
  56. session.Store(user);
  57. session.SaveChanges();
  58. }
  59. using (var session = store.OpenSession())
  60. {
  61. Assert.Equal(0, session.Advanced.NumberOfRequests);
  62. session.Load<User>("users/1");
  63. Assert.Equal(1, session.Advanced.NumberOfRequests);
  64. var user = session.Load<User>("users/1");
  65. Assert.Equal(1, session.Advanced.NumberOfRequests);
  66. session.Advanced.Evict(user);
  67. session.Load<User>("users/1");
  68. Assert.Equal(2, session.Advanced.NumberOfRequests);
  69. }
  70. }
  71. }
  72. [Fact]
  73. public void CanUseClear()
  74. {
  75. using (var store = GetDocumentStore())
  76. {
  77. using (var session = store.OpenSession())
  78. {
  79. var user = new User { Id = "users/1", Name = "John" };
  80. session.Store(user);
  81. session.SaveChanges();
  82. }
  83. using (var session = store.OpenSession())
  84. {
  85. Assert.Equal(0, session.Advanced.NumberOfRequests);
  86. session.Load<User>("users/1");
  87. Assert.Equal(1, session.Advanced.NumberOfRequests);
  88. session.Load<User>("users/1");
  89. Assert.Equal(1, session.Advanced.NumberOfRequests);
  90. session.Advanced.Clear();
  91. session.Load<User>("users/1");
  92. Assert.Equal(2, session.Advanced.NumberOfRequests);
  93. }
  94. }
  95. }
  96. [Fact]
  97. public void CanUseIsLoaded()
  98. {
  99. using (var store = GetDocumentStore())
  100. {
  101. using (var session = store.OpenSession())
  102. {
  103. var user = new User { Id = "users/1", Name = "John" };
  104. session.Store(user);
  105. session.SaveChanges();
  106. }
  107. using (var session = store.OpenSession())
  108. {
  109. Assert.False(session.Advanced.IsLoaded("users/1"));
  110. session.Load<User>("users/1");
  111. Assert.True(session.Advanced.IsLoaded("users/1"));
  112. Assert.False(session.Advanced.IsLoaded("users/2"));
  113. session.Advanced.Clear();
  114. Assert.False(session.Advanced.IsLoaded("users/1"));
  115. }
  116. }
  117. }
  118. [Fact]
  119. public void CanUseRefresh()
  120. {
  121. using (var store = GetDocumentStore())
  122. {
  123. using (var session = store.OpenSession())
  124. {
  125. var user = new User { Id = "users/1", Name = "John" };
  126. session.Store(user);
  127. session.SaveChanges();
  128. }
  129. using (var session = store.OpenSession())
  130. {
  131. var user = session.Load<User>("users/1");
  132. Assert.NotNull(user);
  133. Assert.Equal("John", user.Name);
  134. using (var otherSession = store.OpenSession())
  135. {
  136. var u = otherSession.Load<User>("users/1");
  137. u.Name = "Jonathan";
  138. otherSession.SaveChanges();
  139. }
  140. using (var otherSession = store.OpenSession())
  141. {
  142. var u = otherSession.Load<User>("users/1");
  143. Assert.Equal("Jonathan", u.Name);
  144. }
  145. user = session.Load<User>("users/1");
  146. Assert.NotNull(user);
  147. Assert.Equal("John", user.Name);
  148. session.Advanced.Refresh(user);
  149. Assert.NotNull(user);
  150. Assert.Equal("Jonathan", user.Name);
  151. }
  152. }
  153. }
  154. [Fact]
  155. public void CanUseOptmisticConcurrency()
  156. {
  157. const string entityId = "users/1";
  158. using (var store = GetDocumentStore())
  159. {
  160. using (var session = store.OpenSession())
  161. {
  162. Assert.False(session.Advanced.UseOptimisticConcurrency);
  163. session.Advanced.UseOptimisticConcurrency = true;
  164. session.Store(new User { Id = entityId, Name = "User1" });
  165. session.SaveChanges();
  166. using (var otherSession = store.OpenSession())
  167. {
  168. var otherUser = otherSession.Load<User>(entityId);
  169. otherUser.Name = "OtherName";
  170. otherSession.Store(otherUser);
  171. otherSession.SaveChanges();
  172. }
  173. var user = session.Load<User>("users/1");
  174. user.Name = "Name";
  175. session.Store(user);
  176. var e = Assert.Throws<ConcurrencyException>(() => session.SaveChanges());
  177. Assert.Contains($"Optimistic concurrency violation, transaction will be aborted.", e.Message);
  178. }
  179. }
  180. }
  181. [Fact]
  182. public void CanGetDocumentMetadata()
  183. {
  184. const string companyId = "companies/1";
  185. const string attrKey = "SetDocumentMetadataTestKey";
  186. const string attrVal = "SetDocumentMetadataTestValue";
  187. using (var store = GetDocumentStore())
  188. {
  189. using (var commands = store.Commands())
  190. {
  191. commands.Put(companyId, null, new Company { Id = companyId }, new Dictionary<string, object> { { attrKey, attrVal } });
  192. }
  193. using (var session = store.OpenSession())
  194. {
  195. var company = session.Load<Company>(companyId);
  196. var result = session.Advanced.GetMetadataFor(company);
  197. Assert.NotNull(result);
  198. Assert.Equal(attrVal, result[attrKey]);
  199. }
  200. }
  201. }
  202. [Fact]
  203. public void CanUseNumberOfRequests()
  204. {
  205. using (var store = GetDocumentStore())
  206. {
  207. using (var session = store.OpenSession())
  208. {
  209. Assert.Equal(0, session.Advanced.NumberOfRequests);
  210. var company = new Company();
  211. company.Name = "NumberOfRequestsTest";
  212. session.Store(company);
  213. session.SaveChanges();
  214. Assert.Equal(1, session.Advanced.NumberOfRequests);
  215. var company2 = session.Load<Company>(company.Id);
  216. company2.Name = "NumberOfRequestsTest2";
  217. session.Store(company2);
  218. session.SaveChanges();
  219. Assert.Equal(2, session.Advanced.NumberOfRequests);
  220. }
  221. }
  222. }
  223. [Fact]
  224. public void CanUseMaxNumberOfRequestsPerSession()
  225. {
  226. using (var store = GetDocumentStore())
  227. {
  228. using (var session = store.OpenSession())
  229. {
  230. session.Advanced.MaxNumberOfRequestsPerSession = 2;
  231. var company = new Company();
  232. session.Store(company);
  233. session.SaveChanges();
  234. Assert.Equal(1, session.Advanced.NumberOfRequests);
  235. company.Name = "1";
  236. session.Store(company);
  237. session.SaveChanges();
  238. Assert.Equal(2, session.Advanced.NumberOfRequests);
  239. try
  240. {
  241. company.Name = "2";
  242. session.Store(company);
  243. session.SaveChanges();
  244. Assert.False(true, "I expected InvalidOperationException to be thrown here.");
  245. }
  246. catch (InvalidOperationException)
  247. {
  248. }
  249. }
  250. }
  251. }
  252. [Fact]
  253. public void CanGetEtagFor()
  254. {
  255. using (var store = GetDocumentStore())
  256. {
  257. using (var commands = store.Commands())
  258. {
  259. commands.Put("companies/1", null, new Company { Id = "companies/1" }, null);
  260. }
  261. using (var session = store.OpenSession())
  262. {
  263. var company = session.Load<Company>("companies/1");
  264. Assert.Equal(1, session.Advanced.GetChangeVectorFor(company).ToChangeVector()[0].Etag);
  265. }
  266. }
  267. }
  268. [Fact]
  269. public void CanLazilyLoadEntity()
  270. {
  271. const string COMPANY1_ID = "companies/1";
  272. const string COMPANY2_ID = "companies/2";
  273. using (var store = GetDocumentStore())
  274. {
  275. using (var commands = store.Commands())
  276. {
  277. commands.Put(COMPANY1_ID, null, new Company { Id = COMPANY1_ID }, null);
  278. commands.Put(COMPANY2_ID, null, new Company { Id = COMPANY2_ID }, null);
  279. }
  280. using (var session = store.OpenSession())
  281. {
  282. Lazy<Company> lazyOrder = session.Advanced.Lazily.Load<Company>(COMPANY1_ID);
  283. Assert.False(lazyOrder.IsValueCreated);
  284. var order = lazyOrder.Value;
  285. Assert.Equal(COMPANY1_ID, order.Id);
  286. var lazyOrders = session.Advanced.Lazily.Load<Company>(new[] { COMPANY1_ID, COMPANY2_ID });
  287. Assert.False(lazyOrders.IsValueCreated);
  288. var orders = lazyOrders.Value;
  289. Assert.Equal(2, orders.Count);
  290. Assert.Equal(COMPANY1_ID, orders[COMPANY1_ID].Id);
  291. Assert.Equal(COMPANY2_ID, orders[COMPANY2_ID].Id);
  292. }
  293. }
  294. }
  295. [Fact]
  296. public void CanExecuteAllPendingLazyOperations()
  297. {
  298. const string COMPANY1_ID = "companies/1";
  299. const string COMPANY2_ID = "companies/2";
  300. using (var store = GetDocumentStore())
  301. {
  302. using (var commands = store.Commands())
  303. {
  304. commands.Put(COMPANY1_ID, null, new Company { Id = COMPANY1_ID }, null);
  305. commands.Put(COMPANY2_ID, null, new Company { Id = COMPANY2_ID }, null);
  306. }
  307. using (var session = store.OpenSession())
  308. {
  309. Company company1 = null;
  310. Company company2 = null;
  311. session.Advanced.Lazily.Load<Company>(COMPANY1_ID, x => company1 = x);
  312. session.Advanced.Lazily.Load<Company>(COMPANY2_ID, x => company2 = x);
  313. Assert.Null(company1);
  314. Assert.Null(company2);
  315. session.Advanced.Eagerly.ExecuteAllPendingLazyOperations();
  316. Assert.NotNull(company1);
  317. Assert.NotNull(company2);
  318. Assert.Equal(COMPANY1_ID, company1.Id);
  319. Assert.Equal(COMPANY2_ID, company2.Id);
  320. }
  321. }
  322. }
  323. [Fact]
  324. public void CanUseDefer()
  325. {
  326. using (var store = GetDocumentStore())
  327. {
  328. using (var session = store.OpenSession())
  329. {
  330. var commands = new ICommandData[]
  331. {
  332. new PutCommandData("company1", null, new DynamicJsonValue { ["Name"] = "company 1" }),
  333. new PutCommandData("company2", null, new DynamicJsonValue { ["Name"] = "company 2" })
  334. };
  335. session.Advanced.Defer(commands);
  336. session.Advanced.Defer(new DeleteCommandData("company1", null));
  337. session.SaveChanges();
  338. Assert.Null(session.Load<Company>("company1"));
  339. Assert.NotNull(session.Load<Company>("company2"));
  340. }
  341. }
  342. }
  343. [Fact]
  344. public void CanAggressivelyCacheFor()
  345. {
  346. using (var store = GetDocumentStore())
  347. {
  348. using (var session = store.OpenSession())
  349. {
  350. session.Store(new User { Id = "users/1", Name = "Name" });
  351. session.SaveChanges();
  352. }
  353. using (var session = store.OpenSession())
  354. {
  355. Assert.Equal(0, session.Advanced.NumberOfRequests);
  356. session.Load<User>("users/1");
  357. Assert.Equal(1, session.Advanced.RequestExecutor.Cache.NumberOfItems);
  358. Assert.Equal(1, session.Advanced.NumberOfRequests);
  359. }
  360. using (var session = store.OpenSession())
  361. {
  362. session.Load<User>("users/1");
  363. Assert.Equal(1, session.Advanced.RequestExecutor.Cache.NumberOfItems);
  364. Assert.Equal(1, session.Advanced.NumberOfRequests);
  365. for (var i = 0; i <= 20; i++)
  366. {
  367. using (store.AggressivelyCacheFor(TimeSpan.FromSeconds(30)))
  368. {
  369. session.Load<User>("users/1");
  370. }
  371. }
  372. Assert.Equal(1, session.Advanced.NumberOfRequests);
  373. }
  374. }
  375. }
  376. }
  377. }