Initial commit - ECommerce project

This commit is contained in:
2026-08-05 23:58:33 +03:00
commit bcebac18e7
63 changed files with 4543 additions and 0 deletions
@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Commerce.Contracts.DTOs;
using Commerce.Core.Services;
using Commerce.Domain;
using Commerce.Domain.Entities;
using Microsoft.EntityFrameworkCore;
using Xunit;
namespace Commerce.Core.Tests;
public class CategoryServiceTests
{
private Context GetContext()
{
var options = new DbContextOptionsBuilder<Context>()
.UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
.Options;
return new Context(options);
}
[Fact]
public async Task GetAllCategories_ShouldFilterByLocalizedName()
{
// Arrange
using var context = GetContext();
await context.Database.EnsureCreatedAsync();
var id1 = Guid.NewGuid();
context.Categories.AddRange(new List<Category>
{
new Category {
Id = id1,
Translations = new List<CategoryTranslation>
{
new CategoryTranslation { Language = "en", Info = new CategoryInfo { Name = "Electronics", Description = "Desc" } },
new CategoryTranslation { Language = "ar", Info = new CategoryInfo { Name = "إلكترونيات", Description = "Desc" } }
},
Photos = Array.Empty<string>()
},
new Category {
Id = Guid.NewGuid(),
Translations = new List<CategoryTranslation>
{
new CategoryTranslation { Language = "en", Info = new CategoryInfo { Name = "Fashion", Description = "Desc" } }
},
Photos = Array.Empty<string>()
}
});
await context.SaveChangesAsync();
var service = new CategoryService(context);
// Act - Search for Arabic name
var resultsAr = await service.GetAllCategories("إلكترونيات");
// Act - Search for English name
var resultsEn = await service.GetAllCategories("Elec");
// Assert
Assert.Single(resultsAr);
Assert.Equal(id1, resultsAr.First().Id);
Assert.Single(resultsEn);
Assert.Equal(id1, resultsEn.First().Id);
}
}
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="10.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
<PackageReference Include="xunit" Version="2.9.2" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.2" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Commerce.Core\Commerce.Core.csproj" />
<ProjectReference Include="..\Commerce.Contracts\Commerce.Contracts.csproj" />
<ProjectReference Include="..\Commerce.Domain\Commerce.Domain.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,153 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Commerce.Contracts.DTOs;
using Commerce.Domain.Entities;
using Xunit;
using TechnicalDetail = Commerce.Domain.Entities.TechnicalDetail;
namespace Commerce.Core.Tests;
public class LocalizationMappingTests
{
[Fact]
public void Product_ToVM_ShouldMapIndependentTechnicalDetails()
{
// Arrange
var product = new Product
{
Id = Guid.NewGuid(),
Translations = new List<ProductTranslation>
{
new ProductTranslation
{
Language = "en",
Info = new ProductInfo
{
Name = "Product 1",
TechnicalDetails = new List<TechnicalDetail> { new TechnicalDetail { Key = "Color", Value = "Red" } }
}
},
new ProductTranslation
{
Language = "ar",
Info = new ProductInfo
{
Name = "منتج 1",
TechnicalDetails = new List<TechnicalDetail> { new TechnicalDetail { Key = "اللون", Value = "أحمر" } }
}
}
}
};
// Act
var vm = Product.ToVM(product);
// Assert
Assert.NotNull(vm.Translations);
Assert.Equal(2, vm.Translations.Count);
var enTrans = vm.Translations.First(t => t.Language == "en");
Assert.Single(enTrans.Info.TechnicalDetails);
Assert.Equal("Color", enTrans.Info.TechnicalDetails[0].Key);
Assert.Equal("Red", enTrans.Info.TechnicalDetails[0].Value);
var arTrans = vm.Translations.First(t => t.Language == "ar");
Assert.Single(arTrans.Info.TechnicalDetails);
Assert.Equal("اللون", arTrans.Info.TechnicalDetails[0].Key);
Assert.Equal("أحمر", arTrans.Info.TechnicalDetails[0].Value);
}
[Fact]
public void Product_ToEntity_ShouldMapIndependentTechnicalDetails()
{
// Arrange
var vm = new ProductVM
{
Id = Guid.NewGuid(),
Translations = new List<ProductTranslationVM>
{
new ProductTranslationVM
{
Language = "en",
Info = new ProductInfoVM
{
Name = "Product 1",
TechnicalDetails = new List<TechnicalDetailVM> { new TechnicalDetailVM { Key = "Weight", Value = "1kg" } }
}
}
}
};
// Act
var entity = Product.ToEntity(vm);
// Assert
Assert.NotNull(entity.Translations);
Assert.Single(entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails);
Assert.Equal("Weight", entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Key);
Assert.Equal("1kg", entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Value);
}
[Fact]
public void Category_ToVM_ShouldMapIndependentTechnicalDetails()
{
// Arrange
var category = new Category
{
Id = Guid.NewGuid(),
Translations = new List<CategoryTranslation>
{
new CategoryTranslation
{
Language = "en",
Info = new CategoryInfo
{
Name = "Category 1",
TechnicalDetails = new List<TechnicalDetail> { new TechnicalDetail { Key = "Material", Value = "Leather" } }
}
}
}
};
// Act
var vm = Category.ToVM(category);
// Assert
Assert.NotNull(vm.Translations);
Assert.Single(vm.Translations.First(t => t.Language == "en").Info.TechnicalDetails);
Assert.Equal("Material", vm.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Key);
Assert.Equal("Leather", vm.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Value);
}
[Fact]
public void Category_ToEntity_ShouldMapIndependentTechnicalDetails()
{
// Arrange
var vm = new CategoryVM
{
Id = Guid.NewGuid(),
Translations = new List<CategoryTranslationVM>
{
new CategoryTranslationVM
{
Language = "en",
Info = new CategoryInfoVM
{
Name = "Category 1",
TechnicalDetails = new List<TechnicalDetailVM> { new TechnicalDetailVM { Key = "Power", Value = "100W" } }
}
}
}
};
// Act
var entity = Category.ToEntity(vm);
// Assert
Assert.NotNull(entity.Translations);
Assert.Single(entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails);
Assert.Equal("Power", entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Key);
Assert.Equal("100W", entity.Translations.First(t => t.Language == "en").Info.TechnicalDetails[0].Value);
}
}
+10
View File
@@ -0,0 +1,10 @@
namespace Commerce.Core.Tests;
public class UnitTest1
{
[Fact]
public void Test1()
{
}
}