Add GenerateSku Tests

This commit is contained in:
lumijiez
2025-05-06 14:19:07 +03:00
parent 1488845fa4
commit ce452e0df4
7 changed files with 197 additions and 2 deletions

View File

@@ -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";

View File

@@ -3,7 +3,7 @@ using Printbase.Infrastructure.DbEntities.Products;
namespace Printbase.Infrastructure.Database;
public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : DbContext(options)
public class ApplicationDbContext(DbContextOptions<ApplicationDbContext>? options) : DbContext(options)
{
public DbSet<ProductDbEntity> Products { get; set; } = null!;
public DbSet<ProductVariantDbEntity> ProductVariants { get; set; } = null!;

View File

@@ -10,6 +10,7 @@
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>
@@ -18,4 +19,8 @@
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Printbase.Application\Printbase.Application.csproj" />
</ItemGroup>
</Project>

View File

@@ -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);
}
}

View File

@@ -10,6 +10,7 @@
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>

View File

@@ -10,6 +10,7 @@
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>

View File

@@ -10,6 +10,7 @@
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>