diff --git a/SimplCommerce.sln b/SimplCommerce.sln
index 2c53621439..dc1526c069 100644
--- a/SimplCommerce.sln
+++ b/SimplCommerce.sln
@@ -136,6 +136,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplCommerce.Module.Paymen
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimplCommerce.Module.Checkouts", "src\Modules\SimplCommerce.Module.Checkouts\SimplCommerce.Module.Checkouts.csproj", "{4473538D-2BFA-4C53-B642-0D0DC4F16863}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimplCommerce.Module.Checkouts.Tests", "SimplCommerce.Module.Checkouts.Tests\SimplCommerce.Module.Checkouts.Tests.csproj", "{F8740409-C3E2-4CAB-9E50-D9C1B4B57211}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -710,6 +712,18 @@ Global
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x64.Build.0 = Release|Any CPU
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x86.ActiveCfg = Release|Any CPU
{4473538D-2BFA-4C53-B642-0D0DC4F16863}.Release|x86.Build.0 = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|x64.Build.0 = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Debug|x86.Build.0 = Debug|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|x64.ActiveCfg = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|x64.Build.0 = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|x86.ActiveCfg = Release|Any CPU
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -765,6 +779,7 @@ Global
{14586564-62CC-4117-AC1B-858ED53C2D6C} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
{E30CF10F-FABF-4917-8BEB-CB81E4CE2C92} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
{4473538D-2BFA-4C53-B642-0D0DC4F16863} = {7EFA2FA7-32DD-4047-B021-50E77A83D714}
+ {F8740409-C3E2-4CAB-9E50-D9C1B4B57211} = {D9FD9ABA-AE5E-4427-AA6B-6285BE2E212D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B9D0D8F0-1AB9-44DD-839F-ED8CEE7DDB10}
diff --git a/checkout/GlobalUsings.cs b/checkout/GlobalUsings.cs
new file mode 100644
index 0000000000..8c927eb747
--- /dev/null
+++ b/checkout/GlobalUsings.cs
@@ -0,0 +1 @@
+global using Xunit;
\ No newline at end of file
diff --git a/checkout/UnitTest1.cs b/checkout/UnitTest1.cs
new file mode 100644
index 0000000000..26121f731b
--- /dev/null
+++ b/checkout/UnitTest1.cs
@@ -0,0 +1,11 @@
+namespace checkout
+{
+ public class UnitTest1
+ {
+ [Fact]
+ public void Test1()
+ {
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/checkout/checkout.csproj b/checkout/checkout.csproj
new file mode 100644
index 0000000000..9e0c30605a
--- /dev/null
+++ b/checkout/checkout.csproj
@@ -0,0 +1,25 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+ false
+ true
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
diff --git a/global.json b/global.json
index 77a73a039e..27fbe488b0 100644
--- a/global.json
+++ b/global.json
@@ -1,6 +1,6 @@
{
"sdk": {
- "version": "7.0.101",
+ "version": "8.0.100",
"rollForward": "latestMinor",
"allowPrerelease": false
}
diff --git a/src/SimplCommerce.WebHost/appsettings.json b/src/SimplCommerce.WebHost/appsettings.json
index 150c72a1de..60d51cd120 100644
--- a/src/SimplCommerce.WebHost/appsettings.json
+++ b/src/SimplCommerce.WebHost/appsettings.json
@@ -1,7 +1,7 @@
{
- "ConnectionStrings": {
- "DefaultConnection": "Server=.;Database=SimplCommerce;Trusted_Connection=True;TrustServerCertificate=true;MultipleActiveResultSets=true"
- },
+ "ConnectionStrings": {
+ "DefaultConnection": "server=DotNetFSD\\SQLEXPRESS; database=SimplCommerce; user id=sa; password=pass@123;trustservercertificate=true"
+ },
"Authentication" : {
"Facebook" : {
"AppId" : "1716532045292977",
diff --git a/test/SimplCommerce.Module.Inventory.Tests/SimplCommerce.Module.Inventory.Tests.csproj b/test/SimplCommerce.Module.Inventory.Tests/SimplCommerce.Module.Inventory.Tests.csproj
index a24cab0278..d25ccbdec9 100644
--- a/test/SimplCommerce.Module.Inventory.Tests/SimplCommerce.Module.Inventory.Tests.csproj
+++ b/test/SimplCommerce.Module.Inventory.Tests/SimplCommerce.Module.Inventory.Tests.csproj
@@ -6,6 +6,8 @@
+
+
diff --git a/test/SimplCommerce.Module.Inventory.Tests/StockServiceTests.cs b/test/SimplCommerce.Module.Inventory.Tests/StockServiceTests.cs
index d706d09409..06c817f1f6 100644
--- a/test/SimplCommerce.Module.Inventory.Tests/StockServiceTests.cs
+++ b/test/SimplCommerce.Module.Inventory.Tests/StockServiceTests.cs
@@ -1,66 +1,109 @@
-//using System.Collections.Generic;
-//using System.Diagnostics;
-//using System.Linq;
-//using System.Threading.Tasks;
-//using Moq;
-//using SimplCommerce.Infrastructure.Data;
-//using SimplCommerce.Module.Catalog.Models;
-//using SimplCommerce.Module.Inventory.Models;
-//using SimplCommerce.Module.Inventory.Services;
-//using Xunit;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using java.lang;
+using Microsoft.AspNetCore.Mvc;
+using Moq;
+using SimplCommerce.Infrastructure.Data;
+using SimplCommerce.Infrastructure.Web.SmartTable;
+using SimplCommerce.Module.Core.Extensions;
+using SimplCommerce.Module.Inventory.Areas.Inventory.Controllers;
+using SimplCommerce.Module.Inventory.Areas.Inventory.ViewModels;
+using SimplCommerce.Module.Inventory.Models;
+using SimplCommerce.Module.Inventory.Services;
+using Xunit;
-//namespace SimplCommerce.Module.Inventory.Tests
-//{
-// public class StockServiceTests
-// {
-// private Mock> _stockRepoMock;
-// private Mock> _productRepoMock;
-// private readonly Mock> _stockHistoryRepoMock;
-// private readonly Warehouse _testWarehouse = new Warehouse(100) {VendorId = 123};
+namespace SimplCommerce.Module.Inventory.Tests.Controllers
+{
+ public class StockApiControllerTests
+ {
+ [Fact]
+ public async Task List_ReturnsOkResult()
+ {
+ // Arrange
+ var stockRepositoryMock = new Mock>();
+ var stockServiceMock = new Mock();
+ var workContextMock = new Mock();
+ var warehouseRepositoryMock = new Mock>();
+ var stockHistoryRepositoryMock = new Mock>();
-// public StockServiceTests()
-// {
-// _stockHistoryRepoMock = new Mock>();
-// }
+ var controller = new StockApiController(
+ stockRepositoryMock.Object,
+ stockServiceMock.Object,
+ workContextMock.Object,
+ warehouseRepositoryMock.Object,
+ stockHistoryRepositoryMock.Object
+ );
-// [Theory]
-// [InlineData(100, 50)]
-// [InlineData(1000, 560)]
-// [InlineData(13, 5)]
-// [InlineData(143, 0)]
-// public async Task AddAllProductsTest(int productsCount, int stocksCount)
-// {
-// InitializeMocks(productsCount, stocksCount);
-// var service = new StockService(_stockRepoMock.Object, _productRepoMock.Object,
-// _stockHistoryRepoMock.Object);
-// await service.AddAllProduct(_testWarehouse);
+ var warehouseId = 1;
+ var param = new SmartTableParam();
+
+
-// _stockRepoMock.Verify(m =>
-// m.AddRange(It.Is>(arg => arg.Count() == productsCount - stocksCount)));
-// }
+ // Act
+ var result = await controller.List(warehouseId, param);
+ var okResult = result as OkObjectResult;
-// private void InitializeMocks(int productsCount, int stocksCount)
-// {
-// _stockRepoMock = new Mock>();
-// var stocks = new Stock[stocksCount];
-// for (int i = 1; i <= stocks.Length; i++)
-// {
-// stocks[i - 1] = new Stock
-// { ProductId = i, Quantity = 5, WarehouseId = _testWarehouse.Id };
-// }
+ // Assert
+
+ //Assert.Equal(200, okResult.StatusCode);
+ }
-// _stockRepoMock.Setup(x => x.Query()).Returns(() => new TestAsyncEnumerable(stocks.AsQueryable()));
-// _stockRepoMock.Setup(x => x.AddRange(It.IsAny>()));
-// _productRepoMock = new Mock>();
-// var products = new Product[productsCount];
+ [Fact]
+ public async Task Put_ReturnsAcceptedResult()
+ {
+ // Arrange
+ var stockRepositoryMock = new Mock>();
+ var stockServiceMock = new Mock();
+ var workContextMock = new Mock();
+ var warehouseRepositoryMock = new Mock>();
+ var stockHistoryRepositoryMock = new Mock>();
-// for (int i = 1; i <= products.Length; i++)
-// {
-// products[i - 1] = new Product { HasOptions = false, VendorId = _testWarehouse.VendorId };
-// typeof(Product).GetProperty("Id").SetValue(products[i - 1], i);
-// }
+ var controller = new StockApiController(
+ stockRepositoryMock.Object,
+ stockServiceMock.Object,
+ workContextMock.Object,
+ warehouseRepositoryMock.Object,
+ stockHistoryRepositoryMock.Object
+ );
-// _productRepoMock.Setup(x => x.Query()).Returns(new TestAsyncEnumerable(products.AsQueryable()));
-// }
-// }
-//}
+ var warehouseId = 1;
+ var stockVms = new List { new StockVm { ProductId = 1, AdjustedQuantity = 5 } };
+
+ // Act
+ var result = await controller.Put(warehouseId, stockVms);
+
+ // Assert
+ Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task GetStockHistory_ReturnsOkResult()
+ {
+ // Arrange
+ var stockRepositoryMock = new Mock>();
+ var stockServiceMock = new Mock();
+ var workContextMock = new Mock();
+ var warehouseRepositoryMock = new Mock>();
+ var stockHistoryRepositoryMock = new Mock>();
+
+ var controller = new StockApiController(
+ stockRepositoryMock.Object,
+ stockServiceMock.Object,
+ workContextMock.Object,
+ warehouseRepositoryMock.Object,
+ stockHistoryRepositoryMock.Object
+ );
+
+ var warehouseId = 1;
+ var productId = 1;
+
+ // Act
+ //var result = await controller.GetStockHistory(warehouseId, productId);
+
+ // Assert
+ // Assert.IsType(result);
+ }
+ }
+}
diff --git a/test/SimplCommerce.Module.Inventory.Tests/WarehouseProductTest.cs b/test/SimplCommerce.Module.Inventory.Tests/WarehouseProductTest.cs
new file mode 100644
index 0000000000..aafd97d3f2
--- /dev/null
+++ b/test/SimplCommerce.Module.Inventory.Tests/WarehouseProductTest.cs
@@ -0,0 +1,100 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Moq;
+using SimplCommerce.Infrastructure.Data;
+using SimplCommerce.Infrastructure.Web.SmartTable;
+using SimplCommerce.Module.Catalog.Models;
+using SimplCommerce.Module.Core.Extensions;
+using SimplCommerce.Module.Inventory.Areas.Inventory.Controllers;
+using SimplCommerce.Module.Inventory.Models;
+using SimplCommerce.Module.Inventory.Services;
+using Xunit;
+
+namespace SimplCommerce.Module.Inventory.Tests
+{
+ public class WarehouseProductApiControllerTests
+ {
+ private readonly Mock> _warehouseRepositoryMock;
+ private readonly Mock _workContextMock;
+ private readonly Mock> _productRepositoryMock;
+ private readonly Mock> _stockRepositoryMock;
+ private readonly Mock _stockServiceMock;
+
+ public WarehouseProductApiControllerTests()
+ {
+ _warehouseRepositoryMock = new Mock>();
+ _workContextMock = new Mock();
+ _productRepositoryMock = new Mock>();
+ _stockRepositoryMock = new Mock>();
+ _stockServiceMock = new Mock();
+ }
+
+ [Fact]
+ public async Task GetProducts_ReturnsOkResult()
+ {
+ // Arrange
+ var controller = new WarehouseProductApiController(
+ _warehouseRepositoryMock.Object,
+ _workContextMock.Object,
+ _productRepositoryMock.Object,
+ _stockRepositoryMock.Object,
+ _stockServiceMock.Object
+ );
+
+ var warehouseId = 1;
+ var smartTableParam = new SmartTableParam();
+
+ // Act
+ var result = await controller.GetProducts(warehouseId, smartTableParam);
+
+ // Assert
+ // Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task AddProducts_ReturnsAcceptedResult()
+ {
+ // Arrange
+ var controller = new WarehouseProductApiController(
+ _warehouseRepositoryMock.Object,
+ _workContextMock.Object,
+ _productRepositoryMock.Object,
+ _stockRepositoryMock.Object,
+ _stockServiceMock.Object
+ );
+
+ var warehouseId = 1;
+ var productIds = new List { 1, 2, 3 };
+
+ // Act
+ var result = await controller.AddProducts(warehouseId, productIds);
+
+ // Assert
+ Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task AddAllProducts_ReturnsAcceptedResult()
+ {
+ // Arrange
+ var controller = new WarehouseProductApiController(
+ _warehouseRepositoryMock.Object,
+ _workContextMock.Object,
+ _productRepositoryMock.Object,
+ _stockRepositoryMock.Object,
+ _stockServiceMock.Object
+ );
+
+ var warehouseId = 1;
+
+ // Act
+ var result = await controller.AddAllProducts(warehouseId);
+
+ // Assert
+ Assert.IsType(result);
+ }
+
+ // Add more test cases as needed
+ }
+}
diff --git a/test/SimplCommerce.Module.Inventory.Tests/WarehouseTests.cs b/test/SimplCommerce.Module.Inventory.Tests/WarehouseTests.cs
new file mode 100644
index 0000000000..5b7bdb4f50
--- /dev/null
+++ b/test/SimplCommerce.Module.Inventory.Tests/WarehouseTests.cs
@@ -0,0 +1,126 @@
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+using Moq;
+using SimplCommerce.Infrastructure.Data;
+using SimplCommerce.Infrastructure.Web.SmartTable;
+using SimplCommerce.Module.Core.Extensions;
+using SimplCommerce.Module.Core.Models;
+using SimplCommerce.Module.Inventory.Areas.Inventory.Controllers;
+using SimplCommerce.Module.Inventory.Areas.Inventory.ViewModels;
+using SimplCommerce.Module.Inventory.Models;
+using Xunit;
+
+namespace SimplCommerce.Module.Inventory.Tests.Controllers
+{
+ public class WarehouseApiControllerTests
+ {
+ [Fact]
+ public async Task Get_ReturnsOkResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+
+ // Act
+ // var result = await controller.Get();
+
+ // Assert
+ // var actionResult = Assert.IsType< ActionResult>(result);
+ }
+
+ [Fact]
+ public async Task List_ReturnsJsonResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+ var param = new SmartTableParam();
+
+ // Act
+ // var result = await controller.List(param);
+
+ // Assert
+ // Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task GetById_ReturnsJsonResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+ var warehouseId = 1;
+
+ // Act
+ // var result = await controller.Get(warehouseId);
+
+ // Assert
+ // Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task Post_ReturnsCreatedAtActionResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+ var warehouseVm = new WarehouseVm();
+
+ // Act
+ //var result = await controller.Post(warehouseVm);
+
+ // Assert
+ // Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task Put_ReturnsAcceptedResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+ var warehouseId = 1;
+ var warehouseVm = new WarehouseVm();
+
+ // Act
+
+ //var result = await controller.Put(warehouseId, warehouseVm);
+
+ // Assert
+ //Assert.IsType(result);
+ }
+
+ [Fact]
+ public async Task Delete_ReturnsNoContentResult()
+ {
+ // Arrange
+ var warehouseRepositoryMock = new Mock>();
+ var addressRepositoryMock = new Mock>();
+ var workContextMock = new Mock();
+
+ var controller = new WarehouseApiController(warehouseRepositoryMock.Object, workContextMock.Object, addressRepositoryMock.Object);
+ var warehouseId = 1;
+
+ // Act
+ //var result = await controller.Delete(warehouseId);
+
+ // Assert
+ //Assert.IsType(result);
+ }
+ }
+}
diff --git a/test/SimplCommerce.Module.Pricing.Tests/CouponServiceTest.cs b/test/SimplCommerce.Module.Pricing.Tests/CouponServiceTest.cs
deleted file mode 100644
index 5bd32e967a..0000000000
--- a/test/SimplCommerce.Module.Pricing.Tests/CouponServiceTest.cs
+++ /dev/null
@@ -1,383 +0,0 @@
-//using System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Threading.Tasks;
-//using Xunit;
-//using Microsoft.EntityFrameworkCore;
-//using Moq;
-//using SimplCommerce.Module.Catalog.Models;
-//using SimplCommerce.Module.Core.Data;
-//using SimplCommerce.Module.Core.Extensions;
-//using SimplCommerce.Module.Core.Models;
-//using SimplCommerce.Module.Pricing.Models;
-//using SimplCommerce.Module.Pricing.Services;
-//using System.Threading;
-
-//namespace SimplCommerce.Module.Pricing.Tests
-//{
-// public class CouponServiceTest
-// {
-// [Fact(DisplayName = "WithNoCoupon_ShouldReturns_CouponNotExistMessage")]
-// public async Task CouponService_WithNoCoupon_ShouldReturns_CouponNotExistMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test");
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = null;
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"The coupon {couponToApply} is not exist.", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithInactiveCoupon_ShouldReturns_CouponNotExistMessage")]
-// public async Task CouponService_WithInactiveCoupon_ShouldReturns_CouponNotExistMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", isActive: false);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"The coupon {couponToApply} is not exist.", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithStartsOnInTheFuture_ShouldReturns_CouponCanBeUsedAfterStartOnDateMessage")]
-// public async Task CouponService_WithStartsOnInTheFuture_ShouldReturns_CouponCanBeUsedAfterStartOnDateMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test");
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(1);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"The coupon {couponToApply} should be used after {coupon.CartRule.StartOn}.", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithExpiredCoupon_ShouldReturns_CouponExpiredMessage")]
-// public async Task CouponService_WithExpiredCoupon_ShouldReturns_CouponExpiredMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test");
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(-1);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"The coupon {couponToApply} is expired.", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithFullyConsumedCoupon_ShouldReturns_CouponAllUsedMessage")]
-// public async Task CouponService_WithFullyConsumedCoupon_ShouldReturns_CouponAllUsedMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", usageLimitForCoupon: 1);
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(1);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"The coupon {couponToApply} is all used.", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithFullyConsumedCouponForUser_ShouldReturns_CouponAllUsedMessage")]
-// public async Task CouponService_WithFullyConsumedCouponForUser_ShouldReturns_CouponAllUsedMessage()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", usageLimitForCoupon: 2, usageLimitForUser: 1);
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(1);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.Equal($"You can use the coupon {couponToApply} only {coupon.CartRule.UsageLimitPerCustomer} times", result.ErrorMessage);
-// }
-
-// [Fact(DisplayName = "WithNoCouponCartRuleToApplySpecified_ShouldThrow_InvalidOperationException")]
-// public void CouponService_WithoutCouponCartRuleToApplySpecified_ShouldThrow_InvalidOperationException()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", usageLimitForCoupon: 2, usageLimitForUser: 2);
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(1);
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// Assert.ThrowsAsync(async () => await couponService.Validate(user.Id, couponToApply, cartInfo));
-// }
-
-// [Fact(DisplayName = "WithDiscountAndFixedCartRule_ShouldReturns_SameDiscountAmount")]
-// public async Task CouponService_WithDiscountAndFixedCartRule_ShouldReturns_SameDiscountAmount()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", usageLimitForCoupon: 2, usageLimitForUser: 2);
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(1);
-// coupon.CartRule.DiscountAmount = 1M;
-// coupon.CartRule.RuleToApply = "cart_fixed";
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.True(result.Succeeded);
-// Assert.Equal(coupon.CartRule.DiscountAmount, result.DiscountAmount);
-// }
-
-// [Fact(DisplayName = "WithDiscountAndByPercentCartRule_ShouldReturns_DiscountedAmount")]
-// public async Task CouponService_WithDiscountAndByPercentCartRule_ShouldReturns_DiscountedAmount()
-// {
-// var user = MakeMockUser();
-
-// var coupon = MakeMockCoupon("test", usageLimitForCoupon: 2, usageLimitForUser: 2);
-// coupon.CartRule.StartOn = DateTime.Now.AddDays(-2);
-// coupon.CartRule.EndOn = DateTime.Now.AddDays(1);
-// coupon.CartRule.DiscountAmount = 10M;
-// coupon.CartRule.RuleToApply = "by_percent";
-// coupon.CartRule.Products.Add(new CartRuleProduct { ProductId = 1 });
-// coupon.CartRule.Products.Add(new CartRuleProduct { ProductId = 2 });
-
-// var cartRuleUsage = MakeMockCartRuleUsage(user, coupon);
-
-// var couponService = MakeMockCouponService(user, coupon, cartRuleUsage);
-
-// var cartInfo = MakeMockCartInfoForCoupon();
-
-// string couponToApply = "test";
-
-// var result = await couponService.Validate(user.Id, couponToApply, cartInfo);
-
-// Assert.True(result.Succeeded);
-// Assert.Equal(1M, result.DiscountAmount);
-// }
-
-// #region MockDataHelpers
-
-// private static CartInfoForCoupon MakeMockCartInfoForCoupon()
-// {
-// var cartInfoForCoupon = new CartInfoForCoupon
-// {
-// Items = new List
-// {
-// new CartItemForCoupon
-// {
-// ProductId = 1,
-// Quantity = 1
-// },
-// new CartItemForCoupon
-// {
-// ProductId = 2,
-// Quantity = 2
-// }
-// }
-// };
-
-// return cartInfoForCoupon;
-// }
-
-// private static CartRuleUsage MakeMockCartRuleUsage(User user, Coupon coupon)
-// {
-// var cartRule = new CartRuleUsage
-// {
-// UserId = user.Id,
-// CouponId = coupon.Id
-// };
-
-// return cartRule;
-// }
-
-// private static User MakeMockUser()
-// {
-// var user = new User { Id = 1, FullName = "Jane Smith" };
-
-// return user;
-// }
-
-// private static Coupon MakeMockCoupon(string code, bool isActive = true, int usageLimitForCoupon = 1, int usageLimitForUser = 1)
-// {
-// var coupon = new Coupon
-// {
-// Code = code,
-// CartRule = new CartRule
-// {
-// IsActive = isActive,
-// UsageLimitPerCoupon = usageLimitForCoupon,
-// UsageLimitPerCustomer = usageLimitForUser,
-// Products = new List {},
-// Categories = new List { }
-// }
-// };
-
-// return coupon;
-// }
-
-// private static IList MakeMockProducts()
-// {
-// var mockProduct1 = new Mock();
-// mockProduct1.SetupGet(p => p.Id).Returns(1);
-// mockProduct1.Object.Price = 10M;
-
-// var mockProduct2 = new Mock();
-// mockProduct2.SetupGet(p => p.Id).Returns(2);
-// mockProduct2.Object.Price = 20M;
-
-
-// return new List
-// {
-// mockProduct1.Object,
-// mockProduct2.Object
-// };
-// }
-
-// private static CouponService MakeMockCouponService(User user, Coupon coupon, CartRuleUsage cartRuleUsage)
-// {
-// var coupons = new List { coupon }.AsQueryable();
-
-// var cartRules = new List { cartRuleUsage }.AsQueryable();
-
-// Mock> couponMockSet = BuildMockSetForCoupon(coupons);
-// Mock> cartRuleUsageMockSet = BuildMockSetForCartRuleUsage(cartRules);
-// Mock> productsMockSet = BuildMockSetForProduct(MakeMockProducts().AsQueryable());
-
-// var contextOptions = new DbContextOptions();
-// var mockContext = new Mock(contextOptions);
-// mockContext.Setup(c => c.Set()).Returns(couponMockSet.Object);
-// mockContext.Setup(c => c.Set()).Returns(cartRuleUsageMockSet.Object);
-// mockContext.Setup(c => c.Set()).Returns(productsMockSet.Object);
-
-// var mockWorkContext = new Mock();
-// mockWorkContext.Setup(x => x.GetCurrentUser()).Returns(Task.FromResult(user));
-
-// var couponRepository = new Repository(mockContext.Object);
-// var cartUsageRepository = new Repository(mockContext.Object);
-// var productRepository = new Repository(mockContext.Object);
-
-
-// var couponService = new CouponService(couponRepository, cartUsageRepository, productRepository, mockWorkContext.Object);
-
-// return couponService;
-// }
-
-// private static Mock> BuildMockSetForCoupon(IQueryable coupons)
-// {
-// var mockSet = new Mock>();
-// mockSet.As>()
-// .Setup(m => m.GetAsyncEnumerator(CancellationToken.None))
-// .Returns(new TestAsyncEnumerator(coupons.GetEnumerator()));
-
-// mockSet.As>()
-// .Setup(m => m.Provider)
-// .Returns(new TestAsyncQueryProvider(coupons.Provider));
-
-// mockSet.As>().Setup(m => m.Expression).Returns(coupons.Expression);
-// mockSet.As>().Setup(m => m.ElementType).Returns(coupons.ElementType);
-// mockSet.As>().Setup(m => m.GetEnumerator()).Returns(() => coupons.GetEnumerator());
-
-// return mockSet;
-// }
-
-// private static Mock> BuildMockSetForCartRuleUsage(IQueryable cartRules)
-// {
-// var mockSet = new Mock>();
-// mockSet.As>()
-// .Setup(m => m.GetAsyncEnumerator(CancellationToken.None))
-// .Returns(new TestAsyncEnumerator(cartRules.GetEnumerator()));
-
-// mockSet.As>()
-// .Setup(m => m.Provider)
-// .Returns(new TestAsyncQueryProvider(cartRules.Provider));
-
-// mockSet.As>().Setup(m => m.Expression).Returns(cartRules.Expression);
-// mockSet.As>().Setup(m => m.ElementType).Returns(cartRules.ElementType);
-// mockSet.As>().Setup(m => m.GetEnumerator()).Returns(() => cartRules.GetEnumerator());
-
-// return mockSet;
-// }
-
-// private static Mock> BuildMockSetForProduct(IQueryable products)
-// {
-// var mockSet = new Mock>();
-// mockSet.As>()
-// .Setup(m => m.GetAsyncEnumerator(CancellationToken.None))
-// .Returns(new TestAsyncEnumerator(products.GetEnumerator()));
-
-// mockSet.As>()
-// .Setup(m => m.Provider)
-// .Returns(new TestAsyncQueryProvider(products.Provider));
-
-// mockSet.As>().Setup(m => m.Expression).Returns(products.Expression);
-// mockSet.As>().Setup(m => m.ElementType).Returns(products.ElementType);
-// mockSet.As>().Setup(m => m.GetEnumerator()).Returns(() => products.GetEnumerator());
-
-
-// return mockSet;
-// }
-
-// #endregion
-// }
-//}