public void WithdrawFailTest_TestsIfWithdrawValidationisReturnedTrueWhenSufficientBalanceIsNotAvailable_VerifiesThroughReturnedValue()
        {
            var mockFundsRepository                = new MockFundsRepository();
            var mockBalanceRepository              = new MockBalanceRepository();
            var mockFeeCalculationService          = new MockFeeCalculationService();
            var mockWithdrawFeesRepository         = new MockWithdrawFeesRepository();
            var mockWithdrawIdGeneratorService     = new MockWithdrawIdGeneratorService();
            var depositLimitEvaluationService      = new DepositLimitEvaluationService();
            var mockLedgerRepository               = new MockLedgerRepository();
            var mockDepositLimitRepository         = new MockDepositLimitRepository();
            var mockWithdrawLimitEvaluationService = new WithdrawLimitEvaluationService();
            var mockWithdrawLimitRepository        = new MockWithdrawLimitRepository();
            var mockTierLevelRetrievalService      = new MockTierLevelRetrievalService();
            var mockWithdrawRepository             = new MockWithdrawRepository();
            var tierValidationService              = new TierValidationService();
            var mockBboRetrievalService            = new MockBboRetrievalService();
            var mockLimitsConfigurationService     = new LimitsConfigurationService(mockDepositLimitRepository,
                                                                                    depositLimitEvaluationService, mockWithdrawLimitRepository, mockWithdrawLimitEvaluationService, mockBboRetrievalService);
            TransactionService transactionService = new TransactionService(mockFundsRepository, new MockLedgerGeneratorService(),
                                                                           mockLimitsConfigurationService);
            FundsValidationService fundsValidationService = new FundsValidationService(transactionService,
                                                                                       mockFundsRepository, mockBalanceRepository, mockFeeCalculationService, mockWithdrawFeesRepository,
                                                                                       mockWithdrawIdGeneratorService, mockLedgerRepository, depositLimitEvaluationService,
                                                                                       mockDepositLimitRepository, mockWithdrawLimitEvaluationService, mockWithdrawLimitRepository,
                                                                                       mockTierLevelRetrievalService, mockWithdrawRepository, tierValidationService, mockLimitsConfigurationService);
            Balance balance = new Balance(new Currency("XBT", true), new AccountId(123), 100, 100);

            mockBalanceRepository.AddBalance(balance);

            Withdraw withdrawalResponse = fundsValidationService.ValidateFundsForWithdrawal(balance.AccountId, balance.Currency,
                                                                                            100.0002M, new TransactionId("transaction123"), new BitcoinAddress("bitcoinid123"));

            Assert.IsNull(withdrawalResponse);
        }
        public void WithdrawConfirmedTest_TestIfWithdrawalConfirmationExecutesAsExpected_TestsThroughReturnedValue()
        {
            var mockFundsRepository                = new MockFundsRepository();
            var mockBalanceRepository              = new MockBalanceRepository();
            var mockFeeCalculationService          = new MockFeeCalculationService();
            var mockWithdrawFeesRepository         = new MockWithdrawFeesRepository();
            var mockWithdrawIdGeneratorService     = new MockWithdrawIdGeneratorService();
            var depositLimitEvaluationService      = new DepositLimitEvaluationService();
            var mockLedgerRepository               = new MockLedgerRepository();
            var mockDepositLimitRepository         = new MockDepositLimitRepository();
            var mockWithdrawLimitEvaluationService = new WithdrawLimitEvaluationService();
            var mockWithdrawLimitRepository        = new MockWithdrawLimitRepository();
            var mockTierLevelRetrievalService      = new MockTierLevelRetrievalService();
            var mockWithdrawRepository             = new MockWithdrawRepository();
            var tierValidationService              = new TierValidationService();
            var mockBboRetrievalService            = new MockBboRetrievalService();
            var mockLimitsConfigurationService     = new LimitsConfigurationService(mockDepositLimitRepository,
                                                                                    depositLimitEvaluationService, mockWithdrawLimitRepository, mockWithdrawLimitEvaluationService, mockBboRetrievalService);
            TransactionService transactionService = new TransactionService(mockFundsRepository, new MockLedgerGeneratorService(),
                                                                           mockLimitsConfigurationService);
            FundsValidationService fundsValidationService = new FundsValidationService(transactionService,
                                                                                       mockFundsRepository, mockBalanceRepository, mockFeeCalculationService, mockWithdrawFeesRepository,
                                                                                       mockWithdrawIdGeneratorService, mockLedgerRepository, depositLimitEvaluationService,
                                                                                       mockDepositLimitRepository, mockWithdrawLimitEvaluationService, mockWithdrawLimitRepository,
                                                                                       mockTierLevelRetrievalService, mockWithdrawRepository, tierValidationService, mockLimitsConfigurationService);
            Withdraw withdraw = new Withdraw(new Currency("XBT", true), "123", DateTime.Now, WithdrawType.Bitcoin, 0.4m,
                                             0.001m, TransactionStatus.Pending,
                                             new AccountId(123), new BitcoinAddress("bitcoin123"));

            Balance balance = new Balance(withdraw.Currency, withdraw.AccountId, 400, 800);

            mockBalanceRepository.AddBalance(balance);

            Withdraw withdrawalResponse = fundsValidationService.ValidateFundsForWithdrawal(withdraw.AccountId,
                                                                                            withdraw.Currency, withdraw.Amount, withdraw.TransactionId, withdraw.BitcoinAddress);

            Assert.IsNotNull(withdrawalResponse);
            bool withdrawalExecuted = fundsValidationService.WithdrawalExecuted(withdrawalResponse);

            Assert.IsTrue(withdrawalExecuted);

            Assert.AreEqual(5, mockFundsRepository.GetNumberOfObjects());
        }