github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/services/users/session_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package users
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/masterhung0112/hk_server/v5/model"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  const (
    15  	dayInMillis = 86400000
    16  	grace       = 5 * 1000
    17  	thirtyDays  = dayInMillis * 30
    18  )
    19  
    20  func TestCache(t *testing.T) {
    21  	th := Setup(t)
    22  	defer th.TearDown()
    23  
    24  	session := &model.Session{
    25  		Id:     model.NewId(),
    26  		Token:  model.NewId(),
    27  		UserId: model.NewId(),
    28  	}
    29  
    30  	session2 := &model.Session{
    31  		Id:     model.NewId(),
    32  		Token:  model.NewId(),
    33  		UserId: model.NewId(),
    34  	}
    35  
    36  	th.service.sessionCache.SetWithExpiry(session.Token, session, 5*time.Minute)
    37  	th.service.sessionCache.SetWithExpiry(session2.Token, session2, 5*time.Minute)
    38  
    39  	keys, err := th.service.sessionCache.Keys()
    40  	require.NoError(t, err)
    41  	require.NotEmpty(t, keys)
    42  
    43  	th.service.ClearUserSessionCache(session.UserId)
    44  
    45  	rkeys, err := th.service.sessionCache.Keys()
    46  	require.NoError(t, err)
    47  	require.Lenf(t, rkeys, len(keys)-1, "should have one less: %d - %d != 1", len(keys), len(rkeys))
    48  	require.NotEmpty(t, rkeys)
    49  
    50  	th.service.ClearAllUsersSessionCache()
    51  
    52  	rkeys, err = th.service.sessionCache.Keys()
    53  	require.NoError(t, err)
    54  	require.Empty(t, rkeys)
    55  }
    56  
    57  func TestSetSessionExpireInDays(t *testing.T) {
    58  	th := Setup(t)
    59  	defer th.TearDown()
    60  
    61  	now := model.GetMillis()
    62  	createAt := now - (dayInMillis * 20)
    63  
    64  	tests := []struct {
    65  		name   string
    66  		extend bool
    67  		create bool
    68  		days   int
    69  		want   int64
    70  	}{
    71  		{name: "zero days, extend", extend: true, create: true, days: 0, want: now},
    72  		{name: "zero days, extend", extend: true, create: false, days: 0, want: now},
    73  		{name: "zero days, no extend", extend: false, create: true, days: 0, want: createAt},
    74  		{name: "zero days, no extend", extend: false, create: false, days: 0, want: now},
    75  		{name: "thirty days, extend", extend: true, create: true, days: 30, want: now + thirtyDays},
    76  		{name: "thirty days, extend", extend: true, create: false, days: 30, want: now + thirtyDays},
    77  		{name: "thirty days, no extend", extend: false, create: true, days: 30, want: createAt + thirtyDays},
    78  		{name: "thirty days, no extend", extend: false, create: false, days: 30, want: now + thirtyDays},
    79  	}
    80  	for _, tt := range tests {
    81  		t.Run(tt.name, func(t *testing.T) {
    82  			th.UpdateConfig(func(cfg *model.Config) {
    83  				*cfg.ServiceSettings.ExtendSessionLengthWithActivity = tt.extend
    84  			})
    85  			var create int64
    86  			if tt.create {
    87  				create = createAt
    88  			}
    89  
    90  			session := &model.Session{
    91  				CreateAt:  create,
    92  				ExpiresAt: model.GetMillis() + dayInMillis,
    93  			}
    94  			th.service.SetSessionExpireInDays(session, tt.days)
    95  
    96  			// must be within 5 seconds of expected time.
    97  			require.GreaterOrEqual(t, session.ExpiresAt, tt.want-grace)
    98  			require.LessOrEqual(t, session.ExpiresAt, tt.want+grace)
    99  		})
   100  	}
   101  }
   102  
   103  func TestOAuthRevokeAccessToken(t *testing.T) {
   104  	th := Setup(t)
   105  	defer th.TearDown()
   106  
   107  	err := th.service.RevokeAccessToken(model.NewRandomString(16))
   108  	require.Error(t, err, "Should have failed due to an incorrect token")
   109  
   110  	session := &model.Session{}
   111  	session.CreateAt = model.GetMillis()
   112  	session.UserId = model.NewId()
   113  	session.Token = model.NewId()
   114  	session.Roles = model.SYSTEM_USER_ROLE_ID
   115  	th.service.SetSessionExpireInDays(session, 1)
   116  
   117  	session, _ = th.service.CreateSession(session)
   118  	err = th.service.RevokeAccessToken(session.Token)
   119  	require.Error(t, err, "Should have failed does not have an access token")
   120  
   121  	accessData := &model.AccessData{}
   122  	accessData.Token = session.Token
   123  	accessData.UserId = session.UserId
   124  	accessData.RedirectUri = "http://example.com"
   125  	accessData.ClientId = model.NewId()
   126  	accessData.ExpiresAt = session.ExpiresAt
   127  
   128  	_, nErr := th.service.oAuthStore.SaveAccessData(accessData)
   129  	require.NoError(t, nErr)
   130  
   131  	err = th.service.RevokeAccessToken(accessData.Token)
   132  	require.NoError(t, err)
   133  }