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

118 строки
4.1KB

  1. using CartWise.Application.Services;
  2. using CartWise.Infrastructure.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace CartWise.Application.Tests;
  5. public class PurchaseServiceTests : IDisposable
  6. {
  7. private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc);
  8. private readonly CartWiseDbContext _db;
  9. private readonly PurchaseService _sut;
  10. public PurchaseServiceTests()
  11. {
  12. var options = new DbContextOptionsBuilder<CartWiseDbContext>()
  13. .UseInMemoryDatabase(Guid.NewGuid().ToString())
  14. .Options;
  15. _db = new CartWiseDbContext(options);
  16. _sut = new PurchaseService(_db, TimeProvider.System);
  17. }
  18. public void Dispose()
  19. {
  20. _db.Dispose();
  21. GC.SuppressFinalize(this);
  22. }
  23. [Fact]
  24. public async Task StartPurchaseAsync_CreatesPurchase()
  25. {
  26. var householdId = Guid.NewGuid();
  27. var result = await _sut.StartPurchaseAsync(householdId, "user-1", Now);
  28. Assert.True(result.IsSuccess);
  29. Assert.Equal(householdId, result.Value!.HouseholdId);
  30. Assert.False(result.Value.IsCompleted);
  31. }
  32. [Fact]
  33. public async Task AddPurchaseItemAsync_AddsItemAndPersistsIt()
  34. {
  35. var started = await _sut.StartPurchaseAsync(Guid.NewGuid(), "user-1", Now);
  36. var result = await _sut.AddPurchaseItemAsync(started.Value!.HouseholdId, started.Value.PurchaseId, "Milk", 3.99m);
  37. Assert.True(result.IsSuccess);
  38. Assert.Equal("Milk", result.Value!.Description);
  39. var reloaded = await _sut.GetPurchaseAsync(started.Value.HouseholdId, started.Value.PurchaseId);
  40. Assert.Single(reloaded!.Items);
  41. }
  42. [Fact]
  43. public async Task AddPurchaseItemAsync_FailsForPurchaseInAnotherHousehold()
  44. {
  45. var started = await _sut.StartPurchaseAsync(Guid.NewGuid(), "user-1", Now);
  46. var result = await _sut.AddPurchaseItemAsync(Guid.NewGuid(), started.Value!.PurchaseId, "Milk", 3.99m);
  47. Assert.False(result.IsSuccess);
  48. }
  49. [Fact]
  50. public async Task AddPurchaseItemAsync_FailsWhenPurchaseAlreadyCompleted()
  51. {
  52. var started = await _sut.StartPurchaseAsync(Guid.NewGuid(), "user-1", Now);
  53. await _sut.AddPurchaseItemAsync(started.Value!.HouseholdId, started.Value.PurchaseId, "Milk", 3.99m);
  54. await _sut.CompletePurchaseAsync(started.Value.HouseholdId, started.Value.PurchaseId);
  55. var result = await _sut.AddPurchaseItemAsync(started.Value.HouseholdId, started.Value.PurchaseId, "Bread", 2.5m);
  56. Assert.False(result.IsSuccess);
  57. }
  58. [Fact]
  59. public async Task CompletePurchaseAsync_ComputesSubtotalAndTotal()
  60. {
  61. var started = await _sut.StartPurchaseAsync(Guid.NewGuid(), "user-1", Now);
  62. await _sut.AddPurchaseItemAsync(started.Value!.HouseholdId, started.Value.PurchaseId, "Milk", 3.99m);
  63. await _sut.AddPurchaseItemAsync(started.Value.HouseholdId, started.Value.PurchaseId, "Bread", 2.50m);
  64. var result = await _sut.CompletePurchaseAsync(started.Value.HouseholdId, started.Value.PurchaseId, tax: 0.50m);
  65. Assert.True(result.IsSuccess);
  66. Assert.Equal(6.49m, result.Value!.Subtotal);
  67. Assert.Equal(0.50m, result.Value.Tax);
  68. Assert.Equal(6.99m, result.Value.Total);
  69. }
  70. [Fact]
  71. public async Task CompletePurchaseAsync_FailsForPurchaseInAnotherHousehold()
  72. {
  73. var started = await _sut.StartPurchaseAsync(Guid.NewGuid(), "user-1", Now);
  74. var result = await _sut.CompletePurchaseAsync(Guid.NewGuid(), started.Value!.PurchaseId);
  75. Assert.False(result.IsSuccess);
  76. }
  77. [Fact]
  78. public async Task GetHouseholdPurchasesAsync_ReturnsOnlyThatHouseholdsPurchasesNewestFirst()
  79. {
  80. var householdA = Guid.NewGuid();
  81. var householdB = Guid.NewGuid();
  82. await _sut.StartPurchaseAsync(householdA, "user-1", Now.AddDays(-1));
  83. await _sut.StartPurchaseAsync(householdA, "user-1", Now);
  84. await _sut.StartPurchaseAsync(householdB, "user-2", Now);
  85. var results = await _sut.GetHouseholdPurchasesAsync(householdA);
  86. Assert.Equal(2, results.Count);
  87. Assert.True(results[0].PurchasedUtc >= results[1].PurchasedUtc);
  88. }
  89. }

Powered by TurnKey Linux.