164 lines
5.4 KiB
Go
164 lines
5.4 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
apperrors "github.com/Tencent/WeKnora/internal/errors"
|
|
"github.com/Tencent/WeKnora/internal/types"
|
|
"github.com/Tencent/WeKnora/internal/types/interfaces"
|
|
"github.com/stretchr/testify/require"
|
|
"gorm.io/driver/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func newSessionRepositoryForTest(t *testing.T) (interfaces.SessionRepository, *gorm.DB) {
|
|
t.Helper()
|
|
|
|
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
|
require.NoError(t, err)
|
|
require.NoError(t, db.AutoMigrate(&types.Session{}))
|
|
|
|
return NewSessionRepository(db), db
|
|
}
|
|
|
|
func createSessionForTest(t *testing.T, db *gorm.DB, tenantID uint64, userID string) *types.Session {
|
|
t.Helper()
|
|
|
|
session := &types.Session{
|
|
TenantID: tenantID,
|
|
UserID: userID,
|
|
Title: userID + " session",
|
|
}
|
|
if userID == "" {
|
|
session.Title = "legacy tenant session"
|
|
}
|
|
require.NoError(t, db.Create(session).Error)
|
|
|
|
return session
|
|
}
|
|
|
|
func countActiveSessionsForTest(t *testing.T, db *gorm.DB, id string) int64 {
|
|
t.Helper()
|
|
|
|
var count int64
|
|
require.NoError(t, db.Model(&types.Session{}).Where("id = ?", id).Count(&count).Error)
|
|
return count
|
|
}
|
|
|
|
func sessionIDsForTest(sessions []*types.Session) []string {
|
|
ids := make([]string, 0, len(sessions))
|
|
for _, session := range sessions {
|
|
ids = append(ids, session.ID)
|
|
}
|
|
return ids
|
|
}
|
|
|
|
func TestSessionRepositoryGetAndListHonorUserScope(t *testing.T) {
|
|
repo, db := newSessionRepositoryForTest(t)
|
|
ctx := context.Background()
|
|
aliceSession := createSessionForTest(t, db, 1, "alice")
|
|
bobSession := createSessionForTest(t, db, 1, "bob")
|
|
legacySession := createSessionForTest(t, db, 1, "")
|
|
_ = createSessionForTest(t, db, 2, "bob")
|
|
|
|
_, err := repo.Get(ctx, 1, "bob", aliceSession.ID)
|
|
require.ErrorIs(t, err, apperrors.ErrSessionNotFound)
|
|
|
|
got, err := repo.Get(ctx, 1, "bob", bobSession.ID)
|
|
require.NoError(t, err)
|
|
require.Equal(t, bobSession.ID, got.ID)
|
|
|
|
got, err = repo.Get(ctx, 1, "bob", legacySession.ID)
|
|
require.NoError(t, err)
|
|
require.Equal(t, legacySession.ID, got.ID)
|
|
|
|
sessions, err := repo.GetByTenantID(ctx, 1, "bob")
|
|
require.NoError(t, err)
|
|
require.ElementsMatch(t, []string{bobSession.ID, legacySession.ID}, sessionIDsForTest(sessions))
|
|
|
|
paged, total, err := repo.GetPagedByTenantID(ctx, 1, "bob", &types.Pagination{Page: 1, PageSize: 10})
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 2, total)
|
|
require.ElementsMatch(t, []string{bobSession.ID, legacySession.ID}, sessionIDsForTest(paged))
|
|
}
|
|
|
|
func TestSessionRepositoryUpdateHonorsUserScope(t *testing.T) {
|
|
repo, db := newSessionRepositoryForTest(t)
|
|
ctx := context.Background()
|
|
aliceSession := createSessionForTest(t, db, 1, "alice")
|
|
|
|
rows, err := repo.Update(ctx, &types.Session{
|
|
ID: aliceSession.ID,
|
|
TenantID: aliceSession.TenantID,
|
|
Title: "bob update attempt",
|
|
}, "bob")
|
|
require.NoError(t, err)
|
|
require.Zero(t, rows)
|
|
|
|
var unchanged types.Session
|
|
require.NoError(t, db.First(&unchanged, "id = ?", aliceSession.ID).Error)
|
|
require.Equal(t, aliceSession.Title, unchanged.Title)
|
|
|
|
rows, err = repo.Update(ctx, &types.Session{
|
|
ID: aliceSession.ID,
|
|
TenantID: aliceSession.TenantID,
|
|
Title: "alice updated session",
|
|
}, "alice")
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 1, rows)
|
|
|
|
var changed types.Session
|
|
require.NoError(t, db.First(&changed, "id = ?", aliceSession.ID).Error)
|
|
require.Equal(t, "alice updated session", changed.Title)
|
|
}
|
|
|
|
func TestSessionRepositoryDeleteHonorsUserScope(t *testing.T) {
|
|
repo, db := newSessionRepositoryForTest(t)
|
|
ctx := context.Background()
|
|
aliceSession := createSessionForTest(t, db, 1, "alice")
|
|
bobSession := createSessionForTest(t, db, 1, "bob")
|
|
|
|
rows, err := repo.Delete(ctx, 1, "bob", aliceSession.ID)
|
|
require.NoError(t, err)
|
|
require.Zero(t, rows)
|
|
require.EqualValues(t, 1, countActiveSessionsForTest(t, db, aliceSession.ID))
|
|
|
|
rows, err = repo.Delete(ctx, 1, "bob", bobSession.ID)
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 1, rows)
|
|
require.Zero(t, countActiveSessionsForTest(t, db, bobSession.ID))
|
|
}
|
|
|
|
func TestSessionRepositoryBatchDeleteHonorsUserScope(t *testing.T) {
|
|
repo, db := newSessionRepositoryForTest(t)
|
|
ctx := context.Background()
|
|
aliceSession := createSessionForTest(t, db, 1, "alice")
|
|
bobSession := createSessionForTest(t, db, 1, "bob")
|
|
legacySession := createSessionForTest(t, db, 1, "")
|
|
|
|
rows, err := repo.BatchDelete(ctx, 1, "bob", []string{aliceSession.ID, bobSession.ID, legacySession.ID})
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 2, rows)
|
|
require.EqualValues(t, 1, countActiveSessionsForTest(t, db, aliceSession.ID))
|
|
require.Zero(t, countActiveSessionsForTest(t, db, bobSession.ID))
|
|
require.Zero(t, countActiveSessionsForTest(t, db, legacySession.ID))
|
|
}
|
|
|
|
func TestSessionRepositoryDeleteAllHonorsUserScope(t *testing.T) {
|
|
repo, db := newSessionRepositoryForTest(t)
|
|
ctx := context.Background()
|
|
aliceSession := createSessionForTest(t, db, 1, "alice")
|
|
bobSession := createSessionForTest(t, db, 1, "bob")
|
|
legacySession := createSessionForTest(t, db, 1, "")
|
|
otherTenantSession := createSessionForTest(t, db, 2, "bob")
|
|
|
|
rows, err := repo.DeleteAllByTenantID(ctx, 1, "bob")
|
|
require.NoError(t, err)
|
|
require.EqualValues(t, 2, rows)
|
|
require.EqualValues(t, 1, countActiveSessionsForTest(t, db, aliceSession.ID))
|
|
require.Zero(t, countActiveSessionsForTest(t, db, bobSession.ID))
|
|
require.Zero(t, countActiveSessionsForTest(t, db, legacySession.ID))
|
|
require.EqualValues(t, 1, countActiveSessionsForTest(t, db, otherTenantSession.ID))
|
|
}
|