using CartWise.Domain.Entities; using CartWise.Domain.Enums; namespace CartWise.Domain.Tests; public class PurchaseTests { private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc); [Fact] public void Constructor_DefaultsToManualSourceAndNoStore() { var purchase = new Purchase(Guid.NewGuid(), "user-1", Now, Now); Assert.Equal(PurchaseSourceType.Manual, purchase.SourceType); Assert.Null(purchase.StoreLocationId); Assert.Empty(purchase.Items); } [Fact] public void Constructor_ThrowsWhenHouseholdIdIsEmpty() { Assert.Throws(() => new Purchase(Guid.Empty, "user-1", Now, Now)); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenPurchasedByUserIdIsMissing(string? userId) { Assert.Throws(() => new Purchase(Guid.NewGuid(), userId!, Now, Now)); } } public class PurchaseItemTests { private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc); [Fact] public void Constructor_DefaultsQuantityToOne() { var item = new PurchaseItem(Guid.NewGuid(), "Milk", 3.99m, Now); Assert.Equal(1m, item.Quantity); Assert.Equal(3.99m, item.LinePrice); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenDescriptionIsMissing(string? description) { Assert.Throws(() => new PurchaseItem(Guid.NewGuid(), description!, 3.99m, Now)); } [Fact] public void Constructor_ThrowsWhenQuantityIsZeroOrNegative() { Assert.Throws(() => new PurchaseItem(Guid.NewGuid(), "Milk", 3.99m, Now, quantity: 0)); Assert.Throws(() => new PurchaseItem(Guid.NewGuid(), "Milk", 3.99m, Now, quantity: -1)); } [Fact] public void Constructor_ThrowsWhenLinePriceIsNegative() { Assert.Throws(() => new PurchaseItem(Guid.NewGuid(), "Milk", -1m, Now)); } }