From ce452e0df4798727b1079bf5225ae47777138056 Mon Sep 17 00:00:00 2001 From: lumijiez <59575049+lumijiez@users.noreply.github.com> Date: Tue, 6 May 2025 14:19:07 +0300 Subject: [PATCH] Add GenerateSku Tests --- .../CreateProductCommandHandler.cs | 2 +- .../Database/ApplicationDbContext.cs | 2 +- .../Printbase.Application.Tests.csproj | 5 + .../CreateProduct/GenerateSkuTests.cs | 187 ++++++++++++++++++ .../Printbase.Domain.Tests.csproj | 1 + .../Printbase.Infrastructure.Tests.csproj | 1 + .../Printbase.WebApi.Tests.csproj | 1 + 7 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 tests/Printbase.Application.Tests/Products/Commands/CreateProduct/GenerateSkuTests.cs diff --git a/src/Printbase.Application/Products/Commands/CreateProduct/CreateProductCommandHandler.cs b/src/Printbase.Application/Products/Commands/CreateProduct/CreateProductCommandHandler.cs index 5cd63eb..b02d710 100644 --- a/src/Printbase.Application/Products/Commands/CreateProduct/CreateProductCommandHandler.cs +++ b/src/Printbase.Application/Products/Commands/CreateProduct/CreateProductCommandHandler.cs @@ -83,7 +83,7 @@ public class CreateProductCommandHandler( return productDto; } - private static string GenerateSku(string productName, string? color, string? size) + public static string GenerateSku(string productName, string? color, string? size) { var prefix = productName.Length >= 3 ? productName[..3].ToUpper() : productName.ToUpper(); var colorPart = !string.IsNullOrEmpty(color) ? color[..Math.Min(3, color.Length)].ToUpper() : "XXX"; diff --git a/src/Printbase.Infrastructure/Database/ApplicationDbContext.cs b/src/Printbase.Infrastructure/Database/ApplicationDbContext.cs index 0012c8a..5e056f5 100644 --- a/src/Printbase.Infrastructure/Database/ApplicationDbContext.cs +++ b/src/Printbase.Infrastructure/Database/ApplicationDbContext.cs @@ -3,7 +3,7 @@ using Printbase.Infrastructure.DbEntities.Products; namespace Printbase.Infrastructure.Database; -public class ApplicationDbContext(DbContextOptions options) : DbContext(options) +public class ApplicationDbContext(DbContextOptions? options) : DbContext(options) { public DbSet Products { get; set; } = null!; public DbSet ProductVariants { get; set; } = null!; diff --git a/tests/Printbase.Application.Tests/Printbase.Application.Tests.csproj b/tests/Printbase.Application.Tests/Printbase.Application.Tests.csproj index d7f0b2e..beba882 100644 --- a/tests/Printbase.Application.Tests/Printbase.Application.Tests.csproj +++ b/tests/Printbase.Application.Tests/Printbase.Application.Tests.csproj @@ -10,6 +10,7 @@ + @@ -18,4 +19,8 @@ + + + + diff --git a/tests/Printbase.Application.Tests/Products/Commands/CreateProduct/GenerateSkuTests.cs b/tests/Printbase.Application.Tests/Products/Commands/CreateProduct/GenerateSkuTests.cs new file mode 100644 index 0000000..d08bcac --- /dev/null +++ b/tests/Printbase.Application.Tests/Products/Commands/CreateProduct/GenerateSkuTests.cs @@ -0,0 +1,187 @@ +using Printbase.Application.Products.Commands.CreateProduct; + +namespace Printbase.Application.Tests.Products.Commands.CreateProduct; + +using Xunit; + +public class GenerateSkuTests +{ + [Fact] + public void GenerateSku_WithValidInputs_ReturnsCorrectFormat() + { + // Arrange + const string productName = "Shirt"; + const string color = "Blue"; + const string size = "Medium"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal(4, parts.Length); + Assert.Equal("SHI", parts[0]); + Assert.Equal("BLU", parts[1]); + Assert.Equal("MEDIUM", parts[2]); + Assert.Matches(@"^\d{3}$", parts[3]); + } + + [Fact] + public void GenerateSku_WithShortProductName_UsesEntireProductName() + { + // Arrange + const string productName = "CU"; + const string color = "Black"; + const string size = "Large"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("CU", parts[0]); + Assert.Equal("BLA", parts[1]); + Assert.Equal("LARGE", parts[2]); + } + + [Fact] + public void GenerateSku_WithShortColor_UsesEntireColor() + { + // Arrange + const string productName = "Mug"; + const string color = "Red"; + const string size = "Small"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("MUG", parts[0]); + Assert.Equal("RED", parts[1]); + Assert.Equal("SMALL", parts[2]); + } + + [Fact] + public void GenerateSku_WithNullColor_UsesXXX() + { + // Arrange + const string productName = "Case"; + string? color = null; + const string size = "Standard"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("CAS", parts[0]); + Assert.Equal("XXX", parts[1]); + Assert.Equal("STANDARD", parts[2]); + } + + [Fact] + public void GenerateSku_WithEmptyColor_UsesXXX() + { + // Arrange + const string productName = "Notebook"; + const string color = ""; + const string size = "Standard"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("NOT", parts[0]); + Assert.Equal("XXX", parts[1]); + Assert.Equal("STANDARD", parts[2]); + } + + [Fact] + public void GenerateSku_WithNullSize_UsesOS() + { + // Arrange + const string productName = "Watch"; + const string color = "Silver"; + string? size = null; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("WAT", parts[0]); + Assert.Equal("SIL", parts[1]); + Assert.Equal("OS", parts[2]); + } + + [Fact] + public void GenerateSku_WithEmptySize_UsesOS() + { + // Arrange + const string productName = "Shirt"; + const string color = "Black"; + const string size = ""; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("SHI", parts[0]); + Assert.Equal("BLA", parts[1]); + Assert.Equal("OS", parts[2]); + } + + [Fact] + public void GenerateSku_CaseInsensitivity_OutputsUppercase() + { + // Arrange + const string productName = "hat"; + const string color = "red"; + const string size = "small"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + + // Assert + Assert.Equal("HAT", parts[0]); + Assert.Equal("RED", parts[1]); + Assert.Equal("SMALL", parts[2]); + } + + [Fact] + public void GenerateSku_RandomPartIsInRange() + { + // Arrange + const string productName = "Book"; + const string color = "Green"; + const string size = "Medium"; + + // Act + var sku = CreateProductCommandHandler.GenerateSku(productName, color, size); + var parts = sku.Split('-'); + var randomPart = int.Parse(parts[3]); + + // Assert + Assert.InRange(randomPart, 100, 999); + } + + [Fact] + public void GenerateSku_GeneratesUniqueSKUs() + { + // Arrange + const string productName = "Mug"; + const string color = "White"; + const string size = "Regular"; + + // Act + var sku1 = CreateProductCommandHandler.GenerateSku(productName, color, size); + var sku2 = CreateProductCommandHandler.GenerateSku(productName, color, size); + + // Assert + Assert.NotEqual(sku1, sku2); + } +} \ No newline at end of file diff --git a/tests/Printbase.Domain.Tests/Printbase.Domain.Tests.csproj b/tests/Printbase.Domain.Tests/Printbase.Domain.Tests.csproj index d7f0b2e..e99f38d 100644 --- a/tests/Printbase.Domain.Tests/Printbase.Domain.Tests.csproj +++ b/tests/Printbase.Domain.Tests/Printbase.Domain.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/tests/Printbase.Infrastructure.Tests/Printbase.Infrastructure.Tests.csproj b/tests/Printbase.Infrastructure.Tests/Printbase.Infrastructure.Tests.csproj index c6d6b68..f2d5c14 100644 --- a/tests/Printbase.Infrastructure.Tests/Printbase.Infrastructure.Tests.csproj +++ b/tests/Printbase.Infrastructure.Tests/Printbase.Infrastructure.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/tests/Printbase.WebApi.Tests/Printbase.WebApi.Tests.csproj b/tests/Printbase.WebApi.Tests/Printbase.WebApi.Tests.csproj index d7f0b2e..e99f38d 100644 --- a/tests/Printbase.WebApi.Tests/Printbase.WebApi.Tests.csproj +++ b/tests/Printbase.WebApi.Tests/Printbase.WebApi.Tests.csproj @@ -10,6 +10,7 @@ +