You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
3.6KB

  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. }

Powered by TurnKey Linux.