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 }