コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        public void Indexed_Returns_Rate()
        {
            var sut = new ExchangeRateCollection()
            {
                new ExchangeRate(EUR, USD, 5m),
            };

            sut[EUR, USD].Should().NotBeNull();
        }
コード例 #6
0
        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>();
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        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();
        }
コード例 #9
0
        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();
        }
コード例 #10
0
        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>();
        }
コード例 #11
0
        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();
        }
コード例 #12
0
        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);
        }
コード例 #13
0
ファイル: RateSyncer.cs プロジェクト: Recodify/FEx.CRM
        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);
        }
コード例 #14
0
 private HttpResponseMessage BuildSuccessResponse(ExchangeRateCollection rates)
 {
     return(Request.CreateResponse(HttpStatusCode.OK, rates));
 }