public async Task GivenASearchTermAndRedditConfigured_GetSentimentAsync_ReturnsResults()
        {
            // Arrange.
            var          logger            = new Mock <ILogger <RedditSentimentAnalyzer.SentimentAnalyzer> >();
            var          sentimentAnalyzer = new Mock <IAzureSentimentAnalyzer>();
            var          redditSearch      = new Mock <IRedditSearch>();
            var          analyzer          = new FakeAzureSentimentAnalyzer(logger.Object, sentimentAnalyzer.Object, redditSearch.Object);
            const string subreddit         = "cryptocurrency";
            const string searchTerm        = "bitcoin";

            var redditResults = new[]
            {
                new SearchResult
                {
                    Title     = "title",
                    Content   = "content",
                    Permalink = "xyz"
                },
                new SearchResult
                {
                    Title     = "title2",
                    Content   = "content2",
                    Permalink = "xyz2"
                },
                new SearchResult
                {
                    Title     = "title3",
                    Content   = "content3",
                    Permalink = "xyz3"
                }
            };

            redditSearch.Setup(x => x.SearchAsync(subreddit, searchTerm, 100))
            .ReturnsAsync(redditResults);

            var random     = new Random();
            var sentiments = redditResults.ToDictionary(key => $"{key.Title}. {key.Content}", value => random.NextDouble());

            sentimentAnalyzer
            .Setup(x => x.GetSentimentAsync(
                       It.Is <IEnumerable <string> >(
                           words => words.SequenceEqual(redditResults.Select(redditResult => $"{redditResult.Title}. {redditResult.Content}")))))
            .ReturnsAsync(sentiments);

            // Act.
            var results = await analyzer.GetSentimentAsync(subreddit, searchTerm);

            // Assert.
            redditSearch.VerifyAll();
            sentimentAnalyzer.VerifyAll();

            results.ShouldNotBeNull();
            results.Posts.ShouldNotBeNull();
            results.Posts.ShouldNotBeEmpty();
            foreach (var result in results.Posts)
            {
                result.Title.ShouldNotBeNullOrWhiteSpace();
                result.Url.ShouldNotBeNullOrWhiteSpace();
            }
        }
        public async Task GivenASearchTermAndRedditConfiguredButNoResults_GetSentimentAsync_ReturnsNull()
        {
            // Arrange.
            var          logger            = new Mock <ILogger <RedditSentimentAnalyzer.SentimentAnalyzer> >();
            var          sentimentAnalyzer = new Mock <IAzureSentimentAnalyzer>();
            var          redditSearch      = new Mock <IRedditSearch>();
            var          analyzer          = new FakeAzureSentimentAnalyzer(logger.Object, sentimentAnalyzer.Object, redditSearch.Object);
            const string subreddit         = "cryptocurrency";
            const string searchTerm        = "bitcoin";

            var redditResults = new[]
            {
                new SearchResult
                {
                    Title     = "title",
                    Content   = "content",
                    Permalink = "xyz"
                },
                new SearchResult
                {
                    Title     = "title2",
                    Content   = "content2",
                    Permalink = "xyz2"
                },
                new SearchResult
                {
                    Title     = "title3",
                    Content   = "content3",
                    Permalink = "xyz3"
                }
            };

            redditSearch.Setup(x => x.SearchAsync(subreddit, searchTerm, 100))
            .ReturnsAsync(redditResults);

            sentimentAnalyzer.Setup(x => x.GetSentimentAsync(It.IsAny <IEnumerable <string> >()))
            .ReturnsAsync((Dictionary <string, double>)null);

            // Act.
            var results = await analyzer.GetSentimentAsync(subreddit, searchTerm);

            // Assert.
            redditSearch.VerifyAll();
            sentimentAnalyzer.VerifyAll();

            results.ShouldBeNull();
        }
        public async Task GivenASearchTermWithNothingConfigured_GetSentimentAsync_ReturnsEmptyResult()
        {
            // Arrange.
            var          logger            = new Mock <ILogger <RedditSentimentAnalyzer.SentimentAnalyzer> >();
            var          sentimentAnalyzer = new Mock <IAzureSentimentAnalyzer>();
            var          redditSearch      = new Mock <IRedditSearch>();
            var          analyzer          = new FakeAzureSentimentAnalyzer(logger.Object, sentimentAnalyzer.Object, redditSearch.Object);
            const string subreddit         = "cryptocurrency";
            const string searchTerm        = "bitcoin";

            // Act.
            var results = await analyzer.GetSentimentAsync(subreddit, searchTerm);

            // Assert.
            sentimentAnalyzer.Verify(x => x.GetSentimentAsync(It.IsAny <IEnumerable <string> >()), Times.Never);

            results.ShouldBeNull();
        }