Files
Authentication/redisclient/redis_test.go
T
2025-11-25 15:12:31 +08:00

234 lines
4.6 KiB
Go

package redisclient
import (
"context"
"testing"
"time"
"github.com/alicebob/miniredis/v2"
"github.com/redis/go-redis/v9"
)
func TestRedisConnection(t *testing.T) {
// Create a miniredis server
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
// Create a test Redis client
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Test SET
err = testClient.Set(ctx, "test_key", "test_value", time.Minute).Err()
if err != nil {
t.Errorf("Failed to set key: %v", err)
}
// Test GET
val, err := testClient.Get(ctx, "test_key").Result()
if err != nil {
t.Errorf("Failed to get key: %v", err)
}
if val != "test_value" {
t.Errorf("Expected 'test_value', got '%s'", val)
}
// Test DEL
err = testClient.Del(ctx, "test_key").Err()
if err != nil {
t.Errorf("Failed to delete key: %v", err)
}
// Verify key was deleted
_, err = testClient.Get(ctx, "test_key").Result()
if err != redis.Nil {
t.Errorf("Expected redis.Nil error, got: %v", err)
}
}
func TestRedisExpiry(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Set key with TTL
err = testClient.Set(ctx, "expiring_key", "value", time.Second).Err()
if err != nil {
t.Errorf("Failed to set key with TTL: %v", err)
}
// Check TTL
ttl := mr.TTL("expiring_key")
if ttl <= 0 {
t.Error("Expected TTL to be set")
}
// Fast forward time in miniredis
mr.FastForward(2 * time.Second)
// Key should be expired
_, err = testClient.Get(ctx, "expiring_key").Result()
if err != redis.Nil {
t.Errorf("Expected key to be expired, got error: %v", err)
}
}
func TestRedisIncrement(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Test INCR
val, err := testClient.Incr(ctx, "counter").Result()
if err != nil {
t.Errorf("Failed to increment: %v", err)
}
if val != 1 {
t.Errorf("Expected 1, got %d", val)
}
// Increment again
val, err = testClient.Incr(ctx, "counter").Result()
if err != nil {
t.Errorf("Failed to increment: %v", err)
}
if val != 2 {
t.Errorf("Expected 2, got %d", val)
}
}
func TestRedisExists(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Key shouldn't exist initially
exists, err := testClient.Exists(ctx, "nonexistent").Result()
if err != nil {
t.Errorf("Failed to check existence: %v", err)
}
if exists != 0 {
t.Errorf("Expected 0, got %d", exists)
}
// Set key
err = testClient.Set(ctx, "existing_key", "value", 0).Err()
if err != nil {
t.Errorf("Failed to set key: %v", err)
}
// Key should exist now
exists, err = testClient.Exists(ctx, "existing_key").Result()
if err != nil {
t.Errorf("Failed to check existence: %v", err)
}
if exists != 1 {
t.Errorf("Expected 1, got %d", exists)
}
}
func TestRedisPing(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Test PING
pong, err := testClient.Ping(ctx).Result()
if err != nil {
t.Errorf("Failed to ping: %v", err)
}
if pong != "PONG" {
t.Errorf("Expected 'PONG', got '%s'", pong)
}
}
func TestRedisMultipleKeys(t *testing.T) {
mr, err := miniredis.Run()
if err != nil {
t.Fatalf("Failed to start miniredis: %v", err)
}
defer mr.Close()
testClient := redis.NewClient(&redis.Options{
Addr: mr.Addr(),
})
defer testClient.Close()
ctx := context.Background()
// Set multiple keys
keys := map[string]string{
"key1": "value1",
"key2": "value2",
"key3": "value3",
}
for k, v := range keys {
err := testClient.Set(ctx, k, v, 0).Err()
if err != nil {
t.Errorf("Failed to set %s: %v", k, err)
}
}
// Get all keys
for k, expectedV := range keys {
val, err := testClient.Get(ctx, k).Result()
if err != nil {
t.Errorf("Failed to get %s: %v", k, err)
}
if val != expectedV {
t.Errorf("Expected '%s', got '%s' for key %s", expectedV, val, k)
}
}
}