192 lines
5.0 KiB
Go
192 lines
5.0 KiB
Go
package examples_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/testcontainers/testcontainers-go"
|
|
tcredis "github.com/testcontainers/testcontainers-go/modules/redis"
|
|
)
|
|
|
|
// TestBasicRedis demonstrates basic Redis operations
|
|
func TestBasicRedis(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// Start Redis container
|
|
redisContainer, err := tcredis.Run(ctx, "redis:7-alpine")
|
|
testcontainers.CleanupContainer(t, redisContainer)
|
|
require.NoError(t, err)
|
|
|
|
// Get connection string
|
|
connStr, err := redisContainer.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
|
|
// Connect to Redis
|
|
opt, err := redis.ParseURL(connStr)
|
|
require.NoError(t, err)
|
|
|
|
client := redis.NewClient(opt)
|
|
defer client.Close()
|
|
|
|
// Test SET and GET
|
|
err = client.Set(ctx, "greeting", "Hello, Testcontainers!", 0).Err()
|
|
require.NoError(t, err)
|
|
|
|
val, err := client.Get(ctx, "greeting").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "Hello, Testcontainers!", val)
|
|
|
|
t.Log("Successfully performed SET and GET operations")
|
|
}
|
|
|
|
// TestRedisWithExpiration demonstrates key expiration
|
|
func TestRedisWithExpiration(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
redisContainer, err := tcredis.Run(ctx, "redis:7-alpine")
|
|
testcontainers.CleanupContainer(t, redisContainer)
|
|
require.NoError(t, err)
|
|
|
|
connStr, err := redisContainer.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
|
|
opt, err := redis.ParseURL(connStr)
|
|
require.NoError(t, err)
|
|
|
|
client := redis.NewClient(opt)
|
|
defer client.Close()
|
|
|
|
// Set a key with 2-second expiration
|
|
err = client.Set(ctx, "temporary", "I will expire", 2*time.Second).Err()
|
|
require.NoError(t, err)
|
|
|
|
// Verify key exists
|
|
val, err := client.Get(ctx, "temporary").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "I will expire", val)
|
|
|
|
t.Log("Key set with 2-second expiration")
|
|
|
|
// Wait for expiration
|
|
time.Sleep(3 * time.Second)
|
|
|
|
// Verify key is gone
|
|
_, err = client.Get(ctx, "temporary").Result()
|
|
require.Equal(t, redis.Nil, err, "Key should have expired")
|
|
|
|
t.Log("Key successfully expired")
|
|
}
|
|
|
|
// TestRedisListOperations demonstrates list operations
|
|
func TestRedisListOperations(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
redisContainer, err := tcredis.Run(ctx, "redis:7-alpine")
|
|
testcontainers.CleanupContainer(t, redisContainer)
|
|
require.NoError(t, err)
|
|
|
|
connStr, err := redisContainer.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
|
|
opt, err := redis.ParseURL(connStr)
|
|
require.NoError(t, err)
|
|
|
|
client := redis.NewClient(opt)
|
|
defer client.Close()
|
|
|
|
// Push items to list
|
|
err = client.RPush(ctx, "tasks", "task1", "task2", "task3").Err()
|
|
require.NoError(t, err)
|
|
|
|
// Get list length
|
|
length, err := client.LLen(ctx, "tasks").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, int64(3), length)
|
|
|
|
// Pop items from list
|
|
task, err := client.LPop(ctx, "tasks").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "task1", task)
|
|
|
|
// Get remaining items
|
|
tasks, err := client.LRange(ctx, "tasks", 0, -1).Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, []string{"task2", "task3"}, tasks)
|
|
|
|
t.Log("Successfully performed list operations")
|
|
}
|
|
|
|
// TestRedisHashOperations demonstrates hash operations
|
|
func TestRedisHashOperations(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
redisContainer, err := tcredis.Run(ctx, "redis:7-alpine")
|
|
testcontainers.CleanupContainer(t, redisContainer)
|
|
require.NoError(t, err)
|
|
|
|
connStr, err := redisContainer.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
|
|
opt, err := redis.ParseURL(connStr)
|
|
require.NoError(t, err)
|
|
|
|
client := redis.NewClient(opt)
|
|
defer client.Close()
|
|
|
|
// Set hash fields
|
|
err = client.HSet(ctx, "user:1000", map[string]interface{}{
|
|
"name": "John Doe",
|
|
"email": "john@example.com",
|
|
"age": "30",
|
|
}).Err()
|
|
require.NoError(t, err)
|
|
|
|
// Get single field
|
|
name, err := client.HGet(ctx, "user:1000", "name").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "John Doe", name)
|
|
|
|
// Get all fields
|
|
user, err := client.HGetAll(ctx, "user:1000").Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "John Doe", user["name"])
|
|
require.Equal(t, "john@example.com", user["email"])
|
|
require.Equal(t, "30", user["age"])
|
|
|
|
t.Log("Successfully performed hash operations")
|
|
}
|
|
|
|
// TestRedisWithConfig demonstrates using Redis with custom configuration
|
|
func TestRedisWithConfig(t *testing.T) {
|
|
ctx := context.Background()
|
|
|
|
// Start Redis with snapshotting and verbose logging
|
|
redisContainer, err := tcredis.Run(
|
|
ctx,
|
|
"redis:7-alpine",
|
|
tcredis.WithSnapshotting(10, 1), // Save after 1 key changes within 10 seconds
|
|
tcredis.WithLogLevel(tcredis.LogLevelVerbose),
|
|
)
|
|
testcontainers.CleanupContainer(t, redisContainer)
|
|
require.NoError(t, err)
|
|
|
|
connStr, err := redisContainer.ConnectionString(ctx)
|
|
require.NoError(t, err)
|
|
|
|
opt, err := redis.ParseURL(connStr)
|
|
require.NoError(t, err)
|
|
|
|
client := redis.NewClient(opt)
|
|
defer client.Close()
|
|
|
|
// Verify Redis is running
|
|
pong, err := client.Ping(ctx).Result()
|
|
require.NoError(t, err)
|
|
require.Equal(t, "PONG", pong)
|
|
|
|
t.Log("Redis running with custom configuration")
|
|
}
|