github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/status_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/mattermost/mattermost-server/v5/model"
    13  	"github.com/mattermost/mattermost-server/v5/store"
    14  )
    15  
    16  func TestStatusStore(t *testing.T, ss store.Store) {
    17  	t.Run("", func(t *testing.T) { testStatusStore(t, ss) })
    18  	t.Run("ActiveUserCount", func(t *testing.T) { testActiveUserCount(t, ss) })
    19  	t.Run("UpdateExpiredDNDStatuses", func(t *testing.T) { testUpdateExpiredDNDStatuses(t, ss) })
    20  }
    21  
    22  func testStatusStore(t *testing.T, ss store.Store) {
    23  	status := &model.Status{UserId: model.NewId(), Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    24  	require.NoError(t, ss.Status().SaveOrUpdate(status))
    25  
    26  	status.LastActivityAt = 10
    27  
    28  	_, err := ss.Status().Get(status.UserId)
    29  	require.NoError(t, err)
    30  
    31  	status2 := &model.Status{UserId: model.NewId(), Status: model.STATUS_AWAY, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    32  	require.NoError(t, ss.Status().SaveOrUpdate(status2))
    33  
    34  	status3 := &model.Status{UserId: model.NewId(), Status: model.STATUS_OFFLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    35  	require.NoError(t, ss.Status().SaveOrUpdate(status3))
    36  
    37  	statuses, err := ss.Status().GetByIds([]string{status.UserId, "junk"})
    38  	require.NoError(t, err)
    39  	require.Len(t, statuses, 1, "should only have 1 status")
    40  
    41  	err = ss.Status().ResetAll()
    42  	require.NoError(t, err)
    43  
    44  	statusParameter, err := ss.Status().Get(status.UserId)
    45  	require.NoError(t, err)
    46  	require.Equal(t, statusParameter.Status, model.STATUS_OFFLINE, "should be offline")
    47  
    48  	err = ss.Status().UpdateLastActivityAt(status.UserId, 10)
    49  	require.NoError(t, err)
    50  }
    51  
    52  func testActiveUserCount(t *testing.T, ss store.Store) {
    53  	status := &model.Status{UserId: model.NewId(), Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
    54  	require.NoError(t, ss.Status().SaveOrUpdate(status))
    55  
    56  	count, err := ss.Status().GetTotalActiveUsersCount()
    57  	require.NoError(t, err)
    58  	require.True(t, count > 0, "expected count > 0, got %d", count)
    59  }
    60  
    61  type ByUserId []*model.Status
    62  
    63  func (s ByUserId) Len() int           { return len(s) }
    64  func (s ByUserId) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
    65  func (s ByUserId) Less(i, j int) bool { return s[i].UserId < s[j].UserId }
    66  
    67  func testUpdateExpiredDNDStatuses(t *testing.T, ss store.Store) {
    68  	userID := NewTestId()
    69  
    70  	status := &model.Status{UserId: userID, Status: model.STATUS_DND, Manual: true,
    71  		DNDEndTime: time.Now().Add(5 * time.Second).Unix(), PrevStatus: model.STATUS_ONLINE}
    72  	require.NoError(t, ss.Status().SaveOrUpdate(status))
    73  
    74  	time.Sleep(2 * time.Second)
    75  
    76  	// after 2 seconds no statuses should be expired
    77  	statuses, err := ss.Status().UpdateExpiredDNDStatuses()
    78  	require.NoError(t, err)
    79  	require.Len(t, statuses, 0)
    80  
    81  	time.Sleep(3 * time.Second)
    82  
    83  	// after 3 more seconds test status should be updated
    84  	statuses, err = ss.Status().UpdateExpiredDNDStatuses()
    85  	require.NoError(t, err)
    86  	require.Len(t, statuses, 1)
    87  
    88  	updatedStatus := *statuses[0]
    89  	require.Equal(t, updatedStatus.UserId, userID)
    90  	require.Equal(t, updatedStatus.Status, model.STATUS_ONLINE)
    91  	require.Equal(t, updatedStatus.DNDEndTime, int64(0))
    92  	require.Equal(t, updatedStatus.PrevStatus, model.STATUS_DND)
    93  	require.Equal(t, updatedStatus.Manual, false)
    94  }