main

mattermost/focalboard

Last updated at: 29/12/2023 09:47

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)
}