github.com/status-im/status-go@v1.1.0/protocol/messenger_delete_messages_test.go (about)

     1  package protocol
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/suite"
     8  
     9  	"github.com/status-im/status-go/protocol/common"
    10  	"github.com/status-im/status-go/protocol/communities"
    11  	"github.com/status-im/status-go/protocol/protobuf"
    12  	"github.com/status-im/status-go/protocol/requests"
    13  )
    14  
    15  func TestMessengerDeleteMessagesSuite(t *testing.T) {
    16  	suite.Run(t, new(MessengerDeleteMessagesSuite))
    17  }
    18  
    19  type MessengerDeleteMessagesSuite struct {
    20  	CommunitiesMessengerTestSuiteBase
    21  	owner *Messenger
    22  	admin *Messenger
    23  	bob   *Messenger
    24  }
    25  
    26  func (s *MessengerDeleteMessagesSuite) SetupTest() {
    27  	s.CommunitiesMessengerTestSuiteBase.SetupTest()
    28  
    29  	s.owner = s.newMessenger("", []string{})
    30  	s.bob = s.newMessenger(bobPassword, []string{bobAddress})
    31  	s.admin = s.newMessenger(alicePassword, []string{aliceAddress1})
    32  
    33  	_, err := s.owner.Start()
    34  	s.Require().NoError(err)
    35  	_, err = s.bob.Start()
    36  	s.Require().NoError(err)
    37  	_, err = s.admin.Start()
    38  	s.Require().NoError(err)
    39  }
    40  
    41  func (s *MessengerDeleteMessagesSuite) TearDownTest() {
    42  	TearDownMessenger(&s.Suite, s.owner)
    43  	TearDownMessenger(&s.Suite, s.bob)
    44  	TearDownMessenger(&s.Suite, s.admin)
    45  	s.CommunitiesMessengerTestSuiteBase.TearDownTest()
    46  }
    47  
    48  func (s *MessengerDeleteMessagesSuite) sendMessageAndCheckDelivery(sender *Messenger, text string, chatID string) *common.Message {
    49  	ctx := context.Background()
    50  	messageToSend := common.NewMessage()
    51  	messageToSend.ChatId = chatID
    52  	messageToSend.ContentType = protobuf.ChatMessage_TEXT_PLAIN
    53  	messageToSend.Text = text
    54  	response, err := sender.SendChatMessage(ctx, messageToSend)
    55  	s.Require().NoError(err)
    56  	s.Require().Len(response.Messages(), 1)
    57  
    58  	var message *common.Message
    59  	if sender.identity != s.admin.identity {
    60  		response, err := WaitOnMessengerResponse(s.admin, func(response *MessengerResponse) bool {
    61  			return len(response.Messages()) == 1
    62  		}, "admin did not receive message")
    63  		s.Require().NoError(err)
    64  		message = response.Messages()[0]
    65  		s.Require().Equal(messageToSend.Text, message.Text)
    66  	}
    67  
    68  	if sender.identity != s.owner.identity {
    69  		response, err = WaitOnMessengerResponse(s.owner, func(response *MessengerResponse) bool {
    70  			return len(response.Messages()) == 1
    71  		}, "owner did not receive message")
    72  		s.Require().NoError(err)
    73  		message = response.Messages()[0]
    74  		s.Require().Equal(messageToSend.Text, message.Text)
    75  	}
    76  
    77  	if sender.identity != s.bob.identity {
    78  		response, err = WaitOnMessengerResponse(s.bob, func(response *MessengerResponse) bool {
    79  			return len(response.Messages()) == 1
    80  		}, "bob did not receive message")
    81  		s.Require().NoError(err)
    82  		message = response.Messages()[0]
    83  		s.Require().Equal(messageToSend.Text, message.Text)
    84  	}
    85  
    86  	return message
    87  }
    88  
    89  func (s *MessengerDeleteMessagesSuite) checkStoredMemberMessagesAmount(messenger *Messenger, memberPubKey string, expectedAmount int, communityID string) {
    90  	storedMessages, err := messenger.GetCommunityMemberAllMessages(
    91  		&requests.CommunityMemberMessages{
    92  			CommunityID:     communityID,
    93  			MemberPublicKey: memberPubKey})
    94  	s.Require().NoError(err)
    95  	s.Require().Len(storedMessages, expectedAmount)
    96  }
    97  
    98  func (s *MessengerDeleteMessagesSuite) checkAllMembersHasMemberMessages(memberPubKey string, expectedAmount int, communityID string) {
    99  	s.checkStoredMemberMessagesAmount(s.bob, memberPubKey, expectedAmount, communityID)
   100  	s.checkStoredMemberMessagesAmount(s.owner, memberPubKey, expectedAmount, communityID)
   101  	s.checkStoredMemberMessagesAmount(s.admin, memberPubKey, expectedAmount, communityID)
   102  }
   103  
   104  func (s *MessengerDeleteMessagesSuite) TestDeleteMessageErrors() {
   105  	community, communityChat := createCommunity(&s.Suite, s.owner)
   106  
   107  	advertiseCommunityTo(&s.Suite, community, s.owner, s.admin)
   108  	joinCommunity(&s.Suite, community.ID(), s.owner, s.admin, alicePassword, []string{aliceAddress1})
   109  
   110  	community, err := s.owner.GetCommunityByID(community.ID())
   111  	s.Require().NoError(err)
   112  
   113  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   114  	joinCommunity(&s.Suite, community.ID(), s.owner, s.bob, bobPassword, []string{bobAddress})
   115  
   116  	grantPermission(&s.Suite, community, s.owner, s.admin, protobuf.CommunityMember_ROLE_ADMIN)
   117  
   118  	bobMessage := s.sendMessageAndCheckDelivery(s.bob, "bob message", communityChat.ID)
   119  
   120  	expectedMsgsToRemove := 1
   121  	communityID := community.IDString()
   122  	s.checkAllMembersHasMemberMessages(s.bob.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   123  
   124  	// empty request
   125  	deleteMessagesRequest := &requests.DeleteCommunityMemberMessages{}
   126  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   127  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidCommunityID)
   128  
   129  	// only community ID provided
   130  	deleteMessagesRequest.CommunityID = community.ID()
   131  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   132  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidMemberID)
   133  
   134  	// only community ID and member ID provided, but delete flag false and no messages IDs
   135  	deleteMessagesRequest.MemberPubKey = s.bob.IdentityPublicKeyString()
   136  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   137  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidDeleteMessagesByID)
   138  
   139  	// message provided without id
   140  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   141  		ChatId: bobMessage.ChatId,
   142  	}}
   143  
   144  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   145  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidMsgID)
   146  
   147  	// message provided without chatId
   148  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   149  		Id: bobMessage.ID,
   150  	}}
   151  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   152  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidMsgChatID)
   153  
   154  	// messages id provided but with flag deleteAll
   155  	deleteMessagesRequest.CommunityID = community.ID()
   156  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   157  		Id:     bobMessage.ID,
   158  		ChatId: bobMessage.ChatId,
   159  	}}
   160  	deleteMessagesRequest.DeleteAll = true
   161  	_, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   162  	s.Require().ErrorIs(err, requests.ErrDeleteCommunityMemberMessagesInvalidDeleteAll)
   163  
   164  	// bob tries to delete his own message
   165  	deleteMessagesRequest.DeleteAll = false
   166  	_, err = s.bob.DeleteCommunityMemberMessages(deleteMessagesRequest)
   167  	s.Require().ErrorIs(err, communities.ErrNotEnoughPermissions)
   168  
   169  	// admin tries to delete owner message
   170  	deleteMessagesRequest.MemberPubKey = s.owner.IdentityPublicKeyString()
   171  	_, err = s.admin.DeleteCommunityMemberMessages(deleteMessagesRequest)
   172  	s.Require().ErrorIs(err, communities.ErrNotOwner)
   173  }
   174  
   175  func (s *MessengerDeleteMessagesSuite) TestDeleteMessage() {
   176  	community, communityChat := createCommunity(&s.Suite, s.owner)
   177  
   178  	advertiseCommunityTo(&s.Suite, community, s.owner, s.admin)
   179  	joinCommunity(&s.Suite, community.ID(), s.owner, s.admin, alicePassword, []string{aliceAddress1})
   180  
   181  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   182  	joinCommunity(&s.Suite, community.ID(), s.owner, s.bob, bobPassword, []string{bobAddress})
   183  
   184  	grantPermission(&s.Suite, community, s.owner, s.admin, protobuf.CommunityMember_ROLE_ADMIN)
   185  
   186  	bobMessage := s.sendMessageAndCheckDelivery(s.bob, "bob message", communityChat.ID)
   187  	bobMessage2 := s.sendMessageAndCheckDelivery(s.bob, "bob message2", communityChat.ID)
   188  	ownerMessage := s.sendMessageAndCheckDelivery(s.owner, "owner message", communityChat.ID)
   189  	adminMessage := s.sendMessageAndCheckDelivery(s.admin, "admin message", communityChat.ID)
   190  
   191  	identityString := s.bob.IdentityPublicKeyString()
   192  	expectedMsgsToRemove := 2
   193  	communityID := community.IDString()
   194  	s.checkAllMembersHasMemberMessages(identityString, expectedMsgsToRemove, communityID)
   195  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), 1, communityID)
   196  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), 1, communityID)
   197  
   198  	// delete bob message
   199  	deleteMessagesRequest := &requests.DeleteCommunityMemberMessages{
   200  		CommunityID:  community.ID(),
   201  		MemberPubKey: identityString,
   202  		Messages: []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   203  			Id:     bobMessage.ID,
   204  			ChatId: bobMessage.ChatId,
   205  		}},
   206  	}
   207  	response, err := s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   208  	s.Require().NoError(err)
   209  
   210  	checkMessageDeleted := func(response *MessengerResponse) bool {
   211  		if len(response.DeletedMessages()) == 0 {
   212  			return false
   213  		}
   214  
   215  		if _, exists := response.DeletedMessages()[deleteMessagesRequest.Messages[0].Id]; !exists {
   216  			return false
   217  		}
   218  		return true
   219  	}
   220  
   221  	s.Require().True(checkMessageDeleted(response))
   222  
   223  	_, err = WaitOnMessengerResponse(s.bob, checkMessageDeleted, "message was not deleted for bob")
   224  	s.Require().NoError(err)
   225  	_, err = WaitOnMessengerResponse(s.admin, checkMessageDeleted, "message was not deleted for admin")
   226  	s.Require().NoError(err)
   227  
   228  	expectedMsgsToRemove = 1
   229  	s.checkAllMembersHasMemberMessages(s.bob.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   230  
   231  	// check that other users messages were not removed
   232  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   233  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   234  
   235  	// check that admin can delete member message
   236  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   237  		Id:     bobMessage2.ID,
   238  		ChatId: bobMessage2.ChatId,
   239  	}}
   240  	response, err = s.admin.DeleteCommunityMemberMessages(deleteMessagesRequest)
   241  	s.Require().NoError(err)
   242  	s.Require().True(checkMessageDeleted(response))
   243  
   244  	_, err = WaitOnMessengerResponse(s.bob, checkMessageDeleted, "message2 was not deleted for bob")
   245  	s.Require().NoError(err)
   246  	_, err = WaitOnMessengerResponse(s.owner, checkMessageDeleted, "message2 was not deleted for owner")
   247  	s.Require().NoError(err)
   248  
   249  	expectedMsgsToRemove = 0
   250  	s.checkAllMembersHasMemberMessages(s.bob.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   251  
   252  	// check that other users messages were not removed
   253  	expectedMsgsToRemove = 1
   254  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   255  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   256  
   257  	// check that owner can delete member message
   258  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   259  		Id:     adminMessage.ID,
   260  		ChatId: adminMessage.ChatId,
   261  	}}
   262  	response, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   263  	s.Require().NoError(err)
   264  	s.Require().True(checkMessageDeleted(response))
   265  
   266  	_, err = WaitOnMessengerResponse(s.bob, checkMessageDeleted, "adminMessage was not deleted for bob")
   267  	s.Require().NoError(err)
   268  	_, err = WaitOnMessengerResponse(s.admin, checkMessageDeleted, "adminMessage was not deleted for admin")
   269  	s.Require().NoError(err)
   270  
   271  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), 0, communityID)
   272  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), 1, communityID)
   273  
   274  	// check that owner can delete his own message
   275  	deleteMessagesRequest.Messages = []*protobuf.DeleteCommunityMemberMessage{&protobuf.DeleteCommunityMemberMessage{
   276  		Id:     ownerMessage.ID,
   277  		ChatId: ownerMessage.ChatId,
   278  	}}
   279  	response, err = s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   280  	s.Require().NoError(err)
   281  	s.Require().True(checkMessageDeleted(response))
   282  
   283  	_, err = WaitOnMessengerResponse(s.bob, checkMessageDeleted, "ownerMessage was not deleted for bob")
   284  	s.Require().NoError(err)
   285  	_, err = WaitOnMessengerResponse(s.admin, checkMessageDeleted, "ownerMessage was not deleted for admin")
   286  	s.Require().NoError(err)
   287  
   288  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), 0, communityID)
   289  }
   290  
   291  func (s *MessengerDeleteMessagesSuite) TestDeleteAllMemberMessage() {
   292  	community, communityChat := createCommunity(&s.Suite, s.owner)
   293  
   294  	advertiseCommunityTo(&s.Suite, community, s.owner, s.admin)
   295  	joinCommunity(&s.Suite, community.ID(), s.owner, s.admin, aliceAccountAddress, []string{aliceAddress1})
   296  
   297  	advertiseCommunityTo(&s.Suite, community, s.owner, s.bob)
   298  	joinCommunity(&s.Suite, community.ID(), s.owner, s.bob, bobPassword, []string{bobAddress})
   299  
   300  	grantPermission(&s.Suite, community, s.owner, s.admin, protobuf.CommunityMember_ROLE_ADMIN)
   301  
   302  	_ = s.sendMessageAndCheckDelivery(s.bob, "bob message", communityChat.ID)
   303  	_ = s.sendMessageAndCheckDelivery(s.bob, "bob message2", communityChat.ID)
   304  	_ = s.sendMessageAndCheckDelivery(s.owner, "owner message", communityChat.ID)
   305  	_ = s.sendMessageAndCheckDelivery(s.admin, "admin message", communityChat.ID)
   306  
   307  	identityString := s.bob.IdentityPublicKeyString()
   308  	expectedMsgsToRemove := 2
   309  	communityID := community.IDString()
   310  	s.checkAllMembersHasMemberMessages(identityString, expectedMsgsToRemove, communityID)
   311  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), 1, communityID)
   312  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), 1, communityID)
   313  
   314  	// delete all bob message
   315  	deleteMessagesRequest := &requests.DeleteCommunityMemberMessages{
   316  		CommunityID:  community.ID(),
   317  		MemberPubKey: identityString,
   318  		DeleteAll:    true,
   319  	}
   320  	response, err := s.owner.DeleteCommunityMemberMessages(deleteMessagesRequest)
   321  	s.Require().NoError(err)
   322  
   323  	checkMessageDeleted := func(response *MessengerResponse) bool {
   324  		return len(response.DeletedMessages()) == 2
   325  	}
   326  
   327  	s.Require().True(checkMessageDeleted(response))
   328  
   329  	_, err = WaitOnMessengerResponse(s.bob, checkMessageDeleted, "messages were not deleted for bob")
   330  	s.Require().NoError(err)
   331  	_, err = WaitOnMessengerResponse(s.admin, checkMessageDeleted, "messages were not deleted for admin")
   332  	s.Require().NoError(err)
   333  
   334  	expectedMsgsToRemove = 0
   335  	s.checkAllMembersHasMemberMessages(s.bob.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   336  
   337  	// check that other users messages were not removed
   338  	expectedMsgsToRemove = 1
   339  	s.checkAllMembersHasMemberMessages(s.admin.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   340  	s.checkAllMembersHasMemberMessages(s.owner.IdentityPublicKeyString(), expectedMsgsToRemove, communityID)
   341  }