public void GetLatestTradeDate_WhenRepositoryReturnsLatestTradeDate_ItIsReturned()
        {
            // Arrange
            Mock <ITradeDateRepository> tradeDateRepository = new Mock <ITradeDateRepository>();
            TradeDate tradeDate = new TradeDate(new DateTime(2018, 12, 31), true, true, true);

            tradeDateRepository.Setup(r => r.GetLatestTradeDate())
            .Returns(Maybe.Create <TradeDate>(tradeDate));

            // Act
            TradeDateService service = new TradeDateService(tradeDateRepository.Object);
            var result = service.GetLatestTradeDate();

            // Assert
            result.IsSuccess.Should().BeTrue();
            result.Value.Should().Be(tradeDate);
        }
        public void GetLatestTradeDate_WhenRepositoryHasNoTradeDates_ApplicationErrorFailureIsReturned()
        {
            // Arrange
            Mock <ITradeDateRepository> tradeDateRepository = new Mock <ITradeDateRepository>();

            tradeDateRepository.Setup(r => r.GetLatestTradeDate())
            .Returns(Maybe.Create <TradeDate>(null));

            // Act
            TradeDateService service = new TradeDateService(tradeDateRepository.Object);
            var result = service.GetLatestTradeDate();

            // Assert
            result.IsSuccess.Should().BeFalse();
            result.Value.Should().BeNull();
            result.Error.Should().BeOfType <ApplicationError>();
        }
        public void GetTradeDates_WhenNoTradeDatesExist_ReturnsFailureResultWithApplicationError()
        {
            // Arrange
            Mock <ITradeDateRepository> tradeDateRepository = new Mock <ITradeDateRepository>();
            List <TradeDate>            tradeDates          = new List <TradeDate>();

            tradeDateRepository.Setup(r => r.GetTradeDates())
            .Returns(tradeDates);

            // Act
            TradeDateService service = new TradeDateService(tradeDateRepository.Object);
            var result = service.GetTradeDates();

            // Assert
            result.IsSuccess.Should().BeFalse();
            result.Value.Should().BeNull();
            result.Error.Should().BeOfType <ApplicationError>();
        }
        public void GetTradeDate_WhenTradeDateDoesNotExist_ReturnsInvalidTradeDateErrorResult()
        {
            // Arrange
            DateTime date = new DateTime(2018, 12, 31);

            Mock <ITradeDateRepository> tradeDateRepository = new Mock <ITradeDateRepository>();

            tradeDateRepository.Setup(r => r.GetTradeDate(date))
            .Returns(Maybe.Create <TradeDate>(null));

            // Act
            TradeDateService service = new TradeDateService(tradeDateRepository.Object);
            var result = service.GetTradeDate(date);

            // Assert
            result.IsSuccess.Should().BeFalse();
            result.Error.Should().BeOfType <InvalidTradeDateError>();
            ((InvalidTradeDateError)result.Error).Date.Should().Be(date);
            result.Value.Should().BeNull();
        }
        public void GetTradeDates_WhenTradeDatesExist_ReturnsListOfTradeDatesInSuccessfulResult()
        {
            // Arrange
            Mock <ITradeDateRepository> tradeDateRepository = new Mock <ITradeDateRepository>();
            List <TradeDate>            tradeDates          = new List <TradeDate>()
            {
                new TradeDate(new DateTime(2018, 12, 27), false, false, false),
                new TradeDate(new DateTime(2018, 12, 28), false, false, false),
                new TradeDate(new DateTime(2018, 12, 31), true, true, true)
            };

            tradeDateRepository.Setup(r => r.GetTradeDates())
            .Returns(tradeDates);

            // Act
            TradeDateService service = new TradeDateService(tradeDateRepository.Object);
            var result = service.GetTradeDates();

            // Assert
            result.IsSuccess.Should().BeTrue();
            result.Value.Count.Should().Be(tradeDates.Count);
        }