Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package user
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/alicebob/miniredis/v2"
|
||||
"github.com/perfect-panel/server/internal/config"
|
||||
"github.com/perfect-panel/server/internal/svc"
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
func TestClearAllSessions(t *testing.T) {
|
||||
redisServer, err := miniredis.Run()
|
||||
if err != nil {
|
||||
t.Fatalf("miniredis.Run() error = %v", err)
|
||||
}
|
||||
defer redisServer.Close()
|
||||
|
||||
rdb := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
|
||||
defer rdb.Close()
|
||||
|
||||
svcCtx := &svc.ServiceContext{Redis: rdb}
|
||||
ctx := context.Background()
|
||||
|
||||
userID := int64(42)
|
||||
sessionID := "session-a"
|
||||
otherSessionID := "session-b"
|
||||
userSessionKey := config.SessionIdKey + ":" + sessionID
|
||||
userDetailKey := config.SessionIdKey + ":detail:" + sessionID
|
||||
otherSessionKey := config.SessionIdKey + ":" + otherSessionID
|
||||
userSessionsZSet := config.UserSessionsKeyPrefix + "42"
|
||||
deviceKey := config.DeviceCacheKeyKey + ":device-1"
|
||||
unrelatedDeviceKey := config.DeviceCacheKeyKey + ":device-2"
|
||||
|
||||
setString(t, redisServer, userSessionKey, "42")
|
||||
setString(t, redisServer, userDetailKey, "detail")
|
||||
setString(t, redisServer, otherSessionKey, "99")
|
||||
setString(t, redisServer, deviceKey, sessionID)
|
||||
setString(t, redisServer, unrelatedDeviceKey, otherSessionID)
|
||||
if _, err := redisServer.ZAdd(userSessionsZSet, 1, sessionID); err != nil {
|
||||
t.Fatalf("seed session zset: %v", err)
|
||||
}
|
||||
|
||||
if err := clearAllSessions(ctx, svcCtx, userID); err != nil {
|
||||
t.Fatalf("clearAllSessions() error = %v", err)
|
||||
}
|
||||
|
||||
assertMissing(t, redisServer, userSessionKey)
|
||||
assertMissing(t, redisServer, userDetailKey)
|
||||
assertMissing(t, redisServer, deviceKey)
|
||||
assertMissing(t, redisServer, userSessionsZSet)
|
||||
|
||||
if !redisServer.Exists(otherSessionKey) {
|
||||
t.Fatalf("unrelated session %q should remain", otherSessionKey)
|
||||
}
|
||||
if !redisServer.Exists(unrelatedDeviceKey) {
|
||||
t.Fatalf("unrelated device mapping %q should remain", unrelatedDeviceKey)
|
||||
}
|
||||
}
|
||||
|
||||
func setString(t *testing.T, server *miniredis.Miniredis, key, value string) {
|
||||
t.Helper()
|
||||
if err := server.Set(key, value); err != nil {
|
||||
t.Fatalf("set %q: %v", key, err)
|
||||
}
|
||||
}
|
||||
|
||||
func assertMissing(t *testing.T, server *miniredis.Miniredis, key string) {
|
||||
t.Helper()
|
||||
if server.Exists(key) {
|
||||
t.Fatalf("expected key %q to be removed", key)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user