using CartWise.Domain.Entities; using CartWise.Domain.Enums; namespace CartWise.Domain.Tests; public class ProductTests { private static readonly DateTime Now = new(2026, 8, 10, 12, 0, 0, DateTimeKind.Utc); [Fact] public void Constructor_SetsNormalizedName() { var product = new Product("Jif Creamy Peanut Butter", ProductSourceType.Manual, Now); Assert.Equal("JIF CREAMY PEANUT BUTTER", product.NormalizedName); } [Theory] [InlineData("")] [InlineData(" ")] [InlineData(null)] public void Constructor_ThrowsWhenNameIsMissing(string? name) { Assert.Throws(() => new Product(name!, ProductSourceType.Manual, Now)); } [Fact] public void AddIdentifier_AddsNormalizedIdentifier() { var product = new Product("Jif Creamy 16 oz", ProductSourceType.Manual, Now); var identifier = product.AddIdentifier(ProductIdentifierType.UpcA, " 051500255516 "); Assert.Single(product.Identifiers); Assert.Equal("051500255516", identifier.NormalizedValue); Assert.Equal(product.ProductId, identifier.ProductId); } [Fact] public void AddIdentifier_ThrowsForDuplicateIdentifier() { var product = new Product("Jif Creamy 16 oz", ProductSourceType.Manual, Now); product.AddIdentifier(ProductIdentifierType.UpcA, "051500255516"); Assert.Throws(() => product.AddIdentifier(ProductIdentifierType.UpcA, "051500255516")); } [Fact] public void AddIdentifier_AllowsSameValueUnderDifferentType() { var product = new Product("Jif Creamy 16 oz", ProductSourceType.Manual, Now); product.AddIdentifier(ProductIdentifierType.UpcA, "051500255516"); var identifier = product.AddIdentifier(ProductIdentifierType.Gtin, "051500255516"); Assert.Equal(2, product.Identifiers.Count); Assert.Equal(ProductIdentifierType.Gtin, identifier.IdentifierType); } }