public void ShouldNotReturnBaseCurrencies() { var baseCurencyId = Guid.NewGuid(); var rateSyncer = new RateSyncer(new MockFExConfig { BaseCurrencyId = baseCurencyId }, new Mock <ILoggingService>().Object); var currencies = CreateCurrencyCollection(baseCurencyId); var rates = new ExchangeRateCollection { Items = new List <ExchangeRate> { new ExchangeRate { CurrencyCode = CurrencyCode.GBP, RateNew = 99 }, new ExchangeRate { CurrencyCode = CurrencyCode.EUR, RateNew = 1.2M }, new ExchangeRate { CurrencyCode = CurrencyCode.USD, RateNew = 1.4M } } }; var result = rateSyncer.Sync(currencies, rates); var gbp = result.Entities.SingleOrDefault(x => (string)x.Attributes[CurrencyAttribute.CurrencyCode] == CurrencyCode.GBP); Assert.That(gbp, Is.Null); }
public void ShouldLogWarning_WhenRateDataNotAvaliable() { var loggingService = new Mock <ILoggingService>(); var baseCurrencyId = Guid.NewGuid(); var rateSyncer = new RateSyncer(new MockFExConfig { BaseCurrencyId = baseCurrencyId }, loggingService.Object); var currencies = CreateCurrencyCollection(baseCurrencyId); var rates = new ExchangeRateCollection { Items = new List <ExchangeRate> { new ExchangeRate { CurrencyCode = CurrencyCode.GBP, RateNew = 1 }, new ExchangeRate { CurrencyCode = CurrencyCode.USD, RateNew = 1.4M } } }; rateSyncer.Sync(currencies, rates); loggingService.Verify( x => x.Trace(TraceEventType.Warning, (int)EventId.UnableToFindRateForCurrency, It.Is <string>(y => y.Contains(CurrencyCode.EUR))), Times.Once); }
public void ShouldUpdateExchangeRatesForPassedCurrencies() { var baseCurrencyId = Guid.NewGuid(); var rateSyncer = new RateSyncer(new MockFExConfig { BaseCurrencyId = baseCurrencyId }, new Mock <ILoggingService>().Object); var currencies = CreateCurrencyCollection(baseCurrencyId); var rates = new ExchangeRateCollection { Items = new List <ExchangeRate> { new ExchangeRate { CurrencyCode = CurrencyCode.GBP, RateNew = 1 }, new ExchangeRate { CurrencyCode = CurrencyCode.EUR, RateNew = 1.2M }, new ExchangeRate { CurrencyCode = CurrencyCode.USD, RateNew = 1.4M } } }; var result = rateSyncer.Sync(currencies, rates); var eur = result.Entities.Single(x => (string)x.Attributes[CurrencyAttribute.CurrencyCode] == CurrencyCode.EUR); var usd = result.Entities.Single(x => (string)x.Attributes[CurrencyAttribute.CurrencyCode] == CurrencyCode.USD); Assert.That((decimal)eur.Attributes[CurrencyAttribute.ExchangeRate], Is.EqualTo(1.2M)); Assert.That((decimal)usd.Attributes[CurrencyAttribute.ExchangeRate], Is.EqualTo(1.4M)); }
public void ShouldNotLogWarning_WhenBaseCurrencyNotSupplied() { var loggingService = new Mock <ILoggingService>(); var baseCurencyId = Guid.NewGuid(); var rateSyncer = new RateSyncer(new MockFExConfig { BaseCurrencyId = baseCurencyId }, loggingService.Object); var currencies = CreateCurrencyCollection(baseCurencyId); var rates = new ExchangeRateCollection { Items = new List <ExchangeRate> { new ExchangeRate { CurrencyCode = CurrencyCode.EUR, RateNew = 1.2M }, new ExchangeRate { CurrencyCode = CurrencyCode.USD, RateNew = 1.4M } } }; rateSyncer.Sync(currencies, rates); loggingService.Verify( x => x.Trace(TraceEventType.Warning, (int)EventId.UnableToFindRateForCurrency, It.IsAny <string>()), Times.Never); }
public void Indexed_Returns_Rate() { var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; sut[EUR, USD].Should().NotBeNull(); }
public void Indexed_Returns_No_Rate_When_Reversed_And_Different_Rates() { var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; Action action = () => { var result = sut[USD, EUR]; }; action.Should().Throw <KeyNotFoundException>(); }
public void Convenient_Construction_With_Initializer() { var sut = new ExchangeRateCollection { new ExchangeRate(EUR, USD, 5m), new ExchangeRate(EUR, AUD, 10m) }; sut.Count.Should().Be(2); }
public void Contains_For_Currencies_When_Using_Different_Rates_Both_Ways() { var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; sut.Contains(EUR, USD).Should().BeTrue(); sut.Contains(USD, EUR).Should().BeFalse(); }
public void Contains_For_Currencies_Honors_The_Direction_Of_Exchange_Rates() { var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; sut.Contains(EUR, USD).Should().BeTrue(); sut.Contains(EUR, AUD).Should().BeFalse(); sut.Contains(USD, EUR).Should().BeFalse(); }
public void Indexed_Throws_Exception_When_No_Rate_Found() { var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; Action action = () => { var _ = sut[USD, CAD]; }; action.Should().Throw <KeyNotFoundException>(); }
public void Convert_Money_Into_Different_Currency_When_Rate_Exists_Backward_Does_Not_Work() { var euros = new Money(EUR, 6); var sut = new ExchangeRateCollection() { new ExchangeRate(USD, EUR, 5m), }; var result = sut.TryConvert(euros, USD); result.Should().BeNull(); }
public void Convert_Money_Into_Different_Currency_When_Rate_Exists() { var euros = new Money(EUR, 6); var sut = new ExchangeRateCollection() { new ExchangeRate(EUR, USD, 5m), }; var result = sut.Convert(euros, USD); result.Amount.Should().Be(30); result.Currency.Should().Be(USD); }
public EntityCollection Sync(EntityCollection currencies, ExchangeRateCollection rates) { currencies.Entities.Remove(currencies.Entities.Single(x => x.Id == config.BaseCurrencyId)); foreach (var cur in currencies.Entities) { var currencyCode = (string)cur.Attributes[CurrencyAttribute.CurrencyCode]; var rate = rates.Items.SingleOrDefault(x => x.CurrencyCode.Equals(currencyCode, StringComparison.OrdinalIgnoreCase)); if (rate == null) { trace.Trace(TraceEventType.Warning, (int)EventId.UnableToFindRateForCurrency, $"Unable to find rate for currency with code {currencyCode}. Consider chossing a different data source that supplies data for your currency set."); } else { cur.Attributes[CurrencyAttribute.ExchangeRate] = rate.RateNew; var msg = $"Setting currency {currencyCode} to {rate.RateNew}"; trace.Trace(TraceEventType.Verbose, (int)EventId.CurrencySyncSetExchangeRate, msg); } } return(currencies); }
private HttpResponseMessage BuildSuccessResponse(ExchangeRateCollection rates) { return(Request.CreateResponse(HttpStatusCode.OK, rates)); }