public async Task Test_SiteManager_CreateArticle_TestLoggingExtensionMethod()
        {
            // Arange
            var loggerMock = new LoggerMock <SiteManager>()
                             .SetupLogLevel(Microsoft.Extensions.Logging.LogLevel.Information);
            var authorAccessMock = new AuthorAccessMock(new List <Author> {
                new Author {
                    Id = 666, DisplayName = "Max", Verfied = false
                }
            });
            var          articleAccessMock = new ArticleAccessMock();
            ISiteManager sut = new SiteManager(articleAccessMock.Object, authorAccessMock.Object, loggerMock.Object);

            // Act
            var request = new Kaylumah.AdventuresWithMock.Manager.Site.Interface.CreateArticleRequest
            {
                Title   = "Pretty Title",
                Content = "# AdventuresWithMock ..."
            };
            await sut.CreateArticle(request);

            // Assert
            authorAccessMock.Verify(x => x.FilterAuthors(It.IsAny <FilterAuthorCriteria>()), Times.Once);
            articleAccessMock.Verify(x => x.CreateArticles(It.IsAny <CreateArticlesRequest>()), Times.Never);
            loggerMock.VerifyLogging("Author with Id 666 is not verfied!", Microsoft.Extensions.Logging.LogLevel.Information);
            loggerMock.VerifyEventIdWasCalled(new Microsoft.Extensions.Logging.EventId(100, "AuthorNotVerfied"));
        }
        public async Task Test_ArticleAccessMock_StatefullDemo1()
        {
            // Arange
            var articleAccessMock = new ArticleAccessMock()
                                    .SetupFilterArticles(new List <Article> {
            });
            var sut = articleAccessMock.Object;

            // Act
            var initialResponse = await sut.FilterArticles();

            var createResponse = await sut.CreateArticles(new CreateArticlesRequest {
                CreateArticleRequests = new CreateArticleRequest[] {
                    new CreateArticleRequest {
                        AuthorId    = 666,
                        Description = "1",
                        Title       = "1"
                    },
                    new CreateArticleRequest {
                        AuthorId    = 666,
                        Description = "2",
                        Title       = "2"
                    }
                }
            });

            var afterAddResponse = await sut.FilterArticles();

            await sut.DeleteArticles(new DeleteArticlesRequest {
                DeleteArticleRequests = new DeleteArticleRequest[] {
                    new DeleteArticleRequest {
                        ArticleId = createResponse.Articles.First().Id
                    }
                }
            });

            var afterRemoveResponse = await sut.FilterArticles();


            // Assert
            initialResponse.Should().NotBeNull();
            initialResponse.Articles.Count().Should().Be(0, "No articles initially");

            afterAddResponse.Should().NotBeNull();
            afterAddResponse.Articles.Count().Should().Be(2, "We created two articles");

            afterRemoveResponse.Should().NotBeNull();
            afterRemoveResponse.Articles.Count().Should().Be(1, "There is only one article left");

            // Verify result with predicate logic instead if Mock.Verify()
            articleAccessMock.VerifyArticles(articles => articles.Count(x => x.Removed) == 1).Should().BeTrue();
        }
        public async Task Test_SiteManager_CreateArticle_TestLogging()
        {
            // Arange
            var loggerMock                 = new LoggerMock <SiteManager>();
            var authorAccessMock           = new AuthorAccessMock(new List <Author> {
            });
            var          articleAccessMock = new ArticleAccessMock();
            ISiteManager sut               = new SiteManager(articleAccessMock.Object, authorAccessMock.Object, loggerMock.Object);

            // Act
            var request = new Kaylumah.AdventuresWithMock.Manager.Site.Interface.CreateArticleRequest
            {
                Title   = "Pretty Title",
                Content = "# AdventuresWithMock ..."
            };
            await sut.CreateArticle(request);

            // Assert
            authorAccessMock.Verify(x => x.FilterAuthors(It.IsAny <FilterAuthorCriteria>()), Times.Once);
            articleAccessMock.Verify(x => x.CreateArticles(It.IsAny <CreateArticlesRequest>()), Times.Never);
            loggerMock.VerifyLogging("No author found for 666", Microsoft.Extensions.Logging.LogLevel.Warning);
        }
        public async Task Test_SiteManager_CreateArticle_RepoMocksDemo1()
        {
            // Arange
            var loggerMock       = new LoggerMock <SiteManager>();
            var authorAccessMock = new AuthorAccessMock(new List <Author> {
                new Author {
                    Id = 666, DisplayName = "Max", Verfied = false
                }
            });
            var          articleAccessMock = new ArticleAccessMock();
            ISiteManager sut = new SiteManager(articleAccessMock.Object, authorAccessMock.Object, loggerMock.Object);

            // Act
            var request = new Kaylumah.AdventuresWithMock.Manager.Site.Interface.CreateArticleRequest
            {
                Title   = "Pretty Title",
                Content = "# AdventuresWithMock ..."
            };
            await sut.CreateArticle(request);

            // Assert
            authorAccessMock.Verify(x => x.FilterAuthors(It.IsAny <FilterAuthorCriteria>()), Times.Once);
            articleAccessMock.Verify(x => x.CreateArticles(It.IsAny <CreateArticlesRequest>()), Times.Never);
        }