Set chat active on being re-invited
If the user deletes/leaves a group chat, the chat is set as not active. This means that if we are re-invited to the chat it won't be shown to the user. This commit changes this behavior so that if we are re-invited to the chat it is set as active again.
This commit is contained in:
parent
7d3655976c
commit
7bbe9561de
|
@ -150,7 +150,21 @@ func (c *Chat) MembersAsPublicKeys() ([]*ecdsa.PublicKey, error) {
|
||||||
return stringSliceToPublicKeys(publicKeys, true)
|
return stringSliceToPublicKeys(publicKeys, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Chat) updateChatFromProtocolGroup(g *v1protocol.Group) {
|
func (c *Chat) HasMember(memberID string) bool {
|
||||||
|
for _, member := range c.Members {
|
||||||
|
if memberID == member.ID {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chat) updateChatFromGroupMembershipChanges(myID string, g *v1protocol.Group) {
|
||||||
|
|
||||||
|
// Check if we were already in the chat
|
||||||
|
hadJoined := c.HasMember(myID)
|
||||||
|
|
||||||
// ID
|
// ID
|
||||||
c.ID = g.ChatID()
|
c.ID = g.ChatID()
|
||||||
|
|
||||||
|
@ -163,6 +177,11 @@ func (c *Chat) updateChatFromProtocolGroup(g *v1protocol.Group) {
|
||||||
joined := g.Joined()
|
joined := g.Joined()
|
||||||
chatMembers := make([]ChatMember, 0, len(members))
|
chatMembers := make([]ChatMember, 0, len(members))
|
||||||
for _, m := range members {
|
for _, m := range members {
|
||||||
|
// Check if we joined thanks to these changes, if so, make chat active
|
||||||
|
if m == myID && !hadJoined {
|
||||||
|
c.Active = true
|
||||||
|
}
|
||||||
|
|
||||||
chatMember := ChatMember{
|
chatMember := ChatMember{
|
||||||
ID: m,
|
ID: m,
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,8 @@ func (m *MessageHandler) HandleMembershipUpdate(messageState *ReceivedMessageSta
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
systemMessages := buildSystemMessages(message.Events, translations)
|
systemMessages := buildSystemMessages(message.Events, translations)
|
||||||
|
|
||||||
for _, message := range systemMessages {
|
for _, message := range systemMessages {
|
||||||
|
|
|
@ -644,7 +644,8 @@ func (m *Messenger) CreateGroupChatWithMembers(ctx context.Context, name string,
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
chat.LastClockValue = clock
|
chat.LastClockValue = clock
|
||||||
chat.updateChatFromProtocolGroup(group)
|
|
||||||
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
clock, _ = chat.NextClockAndTimestamp(m.getTimesource())
|
clock, _ = chat.NextClockAndTimestamp(m.getTimesource())
|
||||||
// Add members
|
// Add members
|
||||||
|
@ -682,7 +683,7 @@ func (m *Messenger) CreateGroupChatWithMembers(ctx context.Context, name string,
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
response.Chats = []*Chat{&chat}
|
response.Chats = []*Chat{&chat}
|
||||||
response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations)
|
response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations)
|
||||||
|
@ -747,7 +748,8 @@ func (m *Messenger) RemoveMemberFromGroupChat(ctx context.Context, chatID string
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
response.Chats = []*Chat{chat}
|
response.Chats = []*Chat{chat}
|
||||||
response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations)
|
response.Messages = buildSystemMessages(chat.MembershipUpdates, m.systemMessagesTranslations)
|
||||||
err = m.persistence.SaveMessagesLegacy(response.Messages)
|
err = m.persistence.SaveMessagesLegacy(response.Messages)
|
||||||
|
@ -810,7 +812,7 @@ func (m *Messenger) AddMembersToGroupChat(ctx context.Context, chatID string, me
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
response.Chats = []*Chat{chat}
|
response.Chats = []*Chat{chat}
|
||||||
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
||||||
|
@ -875,7 +877,7 @@ func (m *Messenger) ChangeGroupChatName(ctx context.Context, chatID string, name
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
var response MessengerResponse
|
var response MessengerResponse
|
||||||
response.Chats = []*Chat{chat}
|
response.Chats = []*Chat{chat}
|
||||||
|
@ -941,7 +943,7 @@ func (m *Messenger) AddAdminsToGroupChat(ctx context.Context, chatID string, mem
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
response.Chats = []*Chat{chat}
|
response.Chats = []*Chat{chat}
|
||||||
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
||||||
|
@ -1008,7 +1010,7 @@ func (m *Messenger) ConfirmJoiningGroup(ctx context.Context, chatID string) (*Me
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
response.Chats = []*Chat{chat}
|
response.Chats = []*Chat{chat}
|
||||||
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
response.Messages = buildSystemMessages([]v1protocol.MembershipUpdateEvent{event}, m.systemMessagesTranslations)
|
||||||
|
@ -1076,7 +1078,8 @@ func (m *Messenger) LeaveGroupChat(ctx context.Context, chatID string, remove bo
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
chat.updateChatFromProtocolGroup(group)
|
chat.updateChatFromGroupMembershipChanges(contactIDFromPublicKey(&m.identity.PublicKey), group)
|
||||||
|
|
||||||
if remove {
|
if remove {
|
||||||
chat.Active = false
|
chat.Active = false
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,6 @@ package protocol
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"errors"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -101,14 +100,11 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
|
||||||
s.Require().False(chat.Active, "It does not create an active chat")
|
s.Require().False(chat.Active, "It does not create an active chat")
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Contacts) > 0 },
|
||||||
if err == nil && len(response.Contacts) == 0 {
|
"contact request not received",
|
||||||
err = errors.New("contact request not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
receivedContact := response.Contacts[0]
|
receivedContact := response.Contacts[0]
|
||||||
|
@ -118,20 +114,19 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
|
||||||
s.Require().True(receivedContact.HasBeenAdded())
|
s.Require().True(receivedContact.HasBeenAdded())
|
||||||
s.Require().NotEmpty(receivedContact.LastUpdated)
|
s.Require().NotEmpty(receivedContact.LastUpdated)
|
||||||
|
|
||||||
newName := "new-name"
|
|
||||||
newPicture := "new-picture"
|
newPicture := "new-picture"
|
||||||
err = theirMessenger.SendContactUpdates(context.Background(), newName, newPicture)
|
err = theirMessenger.SendContactUpdates(context.Background(), newName, newPicture)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool {
|
||||||
if err == nil && len(response.Contacts) == 0 || (len(response.Contacts) == 1 && response.Contacts[0].ID != theirContactID) {
|
return len(r.Contacts) > 0 && response.Contacts[0].ID == theirContactID
|
||||||
err = errors.New("contact request not received")
|
},
|
||||||
}
|
"contact request not received",
|
||||||
return err
|
)
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
receivedContact = response.Contacts[0]
|
receivedContact = response.Contacts[0]
|
||||||
|
|
|
@ -99,14 +99,12 @@ func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
||||||
s.Require().False(response.Chats[0].Active)
|
s.Require().False(response.Chats[0].Active)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Installations) > 0 },
|
||||||
if err == nil && len(response.Installations) == 0 {
|
"installation not received",
|
||||||
err = errors.New("installation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
actualInstallation := response.Installations[0]
|
actualInstallation := response.Installations[0]
|
||||||
s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
|
s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
|
||||||
|
@ -127,17 +125,11 @@ func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Contacts) > 0 && r.Contacts[0].ID == contact.ID },
|
||||||
if err == nil && len(response.Contacts) == 0 {
|
"contact not received",
|
||||||
err = errors.New("contact not received")
|
)
|
||||||
}
|
|
||||||
if len(response.Contacts) != 0 && response.Contacts[0].ID != contact.ID {
|
|
||||||
err = errors.New("contact not received")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
actualContact := response.Contacts[0]
|
actualContact := response.Contacts[0]
|
||||||
|
@ -148,15 +140,12 @@ func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
||||||
err = s.m.SaveChat(&chat)
|
err = s.m.SaveChat(&chat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
response, err = WaitOnMessengerResponse(
|
||||||
err = tt.RetryWithBackOff(func() error {
|
theirMessenger,
|
||||||
var err error
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
response, err = theirMessenger.RetrieveAll()
|
"sync chat not received",
|
||||||
if err == nil && len(response.Chats) == 0 {
|
)
|
||||||
err = errors.New("sync chat not received")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
actualChat := response.Chats[0]
|
actualChat := response.Chats[0]
|
||||||
|
@ -196,14 +185,12 @@ func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
||||||
s.Require().False(response.Chats[0].Active)
|
s.Require().False(response.Chats[0].Active)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Installations) > 0 },
|
||||||
if err == nil && len(response.Installations) == 0 {
|
"installation not received",
|
||||||
err = errors.New("installation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
actualInstallation := response.Installations[0]
|
actualInstallation := response.Installations[0]
|
||||||
s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
|
s.Require().Equal(theirMessenger.installationID, actualInstallation.ID)
|
||||||
|
|
|
@ -38,6 +38,7 @@ const (
|
||||||
testTransactionHash = "0x412a851ac2ae51cad34a56c8a9cfee55d577ac5e1ac71cf488a2f2093a373799"
|
testTransactionHash = "0x412a851ac2ae51cad34a56c8a9cfee55d577ac5e1ac71cf488a2f2093a373799"
|
||||||
testIdenticon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAnElEQVR4nOzXQaqDMBRG4bZkLR10e12H23PgZuJUjJAcE8kdnG/44IXDhZ9iyjm/4vnMDrhmFmEWYRZhFpH6n1jW7fSX/+/b+WbQa5lFmEVUljhqZfSdoNcyizCLeNMvn3JTLeh+g17LLMIsorLElt2VK7v3X0dBr2UWYRaBfxNLfifOZhYRNGvAEp8Q9FpmEWYRZhFmEXsAAAD//5K5JFhu0M0nAAAAAElFTkSuQmCC"
|
testIdenticon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAAnElEQVR4nOzXQaqDMBRG4bZkLR10e12H23PgZuJUjJAcE8kdnG/44IXDhZ9iyjm/4vnMDrhmFmEWYRZhFpH6n1jW7fSX/+/b+WbQa5lFmEVUljhqZfSdoNcyizCLeNMvn3JTLeh+g17LLMIsorLElt2VK7v3X0dBr2UWYRaBfxNLfifOZhYRNGvAEp8Q9FpmEWYRZhFmEXsAAAD//5K5JFhu0M0nAAAAAElFTkSuQmCC"
|
||||||
testAlias = "Concrete Lavender Xiphias"
|
testAlias = "Concrete Lavender Xiphias"
|
||||||
|
newName = "new-name"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMessengerSuite(t *testing.T) {
|
func TestMessengerSuite(t *testing.T) {
|
||||||
|
@ -521,15 +522,12 @@ func (s *MessengerSuite) TestRetrieveTheirPublic() {
|
||||||
sentMessage := sendResponse.Messages[0]
|
sentMessage := sendResponse.Messages[0]
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
var response *MessengerResponse
|
response, err := WaitOnMessengerResponse(
|
||||||
err = tt.RetryWithBackOff(func() error {
|
s.m,
|
||||||
var err error
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
response, err = s.m.RetrieveAll()
|
"no messages",
|
||||||
if err == nil && len(response.Messages) == 0 {
|
)
|
||||||
err = errors.New("no messages")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Messages, 1)
|
s.Require().Len(response.Messages, 1)
|
||||||
|
@ -634,15 +632,11 @@ func (s *MessengerSuite) TestResendPublicMessage() {
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
var response *MessengerResponse
|
response, err := WaitOnMessengerResponse(
|
||||||
err = tt.RetryWithBackOff(func() error {
|
s.m,
|
||||||
var err error
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
response, err = s.m.RetrieveAll()
|
"no messages",
|
||||||
if err == nil && len(response.Messages) == 0 {
|
)
|
||||||
err = errors.New("no messages")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Messages, 1)
|
s.Require().Len(response.Messages, 1)
|
||||||
|
@ -688,15 +682,11 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateChatExisting() {
|
||||||
|
|
||||||
sentMessage := sendResponse.Messages[0]
|
sentMessage := sendResponse.Messages[0]
|
||||||
|
|
||||||
var response *MessengerResponse
|
response, err := WaitOnMessengerResponse(
|
||||||
err = tt.RetryWithBackOff(func() error {
|
s.m,
|
||||||
var err error
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
response, err = s.m.RetrieveAll()
|
"no messages",
|
||||||
if err == nil && len(response.Messages) == 0 {
|
)
|
||||||
err = errors.New("no messages")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Equal(len(response.Chats), 1)
|
s.Require().Equal(len(response.Chats), 1)
|
||||||
|
@ -726,15 +716,12 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateChatNonExisting() {
|
||||||
sentMessage := sendResponse.Messages[0]
|
sentMessage := sendResponse.Messages[0]
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
var response *MessengerResponse
|
response, err := WaitOnMessengerResponse(
|
||||||
err = tt.RetryWithBackOff(func() error {
|
s.m,
|
||||||
var err error
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
response, err = s.m.RetrieveAll()
|
"no messages",
|
||||||
if err == nil && len(response.Messages) == 0 {
|
)
|
||||||
err = errors.New("no messages")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
@ -771,40 +758,6 @@ func (s *MessengerSuite) TestRetrieveTheirPublicChatNonExisting() {
|
||||||
s.Require().Equal(len(response.Chats), 0)
|
s.Require().Equal(len(response.Chats), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test receiving a message on an non-existing private public chat
|
|
||||||
func (s *MessengerSuite) TestRetrieveTheirGroupChatNonExisting() {
|
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
|
||||||
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "test", []string{})
|
|
||||||
s.NoError(err)
|
|
||||||
s.Require().Len(response.Chats, 1)
|
|
||||||
|
|
||||||
chat := response.Chats[0]
|
|
||||||
|
|
||||||
err = theirMessenger.SaveChat(chat)
|
|
||||||
s.NoError(err)
|
|
||||||
|
|
||||||
inputMessage := buildTestMessage(*chat)
|
|
||||||
|
|
||||||
sendResponse, err := theirMessenger.SendChatMessage(context.Background(), inputMessage)
|
|
||||||
s.NoError(err)
|
|
||||||
s.Require().Len(sendResponse.Messages, 1)
|
|
||||||
|
|
||||||
// Retrieve their messages so that the chat is created
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
|
||||||
var err error
|
|
||||||
response, err = s.m.RetrieveAll()
|
|
||||||
if err == nil && len(response.Chats) == 1 {
|
|
||||||
err = errors.New("chat membership update not received")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
|
||||||
|
|
||||||
// The message is discarded
|
|
||||||
s.Require().Equal(0, len(response.Messages))
|
|
||||||
s.Require().Equal(0, len(response.Chats))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test receiving a message on an existing private group chat
|
// Test receiving a message on an existing private group chat
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
||||||
var response *MessengerResponse
|
var response *MessengerResponse
|
||||||
|
@ -823,27 +776,22 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Retrieve their messages so that the chat is created
|
// Retrieve their messages so that the chat is created
|
||||||
err = tt.RetryWithBackOff(func() error {
|
_, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
if err == nil && len(response.Chats) == 0 {
|
"chat invitation not received",
|
||||||
err = errors.New("chat invitation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
// Wait for the message to reach its destination
|
||||||
var err error
|
_, err = WaitOnMessengerResponse(
|
||||||
response, err = s.m.RetrieveAll()
|
s.m,
|
||||||
if err == nil && len(response.Chats) == 0 {
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
err = errors.New("no joining group event received")
|
"no joining group event received",
|
||||||
}
|
)
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
inputMessage := buildTestMessage(*ourChat)
|
inputMessage := buildTestMessage(*ourChat)
|
||||||
|
@ -854,14 +802,11 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
||||||
|
|
||||||
sentMessage := sendResponse.Messages[0]
|
sentMessage := sendResponse.Messages[0]
|
||||||
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
@ -892,43 +837,33 @@ func (s *MessengerSuite) TestChangeNameGroupChat() {
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Retrieve their messages so that the chat is created
|
// Retrieve their messages so that the chat is created
|
||||||
err = tt.RetryWithBackOff(func() error {
|
_, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
if err == nil && len(response.Chats) == 0 {
|
"chat invitation not received",
|
||||||
err = errors.New("chat invitation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Wait for join group event
|
// Wait for join group event
|
||||||
err = tt.RetryWithBackOff(func() error {
|
_, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
if err == nil && len(response.Chats) == 0 {
|
"no joining group event received",
|
||||||
err = errors.New("no joining group event received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
newName := "new-name"
|
|
||||||
_, err = s.m.ChangeGroupChatName(context.Background(), ourChat.ID, newName)
|
_, err = s.m.ChangeGroupChatName(context.Background(), ourChat.ID, newName)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Retrieve their messages so that the chat is created
|
// Retrieve their messages so that the chat is created
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
if err == nil && len(response.Chats) == 0 {
|
"chat invitation not received",
|
||||||
err = errors.New("chat invitation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
@ -936,14 +871,11 @@ func (s *MessengerSuite) TestChangeNameGroupChat() {
|
||||||
s.Require().Equal(newName, actualChat.Name)
|
s.Require().Equal(newName, actualChat.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test receiving a message on an existing private group chat, if messages
|
// Test being re-invited to a group chat
|
||||||
// are not wrapped this will fail as they'll likely come out of order
|
func (s *MessengerSuite) TestReInvitedToGroupChat() {
|
||||||
// NOTE: Disabling this as too flaky
|
|
||||||
/*
|
|
||||||
func (s *MessengerSuite) testRetrieveTheirPrivateGroupWrappedMessageChat() {
|
|
||||||
var response *MessengerResponse
|
var response *MessengerResponse
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "id", []string{})
|
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "old-name", []string{})
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
|
||||||
|
@ -957,46 +889,46 @@ func (s *MessengerSuite) testRetrieveTheirPrivateGroupWrappedMessageChat() {
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
// Retrieve their messages so that the chat is created
|
// Retrieve their messages so that the chat is created
|
||||||
err = tt.RetryWithBackOff(func() error {
|
_, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
if err == nil && len(response.Chats) == 0 {
|
"chat invitation not received",
|
||||||
err = errors.New("chat invitation not received")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
_, err = theirMessenger.ConfirmJoiningGroup(context.Background(), ourChat.ID)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
inputMessage := buildTestMessage(*ourChat)
|
// Wait for join group event
|
||||||
|
_, err = WaitOnMessengerResponse(
|
||||||
sendResponse, err := theirMessenger.SendChatMessage(context.Background(), inputMessage)
|
s.m,
|
||||||
s.NoError(err)
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
s.Require().Len(sendResponse.Messages, 1)
|
"no joining group event received",
|
||||||
|
)
|
||||||
sentMessage := sendResponse.Messages[0]
|
|
||||||
|
|
||||||
err = tt.RetryWithBackOff(func() error {
|
|
||||||
var err error
|
|
||||||
response, err = s.m.RetrieveAll()
|
|
||||||
if err == nil && len(response.Chats) == 0 {
|
|
||||||
err = errors.New("no chats")
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
response, err = theirMessenger.LeaveGroupChat(context.Background(), ourChat.ID, true)
|
||||||
|
s.NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
actualChat := response.Chats[0]
|
s.Require().False(response.Chats[0].Active)
|
||||||
// It updates the unviewed messages count
|
|
||||||
s.Require().Equal(uint(1), actualChat.UnviewedMessagesCount)
|
// And we get re-invited
|
||||||
// It updates the last message clock value
|
_, err = s.m.AddMembersToGroupChat(context.Background(), ourChat.ID, members)
|
||||||
s.Require().Equal(sentMessage.Clock, actualChat.LastClockValue)
|
s.NoError(err)
|
||||||
// It sets the last message
|
|
||||||
s.Require().NotNil(actualChat.LastMessage)
|
// Retrieve their messages so that the chat is created
|
||||||
|
response, err = WaitOnMessengerResponse(
|
||||||
|
theirMessenger,
|
||||||
|
func(r *MessengerResponse) bool { return len(r.Chats) > 0 },
|
||||||
|
"chat invitation not received",
|
||||||
|
)
|
||||||
|
|
||||||
|
s.Require().NoError(err)
|
||||||
|
|
||||||
|
s.Require().Len(response.Chats, 1)
|
||||||
|
s.Require().True(response.Chats[0].Active)
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
func (s *MessengerSuite) TestChatPersistencePublic() {
|
func (s *MessengerSuite) TestChatPersistencePublic() {
|
||||||
chat := Chat{
|
chat := Chat{
|
||||||
|
@ -1526,14 +1458,11 @@ func (s *MessengerSuite) TestDeclineRequestAddressForTransaction() {
|
||||||
s.Require().Equal(CommandStateRequestAddressForTransaction, senderMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestAddressForTransaction, senderMessage.CommandParameters.CommandState)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -1566,14 +1495,11 @@ func (s *MessengerSuite) TestDeclineRequestAddressForTransaction() {
|
||||||
s.Require().Equal(receiverMessage.ID, senderMessage.Replace)
|
s.Require().Equal(receiverMessage.ID, senderMessage.Replace)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
@ -1822,14 +1748,11 @@ func (s *MessengerSuite) TestAcceptRequestAddressForTransaction() {
|
||||||
s.Require().Equal(CommandStateRequestAddressForTransaction, senderMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestAddressForTransaction, senderMessage.CommandParameters.CommandState)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -1863,14 +1786,11 @@ func (s *MessengerSuite) TestAcceptRequestAddressForTransaction() {
|
||||||
s.Require().Equal(receiverMessage.ID, senderMessage.Replace)
|
s.Require().Equal(receiverMessage.ID, senderMessage.Replace)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
|
@ -1919,14 +1839,11 @@ func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
||||||
s.Require().Equal(CommandStateRequestTransaction, senderMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestTransaction, senderMessage.CommandParameters.CommandState)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -1958,14 +1875,11 @@ func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
||||||
s.Require().Equal(CommandStateRequestTransactionDeclined, senderMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestTransactionDeclined, senderMessage.CommandParameters.CommandState)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
s.m,
|
||||||
response, err = s.m.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -2012,14 +1926,11 @@ func (s *MessengerSuite) TestRequestTransaction() {
|
||||||
s.Require().Equal(CommandStateRequestTransaction, senderMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestTransaction, senderMessage.CommandParameters.CommandState)
|
||||||
|
|
||||||
// Wait for the message to reach its destination
|
// Wait for the message to reach its destination
|
||||||
err = tt.RetryWithBackOff(func() error {
|
response, err = WaitOnMessengerResponse(
|
||||||
var err error
|
theirMessenger,
|
||||||
response, err = theirMessenger.RetrieveAll()
|
func(r *MessengerResponse) bool { return len(r.Messages) > 0 },
|
||||||
if err == nil && len(response.Messages) == 0 {
|
"no messages",
|
||||||
err = errors.New("no messages")
|
)
|
||||||
}
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
s.Require().NotNil(response)
|
s.Require().NotNil(response)
|
||||||
|
@ -2349,3 +2260,15 @@ func (s *MessageHandlerSuite) TestRun() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func WaitOnMessengerResponse(m *Messenger, condition func(*MessengerResponse) bool, errorMessage string) (*MessengerResponse, error) {
|
||||||
|
var response *MessengerResponse
|
||||||
|
return response, tt.RetryWithBackOff(func() error {
|
||||||
|
var err error
|
||||||
|
response, err = m.RetrieveAll()
|
||||||
|
if err == nil && !condition(response) {
|
||||||
|
err = errors.New(errorMessage)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue