Skip to content

Commit 64c00e2

Browse files
committed
#1093: Unit test for stock update
1 parent 8c5cdd6 commit 64c00e2

File tree

2 files changed

+108
-58
lines changed

2 files changed

+108
-58
lines changed

test/SimplCommerce.Module.Inventory.Tests/SimplCommerce.Module.Inventory.Tests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
<ItemGroup>
99
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
1010
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
11+
<PackageReference Include="MockQueryable.Moq" Version="7.0.1" />
1112
<PackageReference Include="Moq" Version="4.20.69" />
13+
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
1214
<PackageReference Include="xunit" Version="2.5.3" />
1315
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3">
1416
<PrivateAssets>all</PrivateAssets>
Lines changed: 106 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,114 @@
1-
//using System.Collections.Generic;
2-
//using System.Diagnostics;
3-
//using System.Linq;
4-
//using System.Threading.Tasks;
5-
//using Moq;
6-
//using SimplCommerce.Infrastructure.Data;
7-
//using SimplCommerce.Module.Catalog.Models;
8-
//using SimplCommerce.Module.Inventory.Models;
9-
//using SimplCommerce.Module.Inventory.Services;
10-
//using Xunit;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using System.Linq.Expressions;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using MediatR;
9+
using Microsoft.AspNetCore.Components.Forms;
10+
using Microsoft.EntityFrameworkCore;
11+
using MockQueryable.Moq;
12+
using Moq;
13+
using SimplCommerce.Infrastructure.Data;
14+
using SimplCommerce.Module.Catalog.Models;
15+
using SimplCommerce.Module.Inventory.Event;
16+
using SimplCommerce.Module.Inventory.Models;
17+
using SimplCommerce.Module.Inventory.Services;
18+
using Xunit;
1119

12-
//namespace SimplCommerce.Module.Inventory.Tests
13-
//{
14-
// public class StockServiceTests
15-
// {
16-
// private Mock<IRepository<Stock>> _stockRepoMock;
17-
// private Mock<IRepository<Product>> _productRepoMock;
18-
// private readonly Mock<IRepository<StockHistory>> _stockHistoryRepoMock;
19-
// private readonly Warehouse _testWarehouse = new Warehouse(100) {VendorId = 123};
20+
namespace SimplCommerce.Module.Inventory.Tests
21+
{
22+
public class StockServiceTests
23+
{
24+
private Mock<IRepository<Stock>> _stockRepoMock;
25+
private Mock<IRepository<Product>> _productRepoMock;
26+
private Mock<IMediator> _mediatorMock;
27+
private readonly Mock<IRepository<StockHistory>> _stockHistoryRepoMock;
28+
private readonly Warehouse _testWarehouse = new Warehouse(100) {VendorId = 123};
2029

21-
// public StockServiceTests()
22-
// {
23-
// _stockHistoryRepoMock = new Mock<IRepository<StockHistory>>();
24-
// }
30+
public StockServiceTests()
31+
{
32+
_stockHistoryRepoMock = new Mock<IRepository<StockHistory>>();
33+
_mediatorMock = new Mock<IMediator>();
34+
}
2535

26-
// [Theory]
27-
// [InlineData(100, 50)]
28-
// [InlineData(1000, 560)]
29-
// [InlineData(13, 5)]
30-
// [InlineData(143, 0)]
31-
// public async Task AddAllProductsTest(int productsCount, int stocksCount)
32-
// {
33-
// InitializeMocks(productsCount, stocksCount);
34-
// var service = new StockService(_stockRepoMock.Object, _productRepoMock.Object,
35-
// _stockHistoryRepoMock.Object);
36-
// await service.AddAllProduct(_testWarehouse);
36+
/* [Theory]
37+
[InlineData(100, 50)]
38+
[InlineData(1000, 560)]
39+
[InlineData(13, 5)]
40+
[InlineData(143, 0)]
41+
public async Task AddAllProductsTest(int productsCount, int stocksCount)
42+
{
43+
InitializeMocks(productsCount, stocksCount);
44+
var service = new StockService(_stockRepoMock.Object, _productRepoMock.Object,
45+
_stockHistoryRepoMock.Object, _mediatorMock.Object);
46+
await service.AddAllProduct(_testWarehouse);
3747
38-
// _stockRepoMock.Verify(m =>
39-
// m.AddRange(It.Is<IEnumerable<Stock>>(arg => arg.Count() == productsCount - stocksCount)));
40-
// }
48+
_stockRepoMock.Verify(m =>
49+
m.AddRange(It.Is<IEnumerable<Stock>>(arg => arg.Count() == productsCount - stocksCount)));
50+
}*/
4151

42-
// private void InitializeMocks(int productsCount, int stocksCount)
43-
// {
44-
// _stockRepoMock = new Mock<IRepository<Stock>>();
45-
// var stocks = new Stock[stocksCount];
46-
// for (int i = 1; i <= stocks.Length; i++)
47-
// {
48-
// stocks[i - 1] = new Stock
49-
// { ProductId = i, Quantity = 5, WarehouseId = _testWarehouse.Id };
50-
// }
52+
private void InitializeMocks(int productsCount, int stocksCount)
53+
{
54+
_stockRepoMock = new Mock<IRepository<Stock>>();
55+
var stocks = new Stock[stocksCount];
56+
for (int i = 1; i <= stocks.Length; i++)
57+
{
58+
stocks[i - 1] = new Stock
59+
{ ProductId = i, Quantity = 5, WarehouseId = _testWarehouse.Id };
60+
}
5161

52-
// _stockRepoMock.Setup(x => x.Query()).Returns(() => new TestAsyncEnumerable<Stock>(stocks.AsQueryable()));
53-
// _stockRepoMock.Setup(x => x.AddRange(It.IsAny<IEnumerable<Stock>>()));
54-
// _productRepoMock = new Mock<IRepository<Product>>();
55-
// var products = new Product[productsCount];
62+
var stocksMock = stocks.BuildMock();
63+
_stockRepoMock.Setup(x => x.Query()).Returns(stocksMock);
64+
_stockRepoMock.Setup(x => x.AddRange(It.IsAny<IEnumerable<Stock>>()));
5665

57-
// for (int i = 1; i <= products.Length; i++)
58-
// {
59-
// products[i - 1] = new Product { HasOptions = false, VendorId = _testWarehouse.VendorId };
60-
// typeof(Product).GetProperty("Id").SetValue(products[i - 1], i);
61-
// }
66+
_productRepoMock = new Mock<IRepository<Product>>();
67+
var products = new Product[productsCount];
68+
for (int i = 1; i <= products.Length; i++)
69+
{
70+
products[i - 1] = new Product { HasOptions = false, VendorId = _testWarehouse.VendorId };
71+
typeof(Product).GetProperty("Id").SetValue(products[i - 1], i);
72+
}
6273

63-
// _productRepoMock.Setup(x => x.Query()).Returns(new TestAsyncEnumerable<Product>(products.AsQueryable()));
64-
// }
65-
// }
66-
//}
74+
var productsMock = products.BuildMock();
75+
_productRepoMock.Setup(x => x.Query()).Returns(productsMock);
76+
77+
_mediatorMock
78+
.Setup(m => m.Send(It.IsAny<ProductBackInStock>(), It.IsAny<CancellationToken>()))
79+
.ReturnsAsync(Task.CompletedTask);
80+
}
81+
82+
[Theory]
83+
[InlineData(1, 1, -5)]
84+
[InlineData(1, 1, -10)]
85+
[InlineData(1, 1, 7)]
86+
[InlineData(1, 1, 0)]
87+
[InlineData(1, 1, -2)]
88+
public async Task UpdateStockTest(int productsCount, int stocksCount, int adjustedQuantity)
89+
{
90+
InitializeMocks(productsCount, stocksCount);
91+
92+
var service = new StockService(_stockRepoMock.Object, _productRepoMock.Object,
93+
_stockHistoryRepoMock.Object, _mediatorMock.Object);
94+
95+
var product = _productRepoMock.Object.Query().FirstOrDefault();
96+
var stock = _stockRepoMock.Object
97+
.Query()
98+
.FirstOrDefault(o => o.ProductId == product.Id && o.WarehouseId == _testWarehouse.Id);
99+
var prevStockQuantity = stock.Quantity;
100+
101+
var request = new StockUpdateRequest
102+
{
103+
AdjustedQuantity = adjustedQuantity,
104+
ProductId = product.Id,
105+
WarehouseId = _testWarehouse.Id,
106+
};
107+
108+
await service.UpdateStock(request);
109+
110+
var newStockQuantity = stock.Quantity;
111+
Assert.Equal(Math.Max(0, prevStockQuantity + adjustedQuantity), newStockQuantity);
112+
}
113+
}
114+
}

0 commit comments

Comments
 (0)