using System.Collections.Generic;
namespace InterviewTaskTests
public class OrderCreationManager
private readonly IAccountingService _accountingService;
public OrderCreationManager(IAccountingService accountingService)
_accountingService = accountingService;
public Order CreateOrder(string warehouseFrom, string shopTo, string[] productCodes, int[] productQuantities)
var items = new List<Item>();
for (int i = 0; i < productCodes.Length; i++)
var rests = _accountingService.GetRests(productCodes[i], warehouseFrom);
if (rests == 0) continue;
ProductCode = productCodes[i],
Quantity = Math.Min(rests, productQuantities[i])
public string ProductCode;
public interface IAccountingService
int GetRests(string productCode, string warehouseCode);
public void CreateOrder_WarehouseHasRests_OrderIsCreated()
var accountingService = new Mock<IAccountingService>();
.Setup(s => s.GetRests(It.IsAny<string>(), It.IsAny<string>()))
var creationManager = new OrderCreationManager(accountingService.Object);
var order = creationManager.CreateOrder("100", "200", new[] { "XX-LK" }, new[] { 10 });
Assert.That(order.From, Is.EqualTo("100"));
Assert.That(order.To, Is.EqualTo("200"));
Assert.That(order.Items, Has.Length.EqualTo(1));
Assert.That(order.Items[0].ProductCode, Is.EqualTo("XX-LK"));
Assert.That(order.Items[0].Quantity, Is.EqualTo(10));
.Setup(s => s.GetRests(It.IsAny<string>(), It.IsAny<string>()))
var order1 = creationManager.CreateOrder("100", "200", new[] { "XX-LK" }, new[] { 10 });
Assert.That(order1.From, Is.EqualTo("100"));
Assert.That(order1.To, Is.EqualTo("200"));
Assert.That(order1.Items[0].ProductCode, Is.EqualTo("XX-LK"));
Assert.That(order1.Items[0].Quantity, Is.EqualTo(5));
public void CreateOrder_WarehouseHasNoRests_EmptyOrderIsCreated()
var accountingService = new Mock<IAccountingService>();
.Setup(s => s.GetRests(It.IsAny<string>(), It.IsAny<string>()))
var creationManager = new OrderCreationManager(accountingService.Object);
var order = creationManager.CreateOrder("100", "200", new[] { "XX-LK" }, new[] { 10 });
Assert.That(order.From, Is.EqualTo("100"));
Assert.That(order.To, Is.EqualTo("200"));
Assert.That(order.Items, Has.Length.EqualTo(0));