session.go
TLDR
This file contains tests for the session store in the store package. It includes test cases for creating, getting, and deleting sessions, as well as getting the active user count and updating sessions.
Methods
StoreTestSessionStore
This method is a wrapper function for running multiple test cases related to session storage. It takes in a testing object and a setup function to initialize the store and returns the test results.
testCreateAndGetAndDeleteSession
This method includes test cases for creating, getting, and deleting sessions. It takes in a testing object and the store object as parameters.
testGetActiveUserCount
This method includes test cases for getting the active user count. It takes in a testing object and the store object as parameters.
testUpdateSession
This method includes test cases for updating sessions. It takes in a testing object and the store object as parameters.
package storetests
import (
"fmt"
"testing"
"time"
"github.com/mattermost/focalboard/server/model"
"github.com/mattermost/focalboard/server/services/store"
"github.com/stretchr/testify/require"
)
func StoreTestSessionStore(t *testing.T, setup func(t *testing.T) (store.Store, func())) {
t.Run("CreateAndGetAndDeleteSession", func(t *testing.T) {
store, tearDown := setup(t)
defer tearDown()
testCreateAndGetAndDeleteSession(t, store)
})
t.Run("GetActiveUserCount", func(t *testing.T) {
store, tearDown := setup(t)
defer tearDown()
testGetActiveUserCount(t, store)
})
t.Run("UpdateSession", func(t *testing.T) {
store, tearDown := setup(t)
defer tearDown()
testUpdateSession(t, store)
})
}
func testCreateAndGetAndDeleteSession(t *testing.T, store store.Store) {
session := &model.Session{
ID: "session-id",
Token: "token",
}
t.Run("CreateAndGetSession", func(t *testing.T) {
err := store.CreateSession(session)
require.NoError(t, err)
got, err := store.GetSession(session.Token, 60*60)
require.NoError(t, err)
require.Equal(t, session, got)
})
t.Run("Get nonexistent session", func(t *testing.T) {
got, err := store.GetSession("nonexistent-token", 60*60)
require.True(t, model.IsErrNotFound(err))
require.Nil(t, got)
})
t.Run("DeleteAndGetSession", func(t *testing.T) {
err := store.DeleteSession(session.ID)
require.NoError(t, err)
_, err = store.GetSession(session.Token, 60*60)
require.Error(t, err)
})
}
func testGetActiveUserCount(t *testing.T, store store.Store) {
t.Run("no active user", func(t *testing.T) {
count, err := store.GetActiveUserCount(60)
require.NoError(t, err)
require.Equal(t, 0, count)
})
t.Run("active user", func(t *testing.T) {
// gen random count active user session
count := int(time.Now().Unix() % 10)
for i := 0; i < count; i++ {
session := &model.Session{
ID: fmt.Sprintf("id-%d", i),
UserID: fmt.Sprintf("user-id-%d", i),
Token: fmt.Sprintf("token-%d", i),
}
err := store.CreateSession(session)
require.NoError(t, err)
}
got, err := store.GetActiveUserCount(60)
require.NoError(t, err)
require.Equal(t, count, got)
})
}
func testUpdateSession(t *testing.T, store store.Store) {
session := &model.Session{
ID: "session-id",
Token: "token",
Props: map[string]interface{}{"field1": "A"},
}
err := store.CreateSession(session)
require.NoError(t, err)
// update session
session.Props["field1"] = "B"
err = store.UpdateSession(session)
require.NoError(t, err)
got, err := store.GetSession(session.Token, 60)
require.NoError(t, err)
require.Equal(t, session, got)
}