예제 #1
0
        public async Task GivenSlugOfExistingArticle_DeletesArticleWithTags()
        {
            // Arrange
            var user = new UserProfile(Guid.NewGuid().ToString(), "*****@*****.**", "username");

            var article = new Article("test title", "test", "test", new DateTime(1111, 1, 1), user,
                                      new List <Tag> {
                new Tag("test tag")
            });

            Context.Articles.Add(article);
            await Context.SaveChangesAsync();

            var currentUser = Mock.Of <ICurrentUserService>(s => s.UserId == user.Id);

            var command = new DeleteArticleCommand {
                Slug = article.Slug
            };

            var sut = new DeleteArticleCommand.Handler(Context, currentUser);

            // Act
            await sut.Handle(command, CancellationToken.None);

            var existingArticle = await Context.Articles
                                  .SingleOrDefaultAsync(a => a.Id == article.Id);

            var tags = await Context.ArticleTags.Where(a => a.ArticleId == article.Id).ToListAsync();

            // Assert
            existingArticle.Should().BeNull();
            tags.Should().BeEmpty();
        }
예제 #2
0
        public async Task <ResultWrapper <DeleteArticleOutput> > Handle(DeleteArticleCommand request, CancellationToken cancellationToken)
        {
            ResultWrapper <DeleteArticleOutput> result = new ResultWrapper <DeleteArticleOutput>();

            try
            {
                var tData = await _dbContext.TArticle.FirstOrDefaultAsync(x => x.Id == request.Id);

                if (tData == null)
                {
                    result.Status  = false;
                    result.Message = "Article doesn't exists";
                    return(result);
                }
                if (tData.TArticleSports != null && tData.TArticleSports.Any())
                {
                    _dbContext.TArticleSport.RemoveRange(tData.TArticleSports);
                }
                _dbContext.TArticle.Remove(tData);
                await _dbContext.SaveChangesAsync();

                result.Status = true;
                result.Result = new DeleteArticleOutput()
                {
                };
            }
            catch (Exception ex)
            {
                result.Status  = false;
                result.Message = ex.Message;
            }
            return(result);
        }
        public DeleteArticleCommandTest()
        {
            this.mockArticleService          = new Mock <IArticleService>();
            this.deleteArticleCommandHandler = new DeleteArticleCommandHandler(this.mockArticleService.Object);

            this.deleteArticleCommand = new DeleteArticleCommand(TestSlug);
        }
예제 #4
0
        public DeleteArticleCommandHandlerTests()
        {
            _articleManagementService    = Mock.Of <IArticleManagementService>();
            _deleteArticleCommandHandler = new DeleteArticleCommandHandler(_articleManagementService);

            _deleteArticleCommand = new DeleteArticleCommand(SomeSlug);
        }
예제 #5
0
        public async Task DeleteArticle(DeleteArticleCommand command)
        {
            await CheckIfUserCanEditorDeleteArticle(command.UserId, command.ArticleId);

            PrepareArticleToRemove();
            await RemoveArticle();
        }
예제 #6
0
        public async Task <IActionResult> DeleteArticle(int id)
        {
            var command  = new DeleteArticleCommand(id);
            var response = await _mediator.Send(command);

            return(response.ToActionResult());
        }
예제 #7
0
 void AndGivenCommandPrepared()
 {
     _command = new DeleteArticleCommand
     {
         ArticleId = _articleId
     };
 }
        public async Task <IActionResult> Delete(
            [FromRoute] Guid id,
            CancellationToken ct = default)
        {
            var command = new DeleteArticleCommand(id);
            await Mediator.Send(command, ct);

            return(NoContent());
        }
예제 #9
0
        public async Task <ApiResult> DeleteArticleAsync([FromBody] DeleteArticleCommand command)
        {
            if (!ModelState.IsValid)
            {
                return(InValidModelsError());
            }

            _log.LogInformation("执行DeleteArticleAsync...控制器方法");

            return(await _mediator.Send(command));
        }
예제 #10
0
        public void ShouldRequireValidArticleId()
        {
            //arrange
            var command = new DeleteArticleCommand {
                Id = Guid.NewGuid()
            };

            //assert
            FluentActions.Invoking(() =>
                                   SendAsync(command)).Should().Throw <NotFoundException>();
        }
예제 #11
0
        public async Task <IActionResult> DeleteArticles(DeleteArticleCommand model)
        {
            FirebaseUser user = HttpContext.GetFirebaseUser();

            model.FireBaseId = user.UserId;
            ResultWrapper <DeleteArticleOutput> result = new ResultWrapper <DeleteArticleOutput>();

            result = await _mediator.Send(model);

            return(Ok(result));
        }
예제 #12
0
        public async Task <IActionResult> Delete(Guid id)
        {
            var command = new DeleteArticleCommand
            {
                ArticleId = id
            };

            await _mediator.Send(command);

            return(NoContent());
        }
        public void ShouldNotCallHandleIfArticleNotExist()
        {
            dbSetArticle.Setup(x => x.FindAsync(id)).Returns(null);
            context.Setup(x => x.Articles).Returns(dbSetArticle.Object);

            DeleteArticleCommandHandler deleteArticleCommandHandler = new DeleteArticleCommandHandler(context.Object, stringLocalizer.Object);
            DeleteArticleCommand        deleteArticleCommand        = new DeleteArticleCommand(id);

            Func <Task> act = async() => await deleteArticleCommandHandler.Handle(deleteArticleCommand, new CancellationToken());

            act.Should().Throw <NotFoundException>();
        }
        public async Task GivenValidDeleteArticleRequest_WhenTheArticleExistsAndIsOwnedByTheUser_ReturnsSuccessfulResponse()
        {
            // Arrange
            var deleteArticleCommand = new DeleteArticleCommand("how-to-train-your-dragon");
            await ContentHelper.GetRequestWithAuthorization(Client);

            // Act
            var response = await Client.DeleteAsync($"{ArticlesEndpoint}/{deleteArticleCommand.Slug}");

            // Assert
            response.EnsureSuccessStatusCode();
        }
예제 #15
0
        public async Task GivenTheRequestIsValid_WhenTheUserIsTheAuthorOfArticle_DeletesArticleFromDbContext()
        {
            // Arrange
            var deleteArticleCommand = new DeleteArticleCommand("Why Beer is God's Gift to the World".ToSlug());

            // Act
            var request = new DeleteArticleCommandHandler(_logger, Context, CurrentUserContext);
            var result  = await request.Handle(deleteArticleCommand, CancellationToken.None);

            // Assert, verify removal from the database
            result.ShouldNotBeNull();
            Context.Articles.FirstOrDefault(a => a.Slug == "Why Beer is God's Gift to the World".ToSlug())?.ShouldBeNull();
        }
예제 #16
0
        public async Task Delete_ExistingObject_ObjectIsDeleted()
        {
            //Arrange
            var id = 1;
            var deleteArticleCommand = new DeleteArticleCommand(_unitOfWork);
            var countBefore          = TestContext.Articles.Count();

            //Act
            var result = await deleteArticleCommand.Execute(id);

            //Assert
            Assert.That(TestContext.Articles.Count(), Is.EqualTo(countBefore - 1));
            Assert.That(result, Is.EqualTo(true));
        }
예제 #17
0
        public void TestDeleteArticleCommand_NotFound()
        {
            var mediator    = new Mock <IMediator>();
            var articleRepo = new Mock <IArticleRepo>();

            articleRepo.Setup(x => x.GetById(It.IsAny <Guid>(), It.IsAny <CancellationToken>())).Returns(Task.FromResult((Article)null));
            var deleteCommand = new DeleteArticleCommand()
            {
                Id = Guid.NewGuid()
            };
            var handler = new DeleteArticleCommand.Handler(articleRepo.Object, mediator.Object);

            Assert.ThrowsAsync <NotFoundException>(() => handler.Handle(deleteCommand, new CancellationToken()));
        }
        public async Task ShouldCallHandle()
        {
            dbSetArticle.Setup(x => x.FindAsync(id)).Returns(new ValueTask <Article>(Task.FromResult(new Article {
                Id = id
            })));
            context.Setup(x => x.Articles).Returns(dbSetArticle.Object);
            context.Setup(x => x.SaveChangesAsync(It.IsAny <CancellationToken>())).Returns(Task.FromResult(1));

            DeleteArticleCommandHandler deleteArticleCommandHandler = new DeleteArticleCommandHandler(context.Object, stringLocalizer.Object);
            DeleteArticleCommand        deleteArticleCommand        = new DeleteArticleCommand(id);

            var result = await deleteArticleCommandHandler.Handle(deleteArticleCommand, new CancellationToken());

            result.Should().Be(Unit.Value);
        }
예제 #19
0
        public async Task Delete_ExistingObject_CorrectCallsPerformed()
        {
            //Arrange
            var id = 1;
            var deleteArticleCommand = new DeleteArticleCommand(_unitOfWorkMock.Object);
            var countBefore          = TestContext.Articles.Count();

            //Act
            var result = await deleteArticleCommand.Execute(id);

            //Assert
            _articleRepositoryMock.Verify(r => r.GetArticleByIdAsync(It.IsAny <int>()), Times.Once);
            _articleRepositoryMock.Verify(r => r.Delete(It.IsAny <Article>()), Times.Once);
            _unitOfWorkMock.Verify(u => u.Commit(), Times.Once);
        }
        public void ShouldNotCallHandleIfNotSavedChanges()
        {
            dbSetArticle.Setup(x => x.FindAsync(id)).Returns(new ValueTask <Article>(Task.FromResult(new Article {
                Id = id
            })));
            context.Setup(x => x.Articles).Returns(dbSetArticle.Object);
            context.Setup(x => x.SaveChangesAsync(It.IsAny <CancellationToken>())).Returns(Task.FromResult(0));

            DeleteArticleCommandHandler deleteArticleCommandHandler = new DeleteArticleCommandHandler(context.Object, stringLocalizer.Object);
            DeleteArticleCommand        deleteArticleCommand        = new DeleteArticleCommand(id);

            Func <Task> act = async() => await deleteArticleCommandHandler.Handle(deleteArticleCommand, new CancellationToken());

            act.Should().Throw <RestException>();
        }
예제 #21
0
        public async Task Delete_NonExistingObject_ObjectIsNotDeleted()
        {
            //Arrange
            var id = 1;
            var deleteArticleCommand = new DeleteArticleCommand(_unitOfWorkMock.Object);

            _unitOfWorkMock.Setup(uow => uow.Commit()).Returns(Task.FromResult(false));

            //Act
            var result = await deleteArticleCommand.Execute(id);

            //Assert
            _articleRepositoryMock.Verify(r => r.GetArticleByIdAsync(It.IsAny <int>()), Times.Once);
            _articleRepositoryMock.Verify(r => r.Delete(It.IsAny <Article>()), Times.Once);
            Assert.That(result, Is.EqualTo(false));
        }
예제 #22
0
        public async Task GivenTheRequestIsValid_WhenTheArticleDoesNotExist_ThrowsApiExceptionForNotFound()
        {
            // Arrange
            var deleteArticleCommand = new DeleteArticleCommand("How to train your dragon".ToSlug());

            // Act
            var request = new DeleteArticleCommandHandler(_logger, Context, CurrentUserContext);

            // Assert
            await Should.ThrowAsync <ConduitApiException>(async() =>
            {
                await request.Handle(deleteArticleCommand, CancellationToken.None);
            });

            Context.Articles.FirstOrDefault(a => a.Slug == "How to train your dragon".ToSlug()).ShouldNotBeNull();
        }
        public async Task GivenValidDeleteArticleRequest_WhenTheArticleDoesNotExist_ReturnsErrorViewModelForNotFound()
        {
            // Arrange
            var deleteArticleCommand = new DeleteArticleCommand("this-is-a-fake-article");
            await ContentHelper.GetRequestWithAuthorization(Client);

            // Act
            var response = await Client.DeleteAsync($"{ArticlesEndpoint}/{deleteArticleCommand.Slug}");

            var responseContent = await ContentHelper.GetResponseContent <ErrorViewModel>(response);

            // Assert
            response.StatusCode.ShouldBe(HttpStatusCode.NotFound);
            responseContent.ShouldNotBeNull();
            responseContent.ShouldBeOfType <ErrorViewModel>();
            responseContent.Errors.ShouldNotBeNull();
        }
예제 #24
0
        public async Task GivenSlugOfNonExistingArticle_ThrowsEntityNotFoundException()
        {
            // Arrange
            var currentUser = Mock.Of <ICurrentUserService>();

            var command = new DeleteArticleCommand {
                Slug = "some slug"
            };

            var sut = new DeleteArticleCommand.Handler(Context, currentUser);

            // Act
            var action = new Func <Task <Unit> >(() => sut.Handle(command, CancellationToken.None));

            // Assert
            await action.Should().ThrowAsync <EntityNotFoundException <Article> >();
        }
        public async Task GivenValidDeleteArticleRequest_WhenTheArticleExistsAndIsNotOwnedByTheUser_ReturnsErrorViewModelForUnauthorized()
        {
            // Arrange
            var deleteArticleCommand = new DeleteArticleCommand("how-to-train-your-dragon");
            await ContentHelper.GetRequestWithAuthorization(Client, IntegrationTestConstants.SecondaryUser);

            // Act
            var response = await Client.DeleteAsync($"{ArticlesEndpoint}/{deleteArticleCommand.Slug}");

            var responseContent = await ContentHelper.GetResponseContent <ErrorViewModel>(response);

            // Assert
            response.StatusCode.ShouldBe(HttpStatusCode.Unauthorized);
            responseContent.ShouldNotBeNull();
            responseContent.ShouldBeOfType <ErrorViewModel>();
            responseContent.Errors.ShouldNotBeNull();
        }
예제 #26
0
 /// <summary>
 /// 删除文章
 /// </summary>
 /// <param name="request"></param>
 /// <param name="cancellationToken"></param>
 /// <returns></returns>
 public Task <Unit> Handle(DeleteArticleCommand request, CancellationToken cancellationToken)
 {
     if (!request.IsValid())
     {
         NotifyValidationErrors(request);
         return(Unit.Task);
     }
     _articleRepository.DeleteById(request.Id);
     if (Commit())
     {
         //提交成功,发布领域事件
         _bus.RaiseEvent(new DomainNotification(nameof(DeleteArticleCommand), "删除成功"));
     }
     else
     {
         _bus.RaiseEvent(new DomainNotification(nameof(DeleteArticleCommand), "删除失败,请稍后再试"));
     }
     return(Unit.Task);
 }
예제 #27
0
        public async Task DeleteArticleCommandTestAsync(string identityUserId, int articleId, DeleteArticleResponse result)
        {
            DeleteArticleCommand request = new DeleteArticleCommand
            {
                Id             = articleId,
                IdentityUserId = identityUserId,
            };
            DeleteArticleCommandHandler handler = new DeleteArticleCommandHandler(_deleteFixture.Context);
            var expectedResult = await handler.Handle(request, new CancellationToken());

            Assert.Equal(expectedResult.IsSuccessful, result.IsSuccessful);
            if (expectedResult.IsSuccessful)
            {
                Article deletedArticle = _deleteFixture.Context.Articles.Find(expectedResult.Id);
                Assert.Null(deletedArticle);
                Assert.Equal(expectedResult.ViewRole, result.ViewRole);
                Assert.Equal(expectedResult.EditRole, result.EditRole);
            }
            Assert.Equal(expectedResult.Message, result.Message);
        }
        public async Task ShouldDeleteArticle()
        {
            await Helper.EnsureUserIsCreatedAndSetInDatabaseContext();

            var articleDto = await Helper.CreateDefaultArticle_ReturnDefaultArticleDto();

            var originalArticleCount = await SliceFixture.ExecuteDbContextAsync(db => db.Articles.CountAsync());

            Assert.AreEqual(1, originalArticleCount);

            var deleteCommand = new DeleteArticleCommand(articleDto.Slug);

            await SliceFixture.ExecuteDbContextAsync(async (ctx, mediator) =>
            {
                await mediator.Send(deleteCommand);
            });

            var actualArticleCount = await SliceFixture.ExecuteDbContextAsync(db => db.Articles.CountAsync());

            Assert.AreEqual(0, actualArticleCount);
        }
예제 #29
0
        public async Task GivenUserThatIsNotAuthor_ThrowsBadRequestException()
        {
            // Arrange
            var article = new Article("test title", "test", "test", new DateTime(1111, 1, 1),
                                      new UserProfile(Guid.NewGuid().ToString(), "*****@*****.**", "username"));

            Context.Articles.Add(article);
            await Context.SaveChangesAsync();

            var currentUser = Mock.Of <ICurrentUserService>();

            var command = new DeleteArticleCommand {
                Slug = article.Slug
            };

            var sut = new DeleteArticleCommand.Handler(Context, currentUser);

            // Act
            var action = new Func <Task <Unit> >(() => sut.Handle(command, CancellationToken.None));

            // Assert
            await action.Should().ThrowAsync <BadRequestException>();
        }
예제 #30
0
        public async Task <IActionResult> DeleteArticle([FromBody] DeleteArticleCommand command)
        {
            var actionName = ControllerContext.ActionDescriptor.ActionName;

            try
            {
                _logger.LogMessage(actionName, JsonConvert.SerializeObject(command), LogEventLevel.Information);
                return(Ok(await Mediator.Send(command)));
            }
            catch (ValidationException exception)
            {
                return(StatusCode(badRequestErrorCode, JsonConvert.SerializeObject(exception.Failures)));
            }
            catch (DbUpdateConcurrencyException exception)
            {
                _logger.LogException(exception, actionName, JsonConvert.SerializeObject(command) + " " + JsonConvert.SerializeObject(command));
                return(StatusCode(notFoundErrorCode, _configuration.DisplayObjectNotFoundErrorMessage));
            }
            catch (Exception exception)
            {
                _logger.LogException(exception, actionName, JsonConvert.SerializeObject(command) + " " + JsonConvert.SerializeObject(command));
                return(StatusCode(internalServerErrorCode, _configuration.ErrorMessage));
            }
        }