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 }