public void BitcoinAveragePriceMonitor_StopMonitoringTest()
        {
            // Arrange
            var expectedResult = 2.5;
            var mockResponseWithExpectedResult = new Mock<IRestResponse>();
            mockResponseWithExpectedResult.SetupGet(m => m.Content)
                .Returns((expectedResult).ToString());
            var mockRestClientThatReturnsMockResponse = new Mock<IRestClient>();
            mockRestClientThatReturnsMockResponse.Setup(m => m.Execute(It.IsAny<IRestRequest>()))
                .Returns(mockResponseWithExpectedResult.Object);
            var mockSettingsThatReturnsFakeBitcoinAverageUrl = new Mock<ISettings>();
            mockSettingsThatReturnsFakeBitcoinAverageUrl.SetupGet(m => m.BitcoinAverageApiUrl).Returns("http://example.com");
            var target = new BitcoinAveragePriceMonitor(mockRestClientThatReturnsMockResponse.Object, mockSettingsThatReturnsFakeBitcoinAverageUrl.Object);
            target.Frequency = 100;

            // Act
            Thread thread = new Thread(delegate ()
            {
                target.StartMonitoring();
            });
            thread.Start();
            Thread.Sleep(130);
            target.StopMonitoring();
            Thread.Sleep(130);

            // Assert
            Assert.AreEqual(expectedResult, target.CurrentPrice);
            mockRestClientThatReturnsMockResponse.Verify(m => m.Execute(It.IsAny<IRestRequest>()), Times.Exactly(2));
        }
        public void BitcoinAveragePriceMonitor_ConstructorTest()
        {
            // Arrange
            var mockSettingsThatReturnsFakeBitcoinAverageUrl =new Mock<ISettings>();
            mockSettingsThatReturnsFakeBitcoinAverageUrl.SetupGet(m => m.BitcoinAverageApiUrl).Returns("http://example.com");

            //Act
            var target = new BitcoinAveragePriceMonitor(new RestClient(), mockSettingsThatReturnsFakeBitcoinAverageUrl.Object);

            // Assert
            Assert.AreEqual(Currency.USD, target.TargetCurrency);
            Assert.AreEqual(5000, target.Frequency);
            Assert.AreEqual(TradePriceType.Last, target.PriceType);
        }
        public void BitcoinAveragePriceMonitor_FrequencyTest()
        {
            // Arrange
            var mockSettingsThatReturnsFakeBitcoinAverageUrl = new Mock<ISettings>();
            mockSettingsThatReturnsFakeBitcoinAverageUrl.SetupGet(m => m.BitcoinAverageApiUrl).Returns("http://example.com");
            var target = new BitcoinAveragePriceMonitor(new RestClient(), mockSettingsThatReturnsFakeBitcoinAverageUrl.Object);
            var originalFrequency = target.Frequency;
            var expectedFrequency = 55000;

            // Act
            target.Frequency = expectedFrequency;

            // Assert
            Assert.AreEqual(5000, originalFrequency);
            Assert.AreEqual(expectedFrequency, target.Frequency);
        }
        public void BitcoinAveragePriceMonitor_PriceTypeTest()
        {
            // Arrange
            var mockSettingsThatReturnsFakeBitcoinAverageUrl = new Mock<ISettings>();
            mockSettingsThatReturnsFakeBitcoinAverageUrl.SetupGet(m => m.BitcoinAverageApiUrl).Returns("http://example.com");
            var target = new BitcoinAveragePriceMonitor(new RestClient(), mockSettingsThatReturnsFakeBitcoinAverageUrl.Object);
            var originalPriceType = target.PriceType;
            var expectedPriceType = TradePriceType.Bid;

            // Act
            target.PriceType = expectedPriceType;

            // Assert
            Assert.AreEqual(TradePriceType.Last, originalPriceType);
            Assert.AreEqual(expectedPriceType, target.PriceType);
        }
        public void BitcoinAveragePriceMonitor_UnsubscribedObserversNotNotifiedTest()
        {
            // Arrange
            var expectedResult = 2.5; ;
            var expectedResultString = expectedResult.ToString();
            var observerGuid = Guid.NewGuid();
            var mockSettingsThatReturnsFakeBitcoinAverageUrl = new Mock<ISettings>();
            mockSettingsThatReturnsFakeBitcoinAverageUrl.SetupGet(m => m.BitcoinAverageApiUrl).Returns("http://example.com");

            var mockResponseWithExpectedResult = new Mock<IRestResponse>();
            mockResponseWithExpectedResult.SetupGet(m => m.Content).Returns(expectedResultString);
            var mockRestClientThatReturnsMockResponse = new Mock<IRestClient>();
            mockRestClientThatReturnsMockResponse.Setup(m => m.Execute(It.IsAny<IRestRequest>()))
                .Returns(mockResponseWithExpectedResult.Object);
            var mockObserver = new Mock<ITradePriceObserver>();
            mockObserver.SetupGet(m => m.ObserverId).Returns(observerGuid);
            var target = new BitcoinAveragePriceMonitor(mockRestClientThatReturnsMockResponse.Object, mockSettingsThatReturnsFakeBitcoinAverageUrl.Object);
            target.Subscribe(mockObserver.Object);
            target.Frequency = 100;

            // Act
            Thread thread = new Thread(delegate ()
            {
                target.StartMonitoring();
            });
            thread.Start();
            Thread.Sleep(130);
            target.Unsubscribe(mockObserver.Object);
            Thread.Sleep(130);
            target.StopMonitoring();

            // Assert
            mockObserver.Verify(m => m.Update(new TradePrice(expectedResult, target.TargetCurrency)), Times.Exactly(2));
        }