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 }