|
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; |
11 | 19 |
|
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}; |
20 | 29 |
|
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 | + } |
25 | 35 |
|
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); |
37 | 47 |
|
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 | + }*/ |
41 | 51 |
|
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 | + } |
51 | 61 |
|
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>>())); |
56 | 65 |
|
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 | + } |
62 | 73 |
|
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