public async Task WhenExchangingMoneyAndReturnIsNullOrError_ThenThrowArgumentException() { //Arrange var fixture = new Fixture(); var fromCurrency = new Currency() { Id = 1, Name = "USD", Ratio = 1 }; var toCurrency = new Currency() { Id = 2, Name = "PHP", Ratio = 50 }; var money = new Money() { Currency = fromCurrency, Amount = 100 }; var user = fixture.Create <User>(); var request = new ExchangeMoneyRequest() { Username = user.Username, FromCurrencyId = fromCurrency.Id, ToCurrencyId = toCurrency.Id, Amount = 10 }; user.Balance.AddMoney(money); _currencyServiceMock.Setup(x => x.GetCurrencyAsync(fromCurrency.Id)).ReturnsAsync(fromCurrency); _currencyServiceMock.Setup(x => x.GetCurrencyAsync(toCurrency.Id)).ReturnsAsync(toCurrency); _userServiceMock.Setup(x => x.GetUserAsync(user.Username)).ReturnsAsync(user); _userServiceMock.Setup(x => x.UpdateUserBalance(user)).ReturnsAsync(user); //Action var target = new MoneyController(_currencyServiceMock.Object, _userServiceMock.Object); var result = await target.Exchange(request); //Assert var objectResult = result.As <ObjectResult>(); objectResult.Should().NotBeNull(); objectResult.StatusCode.Should().Be(StatusCodes.Status200OK); }
public async Task <IActionResult> Exchange([FromBody] ExchangeMoneyRequest request) { try { var fromCurrency = await _currencyService.GetCurrencyAsync(request.FromCurrencyId); var toCurrency = await _currencyService.GetCurrencyAsync(request.ToCurrencyId); var money = new Money() { Currency = fromCurrency, Amount = request.Amount }; var user = await _userService.GetUserAsync(request.Username); user.Balance.Exchange(money, toCurrency); var result = await _userService.UpdateUserBalance(user); return(Ok(result.Balance.GetAllMonies())); } catch (Exception e) { return(StatusCode(StatusCodes.Status500InternalServerError, e.Message)); } }