status-im/status-go

View on GitHub
protocol/messenger_mute_test.go

Summary

Maintainability
A
0 mins
Test Coverage
package protocol

import (
    "testing"
    "time"

    "github.com/stretchr/testify/suite"
    "go.uber.org/zap"

    "github.com/status-im/status-go/deprecation"
    "github.com/status-im/status-go/eth-node/crypto"
    "github.com/status-im/status-go/protocol/requests"
)

func TestMessengerMuteSuite(t *testing.T) {
    suite.Run(t, new(MessengerMuteSuite))
}

type MessengerMuteSuite struct {
    MessengerBaseTestSuite
}

func (s *MessengerMuteSuite) TestSetMute() {
    key, err := crypto.GenerateKey()
    s.Require().NoError(err)

    theirMessenger, err := newMessengerWithKey(s.shh, key, s.logger, nil)
    s.Require().NoError(err)

    chatID := publicChatName

    chat := CreatePublicChat(chatID, s.m.transport)

    err = s.m.SaveChat(chat)
    s.Require().NoError(err)

    _, err = s.m.Join(chat)
    s.Require().NoError(err)

    err = theirMessenger.SaveChat(chat)
    s.Require().NoError(err)

    _, error := s.m.MuteChat(&requests.MuteChat{ChatID: chatID, MutedType: 5})
    s.NoError(error)

    allChats := s.m.Chats()
    s.Require().Len(allChats, deprecation.AddChatsCount(1))

    var actualChat *Chat

    for idx := range allChats {
        if chat.ID == allChats[idx].ID {
            actualChat = allChats[idx]
        }
    }

    s.Require().NotNil(actualChat)
    s.Require().True(actualChat.Muted)

    s.Require().NoError(s.m.UnmuteChat(chatID))

    allChats = s.m.Chats()

    for idx := range allChats {
        if chat.ID == allChats[idx].ID {
            actualChat = allChats[idx]
        }
    }

    s.Require().False(actualChat.Muted)
    s.Require().NoError(theirMessenger.Shutdown())
}

func (s *MessengerMuteSuite) TestSetMuteForDuration() {
    key, err := crypto.GenerateKey()
    mockTimeOneMinuteAgo := time.Now().Add(-time.Minute)

    s.Require().NoError(err)

    theirMessenger, err := newMessengerWithKey(s.shh, key, s.logger, nil)
    s.Require().NoError(err)

    chatID := publicChatName

    chat := CreatePublicChat(chatID, s.m.transport)

    err = s.m.SaveChat(chat)
    s.Require().NoError(err)

    _, err = s.m.Join(chat)
    s.Require().NoError(err)

    err = theirMessenger.SaveChat(chat)
    s.Require().NoError(err)

    allChats := s.m.Chats()
    s.Require().Len(allChats, deprecation.AddChatsCount(1))

    var actualChat *Chat

    for idx := range allChats {
        if chat.ID == allChats[idx].ID {
            actualChat = allChats[idx]
        }
    }

    var contact *Contact
    if actualChat.OneToOne() {
        contact, _ = s.m.allContacts.Load(chatID)
    }

    _, error := s.m.muteChat(actualChat, contact, mockTimeOneMinuteAgo)
    s.NoError(error)
    // Mock Routine
    for _, chat := range allChats {
        chatMuteTill, chatMuteTillErr := time.Parse(time.RFC3339, chat.MuteTill.Format(time.RFC3339))
        currTime, currTimeErr := time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))

        if chatMuteTillErr != nil {
            s.logger.Info("err", zap.Any("Couldn't parse muteTill", err))
            return
        }
        if currTimeErr != nil {
            s.logger.Info("err", zap.Any("Couldn't parse current time", err))
            return
        }

        if currTime.After(chatMuteTill) && !chatMuteTill.Equal(time.Time{}) && chat.Muted {
            _ = s.m.UnmuteChat(chat.ID)
        }
    }

    s.Require().NotNil(actualChat)
    s.Require().False(actualChat.Muted)

    s.Require().NoError(theirMessenger.Shutdown())
}