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  }