public void ShouldWriteHistoryOfSuccessfulTransactions()
        {
            //Arrange
            TransactionArguments args = new TransactionArguments();

            args.SellerId = 1;
            args.BuyerId  = 2;
            args.SharesId = 1;
            args.Quantity = 5;

            //Act
            transactionService.MakeTransaction(args);

            //Assert
            transactionHistoryTableRepository.Received(1).Add(Arg.Is <TransactionHistoryEntity>(s =>
                                                                                                s.Seller == clientTableRepository.GetById(args.SellerId) &&
                                                                                                s.Buyer == clientTableRepository.GetById(args.BuyerId) &&
                                                                                                s.SelledItem == sharesTableRepository.GetById(args.SharesId) &&
                                                                                                s.Quantity == args.Quantity &&
                                                                                                s.Total == sharesTableRepository.GetById(args.SharesId).Price *args.Quantity));
            transactionHistoryTableRepository.Received(1).SaveChanges();
        }
        private void ValidateTransaction(TransactionArguments args)
        {
            if (args.Quantity <= 0)
            {
                throw new ArgumentException($"Wrong quantity : {args.Quantity}");
            }
            if (!clientTableRepository.ContainsById(args.SellerId))
            {
                throw new ArgumentException($"Client with Id {args.SellerId} doesn't exist");
            }
            if (!clientTableRepository.ContainsById(args.BuyerId))
            {
                throw new ArgumentException($"Client with Id {args.BuyerId} doesn't exist");
            }
            if (!sharesTableRepository.ContainsById(args.SharesId))
            {
                throw new ArgumentException($"Shares with Id {args.SharesId} don't exist");
            }
            var buyer = clientTableRepository.GetById(args.BuyerId);

            if (buyer.Balance <= 0)
            {
                throw new ArgumentException(string.Format($"Buyer is in the {0} zone",
                                                          buyer.Balance < 0 ? "Black" : "Orange"));
            }
            var seller = clientTableRepository.GetById(args.SellerId);

            foreach (var item in seller.Portfolio)
            {
                if (item.Shares.Id == args.SharesId && item.Quantity >= args.Quantity)
                {
                    return;
                }
            }
            throw new ArgumentException($"Not enough shares to sell");
        }