public void AddTradeNonExistingCurrencyTest() { // Arrange. var tradesService = CreateTradesService(); // Act. var parameters = new AddTradeParameters { AskCurrencyCode = Constants.Usd, BidCurrencyCode = "ABC", SoldAmount = 210, Time = DateTime.Now, ClientName = "TestClient" }; Func <Task> action = () => tradesService.AddTradeAsync(parameters); // Assert. Assert.ThrowsExceptionAsync <IncorrectParametersException>(action).Wait(); }
public async Task AddTradeAsync(AddTradeParameters parameters) { if (parameters.SoldAmount <= 0) { throw new IncorrectParametersException("An incorrect sold amount specified"); } Currency askCurrency = (await _currencyRepository .FindAsync(x => x.Code == parameters.AskCurrencyCode)) .FirstOrDefault(); Currency bidCurrency = (await _currencyRepository .FindAsync(x => x.Code == parameters.BidCurrencyCode)) .FirstOrDefault(); if (askCurrency == null || bidCurrency == null) { throw new IncorrectParametersException("TradesService: An incorrect currency code specified"); } decimal brokerRate = await _currencyRatesProvider.GetRateAsync( parameters.BidCurrencyCode, parameters.AskCurrencyCode, parameters.Time); decimal totalEnrichmentPercent = await _configurationService.GetTotalEnrichmentPercentAsync(); decimal rateEnrichmentCoefficient = 1m / (1m + totalEnrichmentPercent / 100m); decimal clientRate = brokerRate * rateEnrichmentCoefficient; var tradeModel = new Trade { AskCurrency = askCurrency, BidCurrency = bidCurrency, SoldAmount = parameters.SoldAmount, BoughtByUsAmount = decimal.Round(parameters.SoldAmount * brokerRate, 2), BoughtByClientAmount = decimal.Round(parameters.SoldAmount * clientRate, 2), ClientName = parameters.ClientName, Time = parameters.Time }; await _tradesRepository.CreateAsync(tradeModel); }
public void AddTradeCorrectTest() { // Arrange. var currencyRatesProvider = new MockCurrencyRatesProvider(); var configurationService = new MockConfigurationService(); var tradesRepository = new TradesInMemoryRepository(); currencyRatesProvider.Rates.Add(new Tuple <string, string>(Constants.Rub, Constants.Usd), 1m / 70m); configurationService.TotalEnrichmentPercent = 50m; var tradesService = CreateTradesService( tradesRepository: tradesRepository, currencyRatesProvider: currencyRatesProvider, configurationService: configurationService); string clientName = "TestClient"; // Act. var parameters = new AddTradeParameters { AskCurrencyCode = Constants.Usd, BidCurrencyCode = Constants.Rub, SoldAmount = 210, Time = DateTime.Now, ClientName = clientName }; tradesService.AddTradeAsync(parameters).Wait(); // Assert. Assert.AreEqual(1, tradesRepository.GetQueryable().Count()); var trade = tradesRepository.GetAllAsync().Result.First(); Assert.AreEqual(Constants.Usd, trade.AskCurrency.Code); Assert.AreEqual(Constants.Rub, trade.BidCurrency.Code); Assert.AreEqual(2m, trade.BoughtByClientAmount); Assert.AreEqual(3m, trade.BoughtByUsAmount); Assert.AreEqual(clientName, trade.ClientName); }