github.com/status-im/status-go@v1.1.0/protocol/messenger_handler_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/eth-node/crypto"
    10  	"github.com/status-im/status-go/eth-node/types"
    11  	"github.com/status-im/status-go/protocol/protobuf"
    12  	v1protocol "github.com/status-im/status-go/protocol/v1"
    13  	localnotifications "github.com/status-im/status-go/services/local-notifications"
    14  )
    15  
    16  func TestEventToSystemMessageSuite(t *testing.T) {
    17  	suite.Run(t, new(EventToSystemMessageSuite))
    18  }
    19  
    20  type EventToSystemMessageSuite struct {
    21  	MessengerBaseTestSuite
    22  }
    23  
    24  func (s *EventToSystemMessageSuite) TestRun() {
    25  	testCases := []struct {
    26  		Name     string
    27  		Event    v1protocol.MembershipUpdateEvent
    28  		Expected string
    29  		From     string
    30  	}{
    31  		{
    32  			Name:     "chat created event",
    33  			Event:    v1protocol.NewChatCreatedEvent("chat-name", "#7cda00", 12),
    34  			From:     "admin",
    35  			Expected: "@admin created the group chat-name",
    36  		},
    37  		{
    38  			Name:     "chat name changed event",
    39  			Event:    v1protocol.NewNameChangedEvent("chat-name-2", 12),
    40  			From:     "admin",
    41  			Expected: "@admin changed the group's name to chat-name-2",
    42  		},
    43  		{
    44  			Name:     "chat color changed event",
    45  			Event:    v1protocol.NewColorChangedEvent("#7cda00", 12),
    46  			From:     "admin",
    47  			Expected: "@admin changed the group's color",
    48  		},
    49  		{
    50  			Name:     "chat image changed event",
    51  			Event:    v1protocol.NewImageChangedEvent([]byte{1, 2, 3}, 12),
    52  			From:     "admin",
    53  			Expected: "@admin changed the group's image",
    54  		},
    55  		{
    56  			Name:     "members added event",
    57  			Event:    v1protocol.NewMembersAddedEvent([]string{"a", "b", "c"}, 12),
    58  			From:     "admin",
    59  			Expected: "@admin has added @a, @b, @c",
    60  		},
    61  		{
    62  			Name:     "member joined event",
    63  			Event:    v1protocol.NewMemberJoinedEvent(12),
    64  			From:     "admin",
    65  			Expected: "", // joined events are deprecated
    66  		},
    67  		{
    68  			Name:     "admins added event",
    69  			Event:    v1protocol.NewAdminsAddedEvent([]string{"a", "b", "c"}, 12),
    70  			From:     "admin",
    71  			Expected: "@admin has made @a, @b, @c admin",
    72  		},
    73  		{
    74  			Name:     "member removed event",
    75  			Event:    v1protocol.NewMemberRemovedEvent("a", 12),
    76  			From:     "admin",
    77  			Expected: "@a left the group",
    78  		},
    79  		{
    80  			Name:     "admin removed event",
    81  			Event:    v1protocol.NewAdminRemovedEvent("a", 12),
    82  			From:     "admin",
    83  			Expected: "@a is not admin anymore",
    84  		},
    85  	}
    86  	for _, tc := range testCases {
    87  		s.Run(tc.Name, func() {
    88  			tc.Event.From = tc.From
    89  
    90  			systemMessage := eventToSystemMessage(tc.Event, defaultSystemMessagesTranslations)
    91  			s.Equal(systemMessage.Text, tc.Expected)
    92  
    93  		})
    94  	}
    95  
    96  }
    97  
    98  func (s *EventToSystemMessageSuite) TestHandleMembershipUpdate() {
    99  	adminPrivateKey, err := crypto.GenerateKey()
   100  	s.Require().NoError(err)
   101  
   102  	adminPublicKey := types.EncodeHex(crypto.FromECDSAPub(&adminPrivateKey.PublicKey))
   103  	ourPublicKey := types.EncodeHex(crypto.FromECDSAPub(&s.m.identity.PublicKey))
   104  
   105  	event1 := v1protocol.MembershipUpdateEvent{
   106  		Type:       protobuf.MembershipUpdateEvent_CHAT_CREATED,
   107  		Name:       "test",
   108  		ChatID:     "test-" + adminPublicKey,
   109  		ClockValue: 100,
   110  	}
   111  	err = event1.Sign(adminPrivateKey)
   112  	s.Require().NoError(err)
   113  
   114  	event2 := v1protocol.MembershipUpdateEvent{
   115  		Type:       protobuf.MembershipUpdateEvent_MEMBERS_ADDED,
   116  		Members:    []string{adminPublicKey, ourPublicKey},
   117  		ChatID:     "test-" + adminPublicKey,
   118  		ClockValue: 100,
   119  	}
   120  	err = event2.Sign(adminPrivateKey)
   121  	s.Require().NoError(err)
   122  
   123  	testMembershipUpdateMessageStruct2 := v1protocol.MembershipUpdateMessage{
   124  		ChatID: "test-" + adminPublicKey,
   125  		Events: []v1protocol.MembershipUpdateEvent{
   126  			event1,
   127  			event2,
   128  		},
   129  	}
   130  
   131  	rawMembershipUpdateMessage2, err := testMembershipUpdateMessageStruct2.ToProtobuf()
   132  	s.Require().NoError(err)
   133  
   134  	contact, err := BuildContactFromPublicKey(&adminPrivateKey.PublicKey)
   135  	s.Require().NoError(err)
   136  
   137  	contact.ContactRequestLocalState = ContactRequestStateSent
   138  
   139  	currentMessageState := &CurrentMessageState{
   140  		Contact: contact,
   141  	}
   142  
   143  	state := &ReceivedMessageState{
   144  		Response:            &MessengerResponse{},
   145  		Timesource:          s.m.transport,
   146  		CurrentMessageState: currentMessageState,
   147  		ExistingMessagesMap: map[string]bool{},
   148  		AllChats:            s.m.allChats,
   149  	}
   150  
   151  	err = s.m.HandleMembershipUpdate(state, nil, rawMembershipUpdateMessage2, defaultSystemMessagesTranslations)
   152  	s.Require().NoError(err)
   153  	s.Require().Len(state.Response.Notifications(), 1)
   154  	s.Require().Equal(state.Response.Notifications()[0].Category, localnotifications.CategoryGroupInvite)
   155  	s.Require().Len(state.Response.Chats(), 1)
   156  
   157  	chat := state.Response.Chats()[0]
   158  
   159  	// Decline event, setting chat inactive
   160  	response, err := s.m.LeaveGroupChat(context.Background(), chat.ID, true)
   161  	s.Require().NoError(err)
   162  
   163  	s.Require().Len(response.Chats(), 1)
   164  
   165  	chat = response.Chats()[0]
   166  
   167  	// If the same response is handled, it should not show another notification & the chat should remain inactive
   168  	state.Response = &MessengerResponse{}
   169  	err = s.m.HandleMembershipUpdate(state, chat, rawMembershipUpdateMessage2, defaultSystemMessagesTranslations)
   170  	s.Require().NoError(err)
   171  	s.Require().Len(state.Response.Notifications(), 0)
   172  	s.Require().Len(state.Response.Chats(), 1)
   173  	s.Require().False(state.Response.Chats()[0].Active)
   174  }