github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/api4/status_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  
    12  	"github.com/masterhung0112/hk_server/v5/model"
    13  )
    14  
    15  func TestGetUserStatus(t *testing.T) {
    16  	th := Setup(t).InitBasic()
    17  	defer th.TearDown()
    18  	Client := th.Client
    19  
    20  	t.Run("offline status", func(t *testing.T) {
    21  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    22  		CheckNoError(t, resp)
    23  		assert.Equal(t, "offline", userStatus.Status)
    24  	})
    25  
    26  	t.Run("online status", func(t *testing.T) {
    27  		th.App.SetStatusOnline(th.BasicUser.Id, true)
    28  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    29  		CheckNoError(t, resp)
    30  		assert.Equal(t, "online", userStatus.Status)
    31  	})
    32  
    33  	t.Run("away status", func(t *testing.T) {
    34  		th.App.SetStatusAwayIfNeeded(th.BasicUser.Id, true)
    35  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    36  		CheckNoError(t, resp)
    37  		assert.Equal(t, "away", userStatus.Status)
    38  	})
    39  
    40  	t.Run("dnd status", func(t *testing.T) {
    41  		th.App.SetStatusDoNotDisturb(th.BasicUser.Id)
    42  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    43  		CheckNoError(t, resp)
    44  		assert.Equal(t, "dnd", userStatus.Status)
    45  	})
    46  
    47  	t.Run("dnd status timed", func(t *testing.T) {
    48  		th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(10*time.Minute).Unix())
    49  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    50  		CheckNoError(t, resp)
    51  		assert.Equal(t, "dnd", userStatus.Status)
    52  	})
    53  
    54  	t.Run("dnd status timed restore after time interval", func(t *testing.T) {
    55  		task := model.CreateRecurringTaskFromNextIntervalTime("Unset DND Statuses From Test", th.App.UpdateDNDStatusOfUsers, 1*time.Second)
    56  		defer task.Cancel()
    57  		th.App.SetStatusOnline(th.BasicUser.Id, true)
    58  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    59  		CheckNoError(t, resp)
    60  		assert.Equal(t, "online", userStatus.Status)
    61  		th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(2*time.Second).Unix())
    62  		userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "")
    63  		CheckNoError(t, resp)
    64  		assert.Equal(t, "dnd", userStatus.Status)
    65  		time.Sleep(3 * time.Second)
    66  		userStatus, resp = Client.GetUserStatus(th.BasicUser.Id, "")
    67  		CheckNoError(t, resp)
    68  		assert.Equal(t, "online", userStatus.Status)
    69  	})
    70  	t.Run("back to offline status", func(t *testing.T) {
    71  		th.App.SetStatusOffline(th.BasicUser.Id, true)
    72  		userStatus, resp := Client.GetUserStatus(th.BasicUser.Id, "")
    73  		CheckNoError(t, resp)
    74  		assert.Equal(t, "offline", userStatus.Status)
    75  	})
    76  
    77  	t.Run("get other user status", func(t *testing.T) {
    78  		//Get user2 status logged as user1
    79  		userStatus, resp := Client.GetUserStatus(th.BasicUser2.Id, "")
    80  		CheckNoError(t, resp)
    81  		assert.Equal(t, "offline", userStatus.Status)
    82  	})
    83  
    84  	t.Run("get status from logged out user", func(t *testing.T) {
    85  		Client.Logout()
    86  		_, resp := Client.GetUserStatus(th.BasicUser2.Id, "")
    87  		CheckUnauthorizedStatus(t, resp)
    88  	})
    89  
    90  	t.Run("get status from other user", func(t *testing.T) {
    91  		th.LoginBasic2()
    92  		userStatus, resp := Client.GetUserStatus(th.BasicUser2.Id, "")
    93  		CheckNoError(t, resp)
    94  		assert.Equal(t, "offline", userStatus.Status)
    95  	})
    96  }
    97  
    98  func TestGetUsersStatusesByIds(t *testing.T) {
    99  	th := Setup(t).InitBasic()
   100  	defer th.TearDown()
   101  	Client := th.Client
   102  
   103  	usersIds := []string{th.BasicUser.Id, th.BasicUser2.Id}
   104  
   105  	t.Run("empty userIds list", func(t *testing.T) {
   106  		_, resp := Client.GetUsersStatusesByIds([]string{})
   107  		CheckBadRequestStatus(t, resp)
   108  	})
   109  
   110  	t.Run("completely invalid userIds list", func(t *testing.T) {
   111  		_, resp := Client.GetUsersStatusesByIds([]string{"invalid_user_id", "invalid_user_id"})
   112  		CheckBadRequestStatus(t, resp)
   113  	})
   114  
   115  	t.Run("partly invalid userIds list", func(t *testing.T) {
   116  		_, resp := Client.GetUsersStatusesByIds([]string{th.BasicUser.Id, "invalid_user_id"})
   117  		CheckBadRequestStatus(t, resp)
   118  	})
   119  
   120  	t.Run("offline status", func(t *testing.T) {
   121  		usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds)
   122  		CheckNoError(t, resp)
   123  		for _, userStatus := range usersStatuses {
   124  			assert.Equal(t, "offline", userStatus.Status)
   125  		}
   126  	})
   127  
   128  	t.Run("online status", func(t *testing.T) {
   129  		th.App.SetStatusOnline(th.BasicUser.Id, true)
   130  		th.App.SetStatusOnline(th.BasicUser2.Id, true)
   131  		usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds)
   132  		CheckNoError(t, resp)
   133  		for _, userStatus := range usersStatuses {
   134  			assert.Equal(t, "online", userStatus.Status)
   135  		}
   136  	})
   137  
   138  	t.Run("away status", func(t *testing.T) {
   139  		th.App.SetStatusAwayIfNeeded(th.BasicUser.Id, true)
   140  		th.App.SetStatusAwayIfNeeded(th.BasicUser2.Id, true)
   141  		usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds)
   142  		CheckNoError(t, resp)
   143  		for _, userStatus := range usersStatuses {
   144  			assert.Equal(t, "away", userStatus.Status)
   145  		}
   146  	})
   147  
   148  	t.Run("dnd status", func(t *testing.T) {
   149  		th.App.SetStatusDoNotDisturb(th.BasicUser.Id)
   150  		th.App.SetStatusDoNotDisturb(th.BasicUser2.Id)
   151  		usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds)
   152  		CheckNoError(t, resp)
   153  		for _, userStatus := range usersStatuses {
   154  			assert.Equal(t, "dnd", userStatus.Status)
   155  		}
   156  	})
   157  
   158  	t.Run("dnd status", func(t *testing.T) {
   159  		th.App.SetStatusDoNotDisturbTimed(th.BasicUser.Id, time.Now().Add(10*time.Minute).Unix())
   160  		th.App.SetStatusDoNotDisturbTimed(th.BasicUser2.Id, time.Now().Add(15*time.Minute).Unix())
   161  		usersStatuses, resp := Client.GetUsersStatusesByIds(usersIds)
   162  		CheckNoError(t, resp)
   163  		for _, userStatus := range usersStatuses {
   164  			assert.Equal(t, "dnd", userStatus.Status)
   165  		}
   166  	})
   167  
   168  	t.Run("get statuses from logged out user", func(t *testing.T) {
   169  		Client.Logout()
   170  
   171  		_, resp := Client.GetUsersStatusesByIds(usersIds)
   172  		CheckUnauthorizedStatus(t, resp)
   173  	})
   174  }
   175  
   176  func TestUpdateUserStatus(t *testing.T) {
   177  	th := Setup(t).InitBasic()
   178  	defer th.TearDown()
   179  	Client := th.Client
   180  
   181  	t.Run("set online status", func(t *testing.T) {
   182  		toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser.Id}
   183  		updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus)
   184  		CheckNoError(t, resp)
   185  		assert.Equal(t, "online", updateUserStatus.Status)
   186  	})
   187  
   188  	t.Run("set away status", func(t *testing.T) {
   189  		toUpdateUserStatus := &model.Status{Status: "away", UserId: th.BasicUser.Id}
   190  		updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus)
   191  		CheckNoError(t, resp)
   192  		assert.Equal(t, "away", updateUserStatus.Status)
   193  	})
   194  
   195  	t.Run("set dnd status timed", func(t *testing.T) {
   196  		toUpdateUserStatus := &model.Status{Status: "dnd", UserId: th.BasicUser.Id, DNDEndTime: time.Now().Add(10 * time.Minute).Unix()}
   197  		updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus)
   198  		CheckNoError(t, resp)
   199  		assert.Equal(t, "dnd", updateUserStatus.Status)
   200  	})
   201  
   202  	t.Run("set offline status", func(t *testing.T) {
   203  		toUpdateUserStatus := &model.Status{Status: "offline", UserId: th.BasicUser.Id}
   204  		updateUserStatus, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus)
   205  		CheckNoError(t, resp)
   206  		assert.Equal(t, "offline", updateUserStatus.Status)
   207  	})
   208  
   209  	t.Run("set status for other user as regular user", func(t *testing.T) {
   210  		toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id}
   211  		_, resp := Client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus)
   212  		CheckForbiddenStatus(t, resp)
   213  	})
   214  
   215  	t.Run("set status for other user as admin user", func(t *testing.T) {
   216  		toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id}
   217  		updateUserStatus, _ := th.SystemAdminClient.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus)
   218  		assert.Equal(t, "online", updateUserStatus.Status)
   219  	})
   220  
   221  	t.Run("not matching status user id and the user id passed in the function", func(t *testing.T) {
   222  		toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id}
   223  		_, resp := Client.UpdateUserStatus(th.BasicUser.Id, toUpdateUserStatus)
   224  		CheckBadRequestStatus(t, resp)
   225  	})
   226  
   227  	t.Run("get statuses from logged out user", func(t *testing.T) {
   228  		toUpdateUserStatus := &model.Status{Status: "online", UserId: th.BasicUser2.Id}
   229  		Client.Logout()
   230  
   231  		_, resp := Client.UpdateUserStatus(th.BasicUser2.Id, toUpdateUserStatus)
   232  		CheckUnauthorizedStatus(t, resp)
   233  	})
   234  }