Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

225 строки
7.0KB

  1. using CartWise.Application.Services;
  2. using CartWise.Infrastructure.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace CartWise.Application.Tests;
  5. public class ShoppingListServiceTests : IDisposable
  6. {
  7. private readonly CartWiseDbContext _db;
  8. private readonly ShoppingListService _sut;
  9. public ShoppingListServiceTests()
  10. {
  11. var options = new DbContextOptionsBuilder<CartWiseDbContext>()
  12. .UseInMemoryDatabase(Guid.NewGuid().ToString())
  13. .Options;
  14. _db = new CartWiseDbContext(options);
  15. _sut = new ShoppingListService(_db, TimeProvider.System);
  16. }
  17. public void Dispose()
  18. {
  19. _db.Dispose();
  20. GC.SuppressFinalize(this);
  21. }
  22. [Fact]
  23. public async Task CreateListAsync_CreatesActiveList()
  24. {
  25. var householdId = Guid.NewGuid();
  26. var result = await _sut.CreateListAsync(householdId, "Groceries", "user-1");
  27. Assert.True(result.IsSuccess);
  28. Assert.Equal("Groceries", result.Value!.Name);
  29. Assert.Equal(householdId, result.Value.HouseholdId);
  30. }
  31. [Fact]
  32. public async Task CreateListAsync_FailsWhenHouseholdAlreadyHasAnActiveList()
  33. {
  34. var householdId = Guid.NewGuid();
  35. await _sut.CreateListAsync(householdId, "Groceries", "user-1");
  36. var result = await _sut.CreateListAsync(householdId, "Second List", "user-1");
  37. Assert.False(result.IsSuccess);
  38. Assert.NotNull(result.Error);
  39. }
  40. [Fact]
  41. public async Task CreateListAsync_FailsWhenNameIsMissing()
  42. {
  43. var result = await _sut.CreateListAsync(Guid.NewGuid(), " ", "user-1");
  44. Assert.False(result.IsSuccess);
  45. }
  46. [Fact]
  47. public async Task GetActiveListAsync_ReturnsNullWhenHouseholdHasNoList()
  48. {
  49. var list = await _sut.GetActiveListAsync(Guid.NewGuid());
  50. Assert.Null(list);
  51. }
  52. [Fact]
  53. public async Task GetActiveListAsync_ReturnsTheActiveList()
  54. {
  55. var householdId = Guid.NewGuid();
  56. var created = await _sut.CreateListAsync(householdId, "Groceries", "user-1");
  57. var list = await _sut.GetActiveListAsync(householdId);
  58. Assert.NotNull(list);
  59. Assert.Equal(created.Value!.ShoppingListId, list!.ShoppingListId);
  60. }
  61. [Fact]
  62. public async Task GetActiveListAsync_DoesNotReturnAnotherHouseholdsList()
  63. {
  64. var householdA = Guid.NewGuid();
  65. var householdB = Guid.NewGuid();
  66. await _sut.CreateListAsync(householdA, "Household A's List", "user-1");
  67. var list = await _sut.GetActiveListAsync(householdB);
  68. Assert.Null(list);
  69. }
  70. [Fact]
  71. public async Task AddItemAsync_AddsItemAndPersistsIt()
  72. {
  73. var created = await _sut.CreateListAsync(Guid.NewGuid(), "Groceries", "user-1");
  74. var result = await _sut.AddItemAsync(created.Value!.ShoppingListId, "Milk", 2m, "gal", "user-1");
  75. Assert.True(result.IsSuccess);
  76. Assert.Equal("Milk", result.Value!.DisplayName);
  77. var reloaded = await _sut.GetActiveListAsync(created.Value.HouseholdId);
  78. Assert.Single(reloaded!.Items);
  79. Assert.Equal("Milk", reloaded.Items.Single().DisplayName);
  80. }
  81. [Fact]
  82. public async Task AddItemAsync_FailsWhenListDoesNotExist()
  83. {
  84. var result = await _sut.AddItemAsync(Guid.NewGuid(), "Milk", null, null, "user-1");
  85. Assert.False(result.IsSuccess);
  86. }
  87. [Fact]
  88. public async Task AddItemAsync_FailsWhenDisplayNameIsMissing()
  89. {
  90. var created = await _sut.CreateListAsync(Guid.NewGuid(), "Groceries", "user-1");
  91. var result = await _sut.AddItemAsync(created.Value!.ShoppingListId, " ", null, null, "user-1");
  92. Assert.False(result.IsSuccess);
  93. }
  94. [Fact]
  95. public async Task TogglePurchasedAsync_MarksItemPurchased()
  96. {
  97. var (householdId, item) = await CreateItemAsync();
  98. var result = await _sut.TogglePurchasedAsync(householdId, item.ShoppingListItemId, item.RowVersion);
  99. Assert.True(result.IsSuccess);
  100. Assert.Equal(Domain.Enums.ShoppingListItemStatus.Purchased, result.Value!.Status);
  101. }
  102. [Fact]
  103. public async Task TogglePurchasedAsync_FailsForItemInAnotherHousehold()
  104. {
  105. var (_, item) = await CreateItemAsync();
  106. var result = await _sut.TogglePurchasedAsync(Guid.NewGuid(), item.ShoppingListItemId, item.RowVersion);
  107. Assert.False(result.IsSuccess);
  108. }
  109. [Fact]
  110. public async Task TogglePurchasedAsync_FailsOnConcurrencyConflict()
  111. {
  112. var (householdId, item) = await CreateItemAsync();
  113. var staleRowVersion = Guid.NewGuid();
  114. var result = await _sut.TogglePurchasedAsync(householdId, item.ShoppingListItemId, staleRowVersion);
  115. Assert.False(result.IsSuccess);
  116. Assert.NotNull(result.Error);
  117. }
  118. [Fact]
  119. public async Task ToggleSkippedAsync_MarksItemSkipped()
  120. {
  121. var (householdId, item) = await CreateItemAsync();
  122. var result = await _sut.ToggleSkippedAsync(householdId, item.ShoppingListItemId, item.RowVersion);
  123. Assert.True(result.IsSuccess);
  124. Assert.Equal(Domain.Enums.ShoppingListItemStatus.Skipped, result.Value!.Status);
  125. }
  126. [Fact]
  127. public async Task ToggleSkippedAsync_UnskipsOnSecondCall()
  128. {
  129. var (householdId, item) = await CreateItemAsync();
  130. var firstResult = await _sut.ToggleSkippedAsync(householdId, item.ShoppingListItemId, item.RowVersion);
  131. var secondResult = await _sut.ToggleSkippedAsync(householdId, item.ShoppingListItemId, firstResult.Value!.RowVersion);
  132. Assert.True(secondResult.IsSuccess);
  133. Assert.Equal(Domain.Enums.ShoppingListItemStatus.Needed, secondResult.Value!.Status);
  134. }
  135. [Fact]
  136. public async Task DeleteItemAsync_RemovesItemFromList()
  137. {
  138. var (householdId, item) = await CreateItemAsync();
  139. var result = await _sut.DeleteItemAsync(householdId, item.ShoppingListItemId, item.RowVersion);
  140. Assert.True(result.IsSuccess);
  141. var list = await _sut.GetActiveListAsync(householdId);
  142. Assert.Empty(list!.Items);
  143. }
  144. [Fact]
  145. public async Task DeleteItemAsync_FailsForItemInAnotherHousehold()
  146. {
  147. var (_, item) = await CreateItemAsync();
  148. var result = await _sut.DeleteItemAsync(Guid.NewGuid(), item.ShoppingListItemId, item.RowVersion);
  149. Assert.False(result.IsSuccess);
  150. }
  151. [Fact]
  152. public async Task DeleteItemAsync_FailsOnConcurrencyConflict()
  153. {
  154. var (householdId, item) = await CreateItemAsync();
  155. var staleRowVersion = Guid.NewGuid();
  156. var result = await _sut.DeleteItemAsync(householdId, item.ShoppingListItemId, staleRowVersion);
  157. Assert.False(result.IsSuccess);
  158. var list = await _sut.GetActiveListAsync(householdId);
  159. Assert.Single(list!.Items);
  160. }
  161. private async Task<(Guid HouseholdId, Domain.Entities.ShoppingListItem Item)> CreateItemAsync()
  162. {
  163. var householdId = Guid.NewGuid();
  164. var list = await _sut.CreateListAsync(householdId, "Groceries", "user-1");
  165. var item = await _sut.AddItemAsync(list.Value!.ShoppingListId, "Milk", null, null, "user-1");
  166. return (householdId, item.Value!);
  167. }
  168. }

Powered by TurnKey Linux.