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 }