public async Task IncrementallyUpdatesArticleDataPartsWhenFound(Article existingArticle, ArticleRequest updatedArticle, Action <Article, ArticleRequest> validationAction)
        {
            var contextFixture = new MockBlogApiDbContextFixture();

            contextFixture.Mock
            .Setup(ctx => ctx.Find <Article>(existingArticle.Id))
            .Returns(async() =>
            {
                await Task.CompletedTask;
                return(existingArticle);
            });

            var clock = new MockClock();

            var coordinatorFixture = new UpdateArticleCoordinatorFixture
            {
                Context = contextFixture.Build(),
                Clock   = clock
            };

            var coordinator = coordinatorFixture.Build();

            Assert.False(existingArticle.Updated.HasValue);

            var result = await coordinator.TryUpdateArticle(existingArticle.Id, updatedArticle);

            contextFixture.Mock.Verify(ctx => ctx.Find <Article>(existingArticle.Id));
            contextFixture.Mock.Verify(ctx => ctx.SaveChanges());

            Assert.True(result);
            Assert.Equal(clock.Now, existingArticle.Updated.GetValueOrDefault());
            validationAction(existingArticle, updatedArticle);
        }
        public async Task ReturnsFalseWhenArticleNotFound()
        {
            var articleIdThatDoesNotExist = Guid.NewGuid();

            var contextFixture = new MockBlogApiDbContextFixture();

            contextFixture.Mock.Setup(ctx => ctx.Find <Article>(It.IsAny <Guid>()));

            var coordinatorFixture = new UpdateArticleCoordinatorFixture
            {
                Context = contextFixture.Build()
            };

            var coordinator = coordinatorFixture.Build();

            var result = await coordinator.TryUpdateArticle(articleIdThatDoesNotExist, new ArticleRequest());

            contextFixture.Mock.Verify(ctx => ctx.Find <Article>(articleIdThatDoesNotExist));
            Assert.False(result);
        }