github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/status_store.go (about)

     1  // Copyright (c) 2016-present Xenia, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"sort"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/xzl8028/xenia-server/model"
    14  	"github.com/xzl8028/xenia-server/store"
    15  )
    16  
    17  func TestStatusStore(t *testing.T, ss store.Store) {
    18  	t.Run("", func(t *testing.T) { testStatusStore(t, ss) })
    19  	t.Run("ActiveUserCount", func(t *testing.T) { testActiveUserCount(t, ss) })
    20  	t.Run("GetAllFromTeam", func(t *testing.T) { testGetAllFromTeam(t, ss) })
    21  }
    22  
    23  func testStatusStore(t *testing.T, ss store.Store) {
    24  	status := &model.Status{UserId: model.NewId(), Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    25  	require.Nil(t, ss.Status().SaveOrUpdate(status))
    26  
    27  	status.LastActivityAt = 10
    28  
    29  	if _, err := ss.Status().Get(status.UserId); err != nil {
    30  		t.Fatal(err)
    31  	}
    32  
    33  	status2 := &model.Status{UserId: model.NewId(), Status: model.STATUS_AWAY, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    34  	require.Nil(t, ss.Status().SaveOrUpdate(status2))
    35  
    36  	status3 := &model.Status{UserId: model.NewId(), Status: model.STATUS_OFFLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
    37  	require.Nil(t, ss.Status().SaveOrUpdate(status3))
    38  
    39  	if statuses, err := ss.Status().GetOnlineAway(); err != nil {
    40  		t.Fatal(err)
    41  	} else {
    42  		for _, status := range statuses {
    43  			if status.Status == model.STATUS_OFFLINE {
    44  				t.Fatal("should not have returned offline statuses")
    45  			}
    46  		}
    47  	}
    48  
    49  	if statuses, err := ss.Status().GetOnline(); err != nil {
    50  		t.Fatal(err)
    51  	} else {
    52  		for _, status := range statuses {
    53  			if status.Status != model.STATUS_ONLINE {
    54  				t.Fatal("should not have returned offline statuses")
    55  			}
    56  		}
    57  	}
    58  
    59  	if statuses, err := ss.Status().GetByIds([]string{status.UserId, "junk"}); err != nil {
    60  		t.Fatal(err)
    61  	} else {
    62  		if len(statuses) != 1 {
    63  			t.Fatal("should only have 1 status")
    64  		}
    65  	}
    66  
    67  	if err := ss.Status().ResetAll(); err != nil {
    68  		t.Fatal(err)
    69  	}
    70  
    71  	if statusParameter, err := ss.Status().Get(status.UserId); err != nil {
    72  		t.Fatal(err)
    73  	} else {
    74  		if statusParameter.Status != model.STATUS_OFFLINE {
    75  			t.Fatal("should be offline")
    76  		}
    77  	}
    78  
    79  	if result := <-ss.Status().UpdateLastActivityAt(status.UserId, 10); result.Err != nil {
    80  		t.Fatal(result.Err)
    81  	}
    82  }
    83  
    84  func testActiveUserCount(t *testing.T, ss store.Store) {
    85  	status := &model.Status{UserId: model.NewId(), Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
    86  	require.Nil(t, ss.Status().SaveOrUpdate(status))
    87  
    88  	if count, err := ss.Status().GetTotalActiveUsersCount(); err != nil {
    89  		t.Fatal(err)
    90  	} else {
    91  		require.True(t, count > 0, "expected count > 0, got %d", count)
    92  	}
    93  }
    94  
    95  type ByUserId []*model.Status
    96  
    97  func (s ByUserId) Len() int           { return len(s) }
    98  func (s ByUserId) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
    99  func (s ByUserId) Less(i, j int) bool { return s[i].UserId < s[j].UserId }
   100  
   101  func testGetAllFromTeam(t *testing.T, ss store.Store) {
   102  	assertStatuses := func(expected, actual []*model.Status) {
   103  		sort.Sort(ByUserId(expected))
   104  		sort.Sort(ByUserId(actual))
   105  		assert.Equal(t, expected, actual)
   106  	}
   107  
   108  	team1 := model.Team{}
   109  	team1.DisplayName = model.NewId()
   110  	team1.Name = model.NewId()
   111  	team1.Email = MakeEmail()
   112  	team1.Type = model.TEAM_OPEN
   113  
   114  	if _, err := ss.Team().Save(&team1); err != nil {
   115  		t.Fatal("couldn't save team", err)
   116  	}
   117  
   118  	team2 := model.Team{}
   119  	team2.DisplayName = model.NewId()
   120  	team2.Name = model.NewId()
   121  	team2.Email = MakeEmail()
   122  	team2.Type = model.TEAM_OPEN
   123  
   124  	if _, err := ss.Team().Save(&team2); err != nil {
   125  		t.Fatal("couldn't save team", err)
   126  	}
   127  
   128  	team1Member1 := &model.TeamMember{TeamId: team1.Id, UserId: model.NewId()}
   129  	if response := <-ss.Team().SaveMember(team1Member1, -1); response.Err != nil {
   130  		t.Fatal(response.Err)
   131  	}
   132  	team1Member2 := &model.TeamMember{TeamId: team1.Id, UserId: model.NewId()}
   133  	if response := <-ss.Team().SaveMember(team1Member2, -1); response.Err != nil {
   134  		t.Fatal(response.Err)
   135  	}
   136  	team2Member1 := &model.TeamMember{TeamId: team2.Id, UserId: model.NewId()}
   137  	if response := <-ss.Team().SaveMember(team2Member1, -1); response.Err != nil {
   138  		t.Fatal(response.Err)
   139  	}
   140  	team2Member2 := &model.TeamMember{TeamId: team2.Id, UserId: model.NewId()}
   141  	if response := <-ss.Team().SaveMember(team2Member2, -1); response.Err != nil {
   142  		t.Fatal(response.Err)
   143  	}
   144  
   145  	team1Member1Status := &model.Status{UserId: team1Member1.UserId, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: 0, ActiveChannel: ""}
   146  	require.Nil(t, ss.Status().SaveOrUpdate(team1Member1Status))
   147  
   148  	team1Member2Status := &model.Status{UserId: team1Member2.UserId, Status: model.STATUS_OFFLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
   149  	require.Nil(t, ss.Status().SaveOrUpdate(team1Member2Status))
   150  
   151  	team2Member1Status := &model.Status{UserId: team2Member1.UserId, Status: model.STATUS_ONLINE, Manual: true, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
   152  	require.Nil(t, ss.Status().SaveOrUpdate(team2Member1Status))
   153  
   154  	team2Member2Status := &model.Status{UserId: team2Member2.UserId, Status: model.STATUS_OFFLINE, Manual: true, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
   155  	require.Nil(t, ss.Status().SaveOrUpdate(team2Member2Status))
   156  
   157  	if statuses, err := ss.Status().GetAllFromTeam(team1.Id); err != nil {
   158  		t.Fatal(err)
   159  	} else {
   160  		assertStatuses([]*model.Status{
   161  			team1Member1Status,
   162  			team1Member2Status,
   163  		}, statuses)
   164  	}
   165  
   166  	if statuses, err := ss.Status().GetAllFromTeam(team2.Id); err != nil {
   167  		t.Fatal(err)
   168  	} else {
   169  		assertStatuses([]*model.Status{
   170  			team2Member1Status,
   171  			team2Member2Status,
   172  		}, statuses)
   173  	}
   174  }