public async Task IsOwnRecipientQueryHandler_ShouldReturnFalse_WhenRecipientIsForeignGroup() { // Arrange IsOwnRecipientQuery request = new IsOwnRecipientQuery { RecipientId = 1 }; IQueryable <Recipient> databaseRecipient = new[] { new Recipient { RecipientId = 1, GroupMembershipId = 1 } } .AsQueryable() .BuildMock() .Object; _unitOfWorkMock .Setup(m => m.Recipients.GetById(request.RecipientId)) .Returns(databaseRecipient); IsOwnRecipientQuery.Handler handler = new IsOwnRecipientQuery.Handler(_unitOfWorkMock.Object, _userProviderMock.Object); // Act bool isOwnRecipient = await handler.Handle(request); // Assert Assert.False(isOwnRecipient); }
public async Task <ActionResult <ChatMessageResource> > SendMessage([FromBody] SendMessageBody body, CancellationToken cancellationToken = default) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } // Check if recipient exists RecipientExistsQuery recipientExistsQuery = new RecipientExistsQuery { RecipientId = body.RecipientId }; bool recipientExists = await _mediator.Send(recipientExistsQuery, cancellationToken); if (!recipientExists) { return(NotFound(new ErrorResource { StatusCode = StatusCodes.Status404NotFound, Message = $"Recipient with ID '{body.RecipientId}' does not exist" })); } // Check if the the user wants to message himself IsOwnRecipientQuery isOwnRecipientQuery = new IsOwnRecipientQuery { RecipientId = body.RecipientId }; bool isOwnRecipient = await _mediator.Send(isOwnRecipientQuery, cancellationToken); if (isOwnRecipient) { return(StatusCode(StatusCodes.Status403Forbidden, new ErrorResource { StatusCode = StatusCodes.Status403Forbidden, Message = "You cannot write messages to yourself" })); } if (body.ParentId != null) { // Check if parent message exists MessageExistsQuery parentMessageExistsQuery = new MessageExistsQuery { MessageId = body.ParentId.Value }; bool parentMessageExists = await _mediator.Send(parentMessageExistsQuery, cancellationToken); if (!parentMessageExists) { return(NotFound(new ErrorResource { StatusCode = StatusCodes.Status404NotFound, Message = $"Parent message with ID '{body.ParentId}' does not exist" })); } // Check if the user should have access to the parent message CanAccessMessageQuery canAccessParentMessageQuery = new CanAccessMessageQuery { MessageId = body.ParentId.Value }; bool canAccessParentMessage = await _mediator.Send(canAccessParentMessageQuery, cancellationToken); if (!canAccessParentMessage) { return(StatusCode(StatusCodes.Status403Forbidden, new ErrorResource { StatusCode = StatusCodes.Status403Forbidden, Message = "You cannot answer messages from a foreign chat" })); } } // Send message to their recipients SendMessageCommand sendMessageCommand = _mapper.Map <SendMessageBody, SendMessageCommand>(body); ChatMessageResource message = await _mediator.Send(sendMessageCommand, cancellationToken); return(CreatedAtAction(nameof(GetMessageById), new { messageId = message.MessageId }, message)); }