public async Task <ResponseDTO> RegisterExchangeRate(RegisterExchangeRateRequest request)
        {
            if (request.Target == request.Base)
            {
                return(ResponseDTO.Fail("Base and target currency can't be the same."));
            }

            var baseCurrency = await _context.CurrencySymbols.AsNoTracking()
                               .FirstOrDefaultAsync(x => x.Symbol == request.Base);

            var targetCurrency = await _context.CurrencySymbols.AsNoTracking()
                                 .FirstOrDefaultAsync(x => x.Symbol == request.Target);

            var currencyExistAndIsEnabled = CurrencyExistAndIsEnabled(baseCurrency, request.Base);

            if (!currencyExistAndIsEnabled)
            {
                return(currencyExistAndIsEnabled);
            }

            var targetCurrencyExist = CurrencyExistAndIsEnabled(targetCurrency, request.Target);

            if (!targetCurrencyExist)
            {
                return(targetCurrencyExist);
            }

            var exchangeRate = new Domain.ExchangeRate(request.Base, request.Target, request.Rate);

            _context.ExchangeRates.Add(exchangeRate);
            await _context.SaveChangesAsync();

            return(ResponseDTO.Ok());
        }
        public async Task RegisterExchangeRateReturnsSuccessFalseGivenTargetCurrencyIsDisabled()
        {
            //Arrange
            var context = CreateEmptyContext();

            context.CurrencySymbols.Add(new CurrencySymbol("USD")
            {
                Enabled = true
            });
            context.CurrencySymbols.Add(new CurrencySymbol("EUR")
            {
                Enabled = false
            });
            await context.SaveChangesAsync();

            var appService = new ExchangeRateWriteService(context);
            var request    = new RegisterExchangeRateRequest()
            {
                Base = "USD", Rate = 1.1m, Target = "EUR", UserId = "fake"
            };

            //Act
            var response = await appService.RegisterExchangeRate(request);

            //Assert
            Assert.IsNotNull(response);
            Assert.IsFalse(response.Success);
        }
        public async Task RegisterExchangeRateReturnsSuccessTrueGivenValidRequest()
        {
            //Arrange
            const string  baseCurrency   = "USD";
            const string  targetCurrency = "EUR";
            const decimal rate           = 1.1m;
            var           context        = CreateEmptyContext();

            context.CurrencySymbols.Add(new CurrencySymbol(baseCurrency));
            context.CurrencySymbols.Add(new CurrencySymbol(targetCurrency));
            await context.SaveChangesAsync();

            var appService = new ExchangeRateWriteService(context);
            var request    = new RegisterExchangeRateRequest()
            {
                Base = baseCurrency, Rate = rate, Target = targetCurrency, UserId = "fake"
            };

            //Act
            var response = await appService.RegisterExchangeRate(request);

            var exchangeRate = await context.ExchangeRates
                               .FirstAsync(x => x.BaseSymbol == baseCurrency && x.TargetSymbol == targetCurrency);

            //Assert
            Assert.IsNotNull(response);
            Assert.IsTrue(response.Success);
            Assert.IsNotNull(exchangeRate);
            Assert.AreEqual(rate, exchangeRate.Rate);
        }
        public async Task <IActionResult> Post([FromBody] RegisterExchangeRateRequest request)
        {
            var response = await _exchangeRateWriteService.RegisterExchangeRate(request);

            if (response.Success)
            {
                return(Ok());
            }

            return(BadRequest(response));
        }
        public async Task RegisterExchangeRateReturnsSuccessFalseGivenBaseCurrencyDoesntExist()
        {
            //Arrange
            var context    = CreateEmptyContext();
            var request    = new RegisterExchangeRateRequest();
            var appService = new ExchangeRateWriteService(context);
            //Act
            var response = await appService.RegisterExchangeRate(request);

            //Assert
            Assert.IsNotNull(response);
            Assert.IsFalse(response.Success);
        }