Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }