using CartWise.Domain.Entities; using CartWise.Domain.Enums; namespace CartWise.Domain.Tests; public class HouseholdTests { private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc); [Fact] public void Constructor_CreatesOwnerMembershipForCreator() { var household = new Household("The Smiths", "user-1", Now); var member = Assert.Single(household.Members); Assert.Equal("user-1", member.UserId); Assert.Equal(HouseholdRole.Owner, member.Role); Assert.Equal(household.HouseholdId, member.HouseholdId); Assert.Equal(Now, member.JoinedUtc); } [Fact] public void Constructor_TrimsName() { var household = new Household(" The Smiths ", "user-1", Now); Assert.Equal("The Smiths", household.Name); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenNameIsMissing(string? name) { Assert.Throws(() => new Household(name!, "user-1", Now)); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenCreatedByUserIdIsMissing(string? userId) { Assert.Throws(() => new Household("The Smiths", userId!, Now)); } [Fact] public void AddMember_AddsMemberWithGivenRole() { var household = new Household("The Smiths", "user-1", Now); var member = household.AddMember("user-2", HouseholdRole.Member, Now); Assert.Equal(2, household.Members.Count); Assert.Equal("user-2", member.UserId); Assert.Equal(HouseholdRole.Member, member.Role); } [Fact] public void AddMember_ThrowsWhenUserIsAlreadyAMember() { var household = new Household("The Smiths", "user-1", Now); Assert.Throws(() => household.AddMember("user-1", HouseholdRole.Member, Now)); } [Fact] public void IsMember_ReturnsTrueForExistingMemberAndFalseOtherwise() { var household = new Household("The Smiths", "user-1", Now); Assert.True(household.IsMember("user-1")); Assert.False(household.IsMember("user-2")); } }