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