DbContextExtTest.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using Microsoft.EntityFrameworkCore;
  6. using Xunit;
  7. using Masuit.Tools.Core;
  8. public class TestEntity
  9. {
  10. public int Id { get; set; }
  11. public string Name { get; set; }
  12. }
  13. public class TestDbContext : DbContext
  14. {
  15. public DbSet<TestEntity> TestEntities { get; set; }
  16. public TestDbContext(DbContextOptions<TestDbContext> options) : base(options)
  17. {
  18. }
  19. }
  20. public class DbContextExtTests
  21. {
  22. private DbContextOptions<TestDbContext> CreateNewContextOptions()
  23. {
  24. var builder = new DbContextOptionsBuilder<TestDbContext>();
  25. builder.UseInMemoryDatabase(Guid.NewGuid().ToString());
  26. return builder.Options;
  27. }
  28. [Fact]
  29. public void GetAllChanges_ShouldReturnAllChanges()
  30. {
  31. // Arrange
  32. var options = CreateNewContextOptions();
  33. using var context = new TestDbContext(options);
  34. var entity1 = new TestEntity { Name = "Original" };
  35. var entity2 = new TestEntity { Name = "New" };
  36. context.TestEntities.Add(entity1);
  37. context.TestEntities.Add(entity2);
  38. context.SaveChanges();
  39. entity1.Name = "Modified";
  40. context.TestEntities.Update(entity1);
  41. context.TestEntities.Remove(entity2);
  42. // Act
  43. var allChanges = context.GetAllChanges<TestEntity>().ToList();
  44. // Assert
  45. Assert.Equal(2, allChanges.Count);
  46. Assert.Contains(allChanges, e => e.EntityState == EntityState.Modified);
  47. Assert.Contains(allChanges, e => e.EntityState == EntityState.Deleted);
  48. }
  49. [Fact]
  50. public async Task ToListWithNoLockAsync_ShouldReturnEntities()
  51. {
  52. // Arrange
  53. var options = CreateNewContextOptions();
  54. using var context = new TestDbContext(options);
  55. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  56. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  57. await context.SaveChangesAsync();
  58. // Act
  59. var entities = await context.TestEntities.ToListWithNoLockAsync();
  60. // Assert
  61. Assert.Equal(2, entities.Count);
  62. }
  63. [Fact]
  64. public void ToListWithNoLock_ShouldReturnEntities()
  65. {
  66. // Arrange
  67. var options = CreateNewContextOptions();
  68. using var context = new TestDbContext(options);
  69. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  70. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  71. context.SaveChanges();
  72. // Act
  73. var entities = context.TestEntities.ToListWithNoLock();
  74. // Assert
  75. Assert.Equal(2, entities.Count);
  76. }
  77. [Fact]
  78. public async Task CountWithNoLockAsync_ShouldReturnCount()
  79. {
  80. // Arrange
  81. var options = CreateNewContextOptions();
  82. using var context = new TestDbContext(options);
  83. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  84. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  85. await context.SaveChangesAsync();
  86. // Act
  87. var count = await context.TestEntities.CountWithNoLockAsync();
  88. // Assert
  89. Assert.Equal(2, count);
  90. }
  91. [Fact]
  92. public void CountWithNoLock_ShouldReturnCount()
  93. {
  94. // Arrange
  95. var options = CreateNewContextOptions();
  96. using var context = new TestDbContext(options);
  97. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  98. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  99. context.SaveChanges();
  100. // Act
  101. var count = context.TestEntities.CountWithNoLock();
  102. // Assert
  103. Assert.Equal(2, count);
  104. }
  105. [Fact]
  106. public async Task AnyWithNoLockAsync_ShouldReturnTrueIfAny()
  107. {
  108. // Arrange
  109. var options = CreateNewContextOptions();
  110. using var context = new TestDbContext(options);
  111. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  112. await context.SaveChangesAsync();
  113. // Act
  114. var any = await context.TestEntities.AnyWithNoLockAsync();
  115. // Assert
  116. Assert.True(any);
  117. }
  118. [Fact]
  119. public void AnyWithNoLock_ShouldReturnTrueIfAny()
  120. {
  121. // Arrange
  122. var options = CreateNewContextOptions();
  123. using var context = new TestDbContext(options);
  124. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  125. context.SaveChanges();
  126. // Act
  127. var any = context.TestEntities.AnyWithNoLock();
  128. // Assert
  129. Assert.True(any);
  130. }
  131. [Fact]
  132. public async Task FirstOrDefaultWithNoLockAsync_ShouldReturnFirstEntity()
  133. {
  134. // Arrange
  135. var options = CreateNewContextOptions();
  136. using var context = new TestDbContext(options);
  137. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  138. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  139. await context.SaveChangesAsync();
  140. // Act
  141. var entity = await context.TestEntities.FirstOrDefaultWithNoLockAsync(e => e.Name == "Entity1");
  142. // Assert
  143. Assert.NotNull(entity);
  144. Assert.Equal("Entity1", entity.Name);
  145. }
  146. [Fact]
  147. public void FirstOrDefaultWithNoLock_ShouldReturnFirstEntity()
  148. {
  149. // Arrange
  150. var options = CreateNewContextOptions();
  151. using var context = new TestDbContext(options);
  152. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  153. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  154. context.SaveChanges();
  155. // Act
  156. var entity = context.TestEntities.FirstOrDefaultWithNoLock(e => e.Name == "Entity1");
  157. // Assert
  158. Assert.NotNull(entity);
  159. Assert.Equal("Entity1", entity.Name);
  160. }
  161. [Fact]
  162. public async Task SingleOrDefaultWithNoLockAsync_ShouldReturnSingleEntity()
  163. {
  164. // Arrange
  165. var options = CreateNewContextOptions();
  166. using var context = new TestDbContext(options);
  167. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  168. await context.SaveChangesAsync();
  169. // Act
  170. var entity = await context.TestEntities.SingleOrDefaultWithNoLockAsync(e => e.Name == "Entity1");
  171. // Assert
  172. Assert.NotNull(entity);
  173. Assert.Equal("Entity1", entity.Name);
  174. }
  175. [Fact]
  176. public void SingleOrDefaultWithNoLock_ShouldReturnSingleEntity()
  177. {
  178. // Arrange
  179. var options = CreateNewContextOptions();
  180. using var context = new TestDbContext(options);
  181. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  182. context.SaveChanges();
  183. // Act
  184. var entity = context.TestEntities.SingleOrDefaultWithNoLock(e => e.Name == "Entity1");
  185. // Assert
  186. Assert.NotNull(entity);
  187. Assert.Equal("Entity1", entity.Name);
  188. }
  189. [Fact]
  190. public async Task AllWithNoLockAsync_ShouldReturnTrueIfAllMatch()
  191. {
  192. // Arrange
  193. var options = CreateNewContextOptions();
  194. using var context = new TestDbContext(options);
  195. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  196. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  197. await context.SaveChangesAsync();
  198. // Act
  199. var all = await context.TestEntities.AllWithNoLockAsync(e => e.Name.StartsWith("Entity"));
  200. // Assert
  201. Assert.True(all);
  202. }
  203. [Fact]
  204. public void AllWithNoLock_ShouldReturnTrueIfAllMatch()
  205. {
  206. // Arrange
  207. var options = CreateNewContextOptions();
  208. using var context = new TestDbContext(options);
  209. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  210. context.TestEntities.Add(new TestEntity { Name = "Entity2" });
  211. context.SaveChanges();
  212. // Act
  213. var all = context.TestEntities.AllWithNoLock(e => e.Name.StartsWith("Entity"));
  214. // Assert
  215. Assert.True(all);
  216. }
  217. [Fact]
  218. public void NoLock_ShouldExecuteWithNoLock()
  219. {
  220. // Arrange
  221. var options = CreateNewContextOptions();
  222. using var context = new TestDbContext(options);
  223. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  224. context.SaveChanges();
  225. // Act
  226. var result = context.NoLock(ctx => ctx.TestEntities.Count());
  227. // Assert
  228. Assert.Equal(1, result);
  229. }
  230. [Fact]
  231. public async Task NoLock_ShouldExecuteWithNoLockAsync()
  232. {
  233. // Arrange
  234. var options = CreateNewContextOptions();
  235. using var context = new TestDbContext(options);
  236. context.TestEntities.Add(new TestEntity { Name = "Entity1" });
  237. await context.SaveChangesAsync();
  238. // Act
  239. var result = await context.NoLock(async ctx => await ctx.TestEntities.CountAsync());
  240. // Assert
  241. Assert.Equal(1, result);
  242. }
  243. }