コード例 #1
0
        public IHttpActionResult Deposit([FromBody] CreateDepositRequest request)
        {
            var account = _repositorywrapper.BankAccount.GetAccountById(request.Id);

            if (account == null)
            {
                return(NotFound());
            }

            var IsDeposit   = _repositorywrapper.BankAccount.Deposit(account.Id, request.Amount);
            var transaction = _repositorywrapper.Transactions.AddTransaction(
                account.AccountNumber,
                request.Amount,
                DateTime.Now,
                account.Id,
                IsDeposit ? nameof(Deposit) : "Nothing have been deposit");

            var response = new TransactionReponse
            {
                AccountNumber = transaction.AccountNumber,
                Balance       = account.Balance,
                Amount        = transaction.Amount,
                Date          = transaction.Date.ToString("dd-MM-yyyy"),
                BankAccountId = transaction.BankAccountId,
                Action        = transaction.Action
            };

            return(Json(response));
        }
コード例 #2
0
        public void TestDepsosit_BalanceShouldIncreaseCorrectly()
        {
            //Arrange
            var DepositRequest = new CreateDepositRequest()
            {
                Id             = 1,
                Balance        = 0,
                IBANNumber     = "123451235",
                AccountNumber  = "123451235",
                Amount         = 2000,
                ClearingNumber = "2134123"
            };

            mockService.Setup(y => y.BankAccount.GetAccountById(It.IsAny <int>())).Returns(bankAccountById);
            mockService.Setup(x => x.BankAccount.Deposit(It.IsAny <int>(), It.IsAny <int>())).Returns(true);
            mockService.Setup(x => x.Transactions.AddTransaction(It.IsAny <string>(), It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <int>(), It.IsAny <string>())).Returns(new Transaction {
                AccountNumber = "123451235", Date = DateTime.Now, BankAccountId = 1, Amount = 2500,
                Action        = "Deposit"
            });


            //Act
            var response = accountController.Deposit(DepositRequest);

            //Assert
            mockService.Verify(x => x.BankAccount.GetAccountById(It.IsAny <int>()), Times.Once());
            mockService.Verify(x => x.BankAccount.Deposit(It.IsAny <int>(), It.IsAny <int>()), Times.Once());
            mockService.Verify(x => x.Transactions.AddTransaction(It.IsAny <string>(), It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <int>(), It.IsAny <string>()));
            var result  = response.Should().BeOfType <JsonResult <TransactionReponse> >().Subject;
            var account = result.Content.Should().BeAssignableTo <TransactionReponse>().Subject;

            account.Balance.Should().Be(2500);
        }
コード例 #3
0
        private async Task <CreateDeposit> CreateDepositFromLocalCurrency(CreateDepositRequest request, CancellationToken token)
        {
            CreateDeposit deposit = new CreateDeposit(request.AccountId, Amount.FromInput(request.Amount),
                                                      Currency.FromInput(request.Currency));

            return(await Task.FromResult(deposit));
        }
コード例 #4
0
        public async Task <IActionResult> Deposit(CreateDepositRequest request, CancellationToken token)
        {
            _logger.LogInformation($"{nameof(AccountController)}.{nameof(Deposit)} - {request}");

            if (!ModelState.IsValid)
            {
                return(BadRequest($"Problem with CreateDepositRequest"));
            }

            if (!Currencies.IsValid(request.Currency.ToUpperInvariant()))
            {
                return(BadRequest($"Currency symbol entered is invalid!"));
            }

            CreateDeposit deposit = await CreateDepositFromLocalCurrency(request, token);

            if (!_options.BaseCurrency.Equals(request.Currency, StringComparison.InvariantCultureIgnoreCase))
            {
                deposit = await CreateDepositFromForeignCurrency(request, token);
            }

            DepositResult depositResult = await _accountService.Deposit(deposit);

            if (depositResult.Status == AccountStatus.Error)
            {
                return(BadRequest($"{depositResult.Message}"));
            }

            AccountDepositResponse response = new AccountDepositResponse(depositResult.AccountId,
                                                                         depositResult.Amount.Value, depositResult.Currency.Value, depositResult.OldBalance.Value,
                                                                         depositResult.NewBalance.Value);

            return(Ok(response));
        }
コード例 #5
0
        public async Task <HttpResponseMessage> Deposit(CreateDepositRequest request)
        {
            var depositRequest = JsonConvert.SerializeObject(request);
            var content        = new StringContent(depositRequest, Encoding.UTF8, "application/json");
            var requestUrl     = "http://localhost:20000/Deposit";
            var result         = await _httpClient.PostAsync(requestUrl, content);

            return(result);
        }
コード例 #6
0
        public async Task <HttpResponseMessage> TransferMoney(CreateDepositRequest request)
        {
            var transfer   = JsonConvert.SerializeObject(request);
            var content    = new StringContent(transfer, Encoding.UTF8, "Application/json");
            var requestUrl = "https://localhost:44303/api/Accounts";
            var result     = await _httpClient.PostAsync(requestUrl, content);

            return(result);
        }
コード例 #7
0
        private async Task <CreateDeposit> CreateDepositFromForeignCurrency(CreateDepositRequest request, CancellationToken token)
        {
            Rate rate = await _ratesService.GetExchangeRate(Currency.FromInput(request.Currency),
                                                            Currency.FromInput(_options.BaseCurrency),
                                                            token);

            decimal convertedAmount = request.Amount * rate.ConversionValue;

            CreateDeposit deposit = new CreateDeposit(request.AccountId, Amount.FromInput(convertedAmount),
                                                      Currency.FromInput(request.Currency));

            return(deposit);
        }
コード例 #8
0
        public async Task Deposit_RatesApi_Is_Invoked_Only_If_Currency_Is_Not_Base_Currency()
        {
            //Arrange
            var dataContext = new DataContext(_dataContextOptions.Options);
            IRepository <Account>     accountRepository     = new AccountRepository(dataContext);
            IRepository <Transaction> transactionRepository = new TransactionRepository(dataContext);
            IUnitOfWork unitOfWork  = new UnitOfWork(dataContext, accountRepository, transactionRepository);
            IGenerateId idGenerator = new IdGenerator();

            CancellationToken token = new CancellationToken();


            var mockRates = new Mock <IRatesService>();

            mockRates.Setup(a => a.GetExchangeRate(It.IsAny <Currency>(), It.IsAny <Currency>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => new Rate("GBP", "GBP", 0.79m, DateTime.Now));

            //Act
            RatesApiOption ratesApiOption = new RatesApiOption("someurl", "USD");

            IAccountService accountService =
                new AccountService(_mockAccountActionLogger.Object, unitOfWork, idGenerator);


            AccountCreationSummary accountCreationSummary = await accountService.CreateAccount(new CreateAccount("Jared", Amount.FromInput(100m)));

            AccountController accountController = new AccountController(_mockAccountControllerLogger.Object, accountService, mockRates.Object, ratesApiOption);

            CreateDepositRequest request = new CreateDepositRequest
            {
                AccountId = accountCreationSummary.AccountId, Amount = 30m, Currency = Currencies.EUR
            };


            var result = (await accountController.Deposit(request, token) as ObjectResult);


            Assert.That(accountCreationSummary, Is.Not.Null);
            Assert.That(accountCreationSummary.AccountId, Is.Not.Empty);
            Assert.That(result, Is.Not.Null);

            mockRates.Verify(a => a.GetExchangeRate(It.IsAny <Currency>(), It.IsAny <Currency>(), It.IsAny <CancellationToken>()), Times.AtLeastOnce);
        }
コード例 #9
0
        public async Task Deposit_Fails_If_Account_Id_Is_Invalid()
        {
            //Arrange
            var dataContext = new DataContext(_dataContextOptions.Options);
            IRepository <Account>     accountRepository     = new AccountRepository(dataContext);
            IRepository <Transaction> transactionRepository = new TransactionRepository(dataContext);
            IUnitOfWork unitOfWork  = new UnitOfWork(dataContext, accountRepository, transactionRepository);
            IGenerateId idGenerator = new IdGenerator();

            CancellationToken token = new CancellationToken();

            string accountIdInvalid = "Invalid account id";


            var mockRates = new Mock <IRatesService>();

            mockRates.Setup(a => a.GetExchangeRate(It.IsAny <Currency>(), It.IsAny <Currency>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(() => new Rate("GBP", "GBP", 0.79m, DateTime.Now));

            //Act
            RatesApiOption ratesApiOption = new RatesApiOption("someurl", "USD");

            IAccountService accountService =
                new AccountService(_mockAccountActionLogger.Object, unitOfWork, idGenerator);

            AccountController accountController = new AccountController(_mockAccountControllerLogger.Object, accountService, mockRates.Object, ratesApiOption);

            CreateDepositRequest request = new CreateDepositRequest
            {
                AccountId = accountIdInvalid, Amount = 101m, Currency = Currencies.EUR
            };

            var result = (await accountController.Deposit(request, token) as ObjectResult);

            Assert.That(result, Is.Not.Null);
            Assert.That(result.Value, Contains.Substring("Account id not be found"));
        }
コード例 #10
0
 public async Task <HttpResponseMessage> Transfer(CreateDepositRequest request) => await _accountServices.TransferMoney(request);