github.com/status-im/status-go@v1.1.0/protocol/messenger_delete_message_for_everyone_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 TestMessengerDeleteMessageForEveryoneSuite(t *testing.T) { 16 suite.Run(t, new(MessengerDeleteMessageForEveryoneSuite)) 17 } 18 19 type MessengerDeleteMessageForEveryoneSuite struct { 20 CommunitiesMessengerTestSuiteBase 21 admin *Messenger 22 moderator *Messenger 23 bob *Messenger 24 } 25 26 func (s *MessengerDeleteMessageForEveryoneSuite) SetupTest() { 27 s.CommunitiesMessengerTestSuiteBase.SetupTest() 28 s.admin = s.newMessenger("", []string{}) 29 s.bob = s.newMessenger(bobPassword, []string{bobPassword}) 30 s.moderator = s.newMessenger(aliceAccountAddress, []string{aliceAddress1}) 31 32 _, err := s.admin.Start() 33 s.Require().NoError(err) 34 _, err = s.bob.Start() 35 s.Require().NoError(err) 36 _, err = s.moderator.Start() 37 s.Require().NoError(err) 38 } 39 40 func (s *MessengerDeleteMessageForEveryoneSuite) TearDownTest() { 41 TearDownMessenger(&s.Suite, s.admin) 42 TearDownMessenger(&s.Suite, s.bob) 43 TearDownMessenger(&s.Suite, s.moderator) 44 s.CommunitiesMessengerTestSuiteBase.TearDownTest() 45 } 46 47 func (s *MessengerDeleteMessageForEveryoneSuite) testSendAndDeleteMessage(messageToSend *common.Message, shouldError bool) { 48 ctx := context.Background() 49 sendResponse, err := s.bob.SendChatMessage(ctx, messageToSend) 50 s.NoError(err) 51 s.Require().Len(sendResponse.Messages(), 1) 52 53 response, err := WaitOnMessengerResponse(s.moderator, func(response *MessengerResponse) bool { 54 return len(response.Messages()) > 0 55 }, "messages not received") 56 s.Require().NoError(err) 57 message := response.Messages()[0] 58 s.Require().Equal(messageToSend.Text, message.Text) 59 60 deleteMessageResponse, err := s.moderator.DeleteMessageAndSend(ctx, message.ID) 61 if shouldError { 62 s.Require().Error(err) 63 return 64 } 65 s.Require().NoError(err) 66 67 response, err = WaitOnMessengerResponse(s.bob, func(response *MessengerResponse) bool { 68 return len(response.RemovedMessages()) > 0 69 }, "removed messages not received") 70 s.Require().Equal(deleteMessageResponse.RemovedMessages()[0].DeletedBy, contactIDFromPublicKey(s.moderator.IdentityPublicKey())) 71 72 s.Require().NoError(err) 73 s.Require().Len(response.ActivityCenterNotifications(), 1) 74 s.Require().True(response.ActivityCenterNotifications()[0].Deleted) 75 76 message, err = s.bob.MessageByID(message.ID) 77 s.Require().NoError(err) 78 s.Require().True(message.Deleted) 79 } 80 81 func (s *MessengerDeleteMessageForEveryoneSuite) TestDeleteMessageForEveryone() { 82 community := s.createCommunity() 83 communityChat := s.createCommunityChat(community) 84 85 advertiseCommunityTo(&s.Suite, community, s.admin, s.moderator) 86 joinCommunity(&s.Suite, community.ID(), s.admin, s.moderator, aliceAccountAddress, []string{aliceAddress1}) 87 88 advertiseCommunityTo(&s.Suite, community, s.admin, s.bob) 89 joinCommunity(&s.Suite, community.ID(), s.admin, s.bob, bobPassword, []string{bobAddress}) 90 91 response, err := s.admin.AddRoleToMember(&requests.AddRoleToMember{ 92 CommunityID: community.ID(), 93 User: common.PubkeyToHexBytes(s.moderator.IdentityPublicKey()), 94 Role: protobuf.CommunityMember_ROLE_ADMIN, 95 }) 96 s.Require().NoError(err) 97 s.Require().Len(response.Communities(), 1) 98 99 _, err = WaitOnMessengerResponse(s.moderator, func(response *MessengerResponse) bool { 100 return len(response.Communities()) > 0 101 }, "community description changed message not received") 102 s.Require().NoError(err) 103 _, err = WaitOnMessengerResponse(s.bob, func(response *MessengerResponse) bool { 104 return len(response.Communities()) > 0 105 }, "community description changed message not received") 106 s.Require().NoError(err) 107 108 // // Normal message 109 inputMessage := common.NewMessage() 110 inputMessage.ChatId = communityChat.ID 111 inputMessage.ContentType = protobuf.ChatMessage_TEXT_PLAIN 112 inputMessage.Text = "some text" 113 114 s.testSendAndDeleteMessage(inputMessage, false) 115 116 // // Bridge message 117 bridgeMessage := buildTestMessage(*communityChat) 118 bridgeMessage.ContentType = protobuf.ChatMessage_BRIDGE_MESSAGE 119 bridgeMessage.Payload = &protobuf.ChatMessage_BridgeMessage{ 120 BridgeMessage: &protobuf.BridgeMessage{ 121 BridgeName: "discord", 122 UserName: "user1", 123 UserAvatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAjklEQVR4nOzXwQmFMBAAUZXUYh32ZB32ZB02sxYQQSZGsod55/91WFgSS0RM+SyjA56ZRZhFmEWYRRT6h+M6G16zrxv6fdJpmUWYRbxsYr13dKfanpN0WmYRZhGzXz6AWYRZRIfbaX26fT9Jk07LLMIsosPt9I/dTDotswizCG+nhFmEWYRZhFnEHQAA///z1CFkYamgfQAAAABJRU5ErkJggg==", 124 UserID: "123", 125 Content: "text1", 126 MessageID: "456", 127 ParentMessageID: "789", 128 }, 129 } 130 s.testSendAndDeleteMessage(bridgeMessage, false) 131 132 // Gap message cannot be deleted 133 gapMessage := buildTestMessage(*communityChat) 134 gapMessage.ContentType = protobuf.ChatMessage_SYSTEM_MESSAGE_GAP 135 s.testSendAndDeleteMessage(gapMessage, true) 136 } 137 138 func (s *MessengerDeleteMessageForEveryoneSuite) createCommunity() *communities.Community { 139 description := &requests.CreateCommunity{ 140 Membership: protobuf.CommunityPermissions_AUTO_ACCEPT, 141 Name: "status", 142 Color: "#ffffff", 143 Description: "status community description", 144 } 145 response, err := s.admin.CreateCommunity(description, false) 146 147 s.Require().NoError(err) 148 s.Require().NotNil(response) 149 s.Require().Len(response.Communities(), 1) 150 s.Require().Len(response.Chats(), 0) 151 152 return response.Communities()[0] 153 } 154 155 func (s *MessengerDeleteMessageForEveryoneSuite) createCommunityChat(community *communities.Community) *Chat { 156 orgChat := &protobuf.CommunityChat{ 157 Permissions: &protobuf.CommunityPermissions{ 158 Access: protobuf.CommunityPermissions_AUTO_ACCEPT, 159 }, 160 Identity: &protobuf.ChatIdentity{ 161 DisplayName: "status-core", 162 Emoji: "", 163 Description: "status-core community chatToModerator", 164 }, 165 } 166 167 response, err := s.admin.CreateCommunityChat(community.ID(), orgChat) 168 s.Require().NoError(err) 169 s.Require().NotNil(response) 170 s.Require().Len(response.Communities(), 1) 171 s.Require().Len(response.Chats(), 1) 172 return response.Chats()[0] 173 }