93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
//go:build integration
|
|
// +build integration
|
|
|
|
package refreshtokens_test
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"testing"
|
|
|
|
"git.sendico.io/tech/sxchnge/bff/edge/shared/storage/refreshtokens"
|
|
"git.sendico.io/tech/sxchnge/bff/pkg/db/repository"
|
|
"git.sendico.io/tech/sxchnge/bff/pkg/db/repository/builder"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
"go.mongodb.org/mongo-driver/v2/bson"
|
|
)
|
|
|
|
func TestRefreshTokenDB_DatabaseIndexes(t *testing.T) {
|
|
db, cleanup := setupTestDB(t)
|
|
defer cleanup()
|
|
|
|
ctx := context.Background()
|
|
|
|
t.Run("Unique_Token_Constraint", func(t *testing.T) {
|
|
userID1 := bson.NewObjectID()
|
|
userID2 := bson.NewObjectID()
|
|
token := "duplicate_token_123"
|
|
|
|
refreshToken1 := createTestRefreshToken(userID1, "client1", "device1", token)
|
|
err := db.Create(ctx, refreshToken1)
|
|
require.NoError(t, err)
|
|
|
|
refreshToken2 := createTestRefreshToken(userID2, "client2", "device2", token)
|
|
err = db.Create(ctx, refreshToken2)
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "duplicate")
|
|
})
|
|
|
|
t.Run("Query_Performance_By_Revocation_Status", func(t *testing.T) {
|
|
userID := bson.NewObjectID()
|
|
clientID := "web-app"
|
|
|
|
for i := 0; i < 10; i++ {
|
|
token := createTestRefreshToken(userID, clientID,
|
|
fmt.Sprintf("device_%d", i), fmt.Sprintf("token_%d", i))
|
|
if i%2 == 0 {
|
|
token.IsRevoked = true
|
|
}
|
|
err := db.Create(ctx, token)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
query := repository.Query().
|
|
Filter(repository.AccountField(), userID).
|
|
And(repository.Query().Comparison(repository.Field(refreshtokens.IsRevokedField), builder.Eq, false))
|
|
|
|
ids, err := db.ListIDs(ctx, query)
|
|
require.NoError(t, err)
|
|
assert.Len(t, ids, 5)
|
|
})
|
|
}
|
|
|
|
func TestRefreshTokenDB_IndexPartialUniqueActiveSession(t *testing.T) {
|
|
db, database, cleanup := setupTestDBWithMongo(t)
|
|
defer cleanup()
|
|
|
|
ctx := context.Background()
|
|
|
|
cursor, err := database.Collection(db.Repository.Collection()).Indexes().List(ctx)
|
|
require.NoError(t, err)
|
|
defer cursor.Close(ctx)
|
|
|
|
found := false
|
|
for cursor.Next(ctx) {
|
|
var idx bson.M
|
|
require.NoError(t, cursor.Decode(&idx))
|
|
if idx["name"] == "unique_active_session" {
|
|
found = true
|
|
assert.Equal(t, true, idx["unique"])
|
|
|
|
partialRaw, err := bson.Marshal(idx["partialFilterExpression"])
|
|
require.NoError(t, err)
|
|
|
|
var partial bson.M
|
|
err = bson.Unmarshal(partialRaw, &partial)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, bson.M{"isRevoked": false}, partial)
|
|
}
|
|
}
|
|
assert.True(t, found, "unique_active_session index not found")
|
|
}
|