using CartWise.Domain.Entities; using CartWise.Domain.Enums; namespace CartWise.Domain.Tests; public class ShoppingListTests { private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc); [Fact] public void Constructor_CreatesActiveListWithNoItems() { var list = new ShoppingList(Guid.NewGuid(), "Groceries", "user-1", Now); Assert.Equal(ShoppingListStatus.Active, list.Status); Assert.Empty(list.Items); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenNameIsMissing(string? name) { Assert.Throws(() => new ShoppingList(Guid.NewGuid(), name!, "user-1", Now)); } [Fact] public void Constructor_ThrowsWhenHouseholdIdIsEmpty() { Assert.Throws(() => new ShoppingList(Guid.Empty, "Groceries", "user-1", Now)); } [Fact] public void AddItem_AddsItemWithNeededStatusAndZeroSortOrder() { var list = new ShoppingList(Guid.NewGuid(), "Groceries", "user-1", Now); var item = list.AddItem("Milk", 2m, "gal", "user-1", Now); Assert.Single(list.Items); Assert.Equal("Milk", item.DisplayName); Assert.Equal(ShoppingListItemStatus.Needed, item.Status); Assert.Equal(0, item.SortOrder); Assert.Equal(list.ShoppingListId, item.ShoppingListId); } [Fact] public void AddItem_AssignsIncrementingSortOrder() { var list = new ShoppingList(Guid.NewGuid(), "Groceries", "user-1", Now); var first = list.AddItem("Milk", null, null, "user-1", Now); var second = list.AddItem("Bread", null, null, "user-1", Now); Assert.Equal(0, first.SortOrder); Assert.Equal(1, second.SortOrder); } [Fact] public void AddItem_DoesNotRequireQuantityOrUnit() { var list = new ShoppingList(Guid.NewGuid(), "Groceries", "user-1", Now); var item = list.AddItem("Milk", null, null, "user-1", Now); Assert.Null(item.Quantity); Assert.Null(item.Unit); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void AddItem_ThrowsWhenDisplayNameIsMissing(string? displayName) { var list = new ShoppingList(Guid.NewGuid(), "Groceries", "user-1", Now); Assert.Throws(() => list.AddItem(displayName!, null, null, "user-1", Now)); } }