No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

124 líneas
3.7KB

  1. using CartWise.Domain.Entities;
  2. using CartWise.Domain.Enums;
  3. namespace CartWise.Domain.Tests;
  4. public class PurchaseTests
  5. {
  6. private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc);
  7. [Fact]
  8. public void Constructor_DefaultsToManualSourceAndNoStore()
  9. {
  10. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  11. Assert.Equal(PurchaseSourceType.Manual, purchase.SourceType);
  12. Assert.Null(purchase.StoreLocationId);
  13. Assert.Empty(purchase.Items);
  14. Assert.False(purchase.IsCompleted);
  15. }
  16. [Fact]
  17. public void Constructor_ThrowsWhenHouseholdIdIsEmpty()
  18. {
  19. Assert.Throws<ArgumentException>(() => new Purchase(Guid.Empty, "user-1", Now, Now));
  20. }
  21. [Theory]
  22. [InlineData("")]
  23. [InlineData(" ")]
  24. [InlineData(null)]
  25. public void Constructor_ThrowsWhenPurchasedByUserIdIsMissing(string? userId)
  26. {
  27. Assert.Throws<ArgumentException>(() => new Purchase(Guid.NewGuid(), userId!, Now, Now));
  28. }
  29. [Fact]
  30. public void AddItem_DefaultsQuantityToOne()
  31. {
  32. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  33. var item = purchase.AddItem("Milk", 3.99m, Now);
  34. Assert.Equal(1m, item.Quantity);
  35. Assert.Equal(3.99m, item.LinePrice);
  36. Assert.Single(purchase.Items);
  37. }
  38. [Theory]
  39. [InlineData("")]
  40. [InlineData(" ")]
  41. [InlineData(null)]
  42. public void AddItem_ThrowsWhenDescriptionIsMissing(string? description)
  43. {
  44. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  45. Assert.Throws<ArgumentException>(() => purchase.AddItem(description!, 3.99m, Now));
  46. }
  47. [Fact]
  48. public void AddItem_ThrowsWhenQuantityIsZeroOrNegative()
  49. {
  50. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  51. Assert.Throws<ArgumentOutOfRangeException>(() => purchase.AddItem("Milk", 3.99m, Now, quantity: 0));
  52. Assert.Throws<ArgumentOutOfRangeException>(() => purchase.AddItem("Milk", 3.99m, Now, quantity: -1));
  53. }
  54. [Fact]
  55. public void AddItem_ThrowsWhenLinePriceIsNegative()
  56. {
  57. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  58. Assert.Throws<ArgumentOutOfRangeException>(() => purchase.AddItem("Milk", -1m, Now));
  59. }
  60. [Fact]
  61. public void AddItem_ThrowsOnCompletedPurchase()
  62. {
  63. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  64. purchase.AddItem("Milk", 3.99m, Now);
  65. purchase.Complete();
  66. Assert.Throws<InvalidOperationException>(() => purchase.AddItem("Bread", 2.5m, Now));
  67. }
  68. [Fact]
  69. public void Complete_SumsLinePricesIntoSubtotalAndTotal()
  70. {
  71. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  72. purchase.AddItem("Milk", 3.99m, Now);
  73. purchase.AddItem("Bread", 2.50m, Now);
  74. purchase.Complete();
  75. Assert.Equal(6.49m, purchase.Subtotal);
  76. Assert.Equal(6.49m, purchase.Total);
  77. Assert.Null(purchase.Tax);
  78. Assert.True(purchase.IsCompleted);
  79. }
  80. [Fact]
  81. public void Complete_AddsTaxToTotalWhenProvided()
  82. {
  83. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  84. purchase.AddItem("Milk", 10m, Now);
  85. purchase.Complete(tax: 0.80m);
  86. Assert.Equal(10m, purchase.Subtotal);
  87. Assert.Equal(0.80m, purchase.Tax);
  88. Assert.Equal(10.80m, purchase.Total);
  89. }
  90. [Fact]
  91. public void Complete_ThrowsWhenAlreadyCompleted()
  92. {
  93. var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now);
  94. purchase.AddItem("Milk", 3.99m, Now);
  95. purchase.Complete();
  96. Assert.Throws<InvalidOperationException>(() => purchase.Complete());
  97. }
  98. }

Powered by TurnKey Linux.