beego/session/redis/session_redis_test.go
2024-08-04 16:55:20 +08:00

149 lines
3.2 KiB
Go

package redis
import (
"fmt"
"net/http"
"net/http/httptest"
"os"
"sync"
"testing"
"github.com/stretchr/testify/assert"
"github.com/beego/beego/session"
)
func TestRedis(t *testing.T) {
globalSession, err := setupSessionManager(t)
if err != nil {
t.Fatal(err)
}
go globalSession.GC()
r, _ := http.NewRequest("GET", "/", nil)
w := httptest.NewRecorder()
sess, err := globalSession.SessionStart(w, r)
if err != nil {
t.Fatal("session start failed:", err)
}
defer sess.SessionRelease(w)
// SET AND GET
err = sess.Set("username", "astaxie")
if err != nil {
t.Fatal("set username failed:", err)
}
username := sess.Get("username")
if username != "astaxie" {
t.Fatal("get username failed")
}
// DELETE
err = sess.Delete("username")
if err != nil {
t.Fatal("delete username failed:", err)
}
username = sess.Get("username")
if username != nil {
t.Fatal("delete username failed")
}
// FLUSH
err = sess.Set("username", "astaxie")
if err != nil {
t.Fatal("set failed:", err)
}
err = sess.Set("password", "1qaz2wsx")
if err != nil {
t.Fatal("set failed:", err)
}
username = sess.Get("username")
if username != "astaxie" {
t.Fatal("get username failed")
}
password := sess.Get("password")
if password != "1qaz2wsx" {
t.Fatal("get password failed")
}
err = sess.Flush()
if err != nil {
t.Fatal("flush failed:", err)
}
username = sess.Get("username")
if username != nil {
t.Fatal("flush failed")
}
password = sess.Get("password")
if password != nil {
t.Fatal("flush failed")
}
sess.SessionRelease(w)
}
func TestProvider_SessionInit(t *testing.T) {
savePath := `
{ "save_path": "my save path", "idle_timeout": "3s"}
`
cp := &Provider{}
cp.SessionInit(12, savePath)
assert.Equal(t, int64(12), cp.maxlifetime)
}
func TestStoreSessionReleaseIfPresentAndSessionDestroy(t *testing.T) {
globalSessions, err := setupSessionManager(t)
if err != nil {
t.Fatal(err)
}
// todo test if e==nil
go globalSessions.GC()
r, _ := http.NewRequest("GET", "/", nil)
w := httptest.NewRecorder()
sess, err := globalSessions.SessionStart(w, r)
if err != nil {
t.Fatal("session start failed:", err)
}
if err := globalSessions.GetProvider().SessionDestroy(sess.SessionID()); err != nil {
t.Error(err)
return
}
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
sess.SessionReleaseIfPresent(httptest.NewRecorder())
}()
wg.Wait()
if globalSessions.GetProvider().SessionExist(sess.SessionID()) {
t.Fatalf("session %s should exist", sess.SessionID())
}
}
func setupSessionManager(t *testing.T) (*session.Manager, error) {
redisAddr := os.Getenv("REDIS_ADDR")
if redisAddr == "" {
redisAddr = "127.0.0.1:6379"
}
redisConfig := fmt.Sprintf("%s,100,,0,30", redisAddr)
sessionConfig := &session.ManagerConfig{}
sessionConfig.CookieName = "gosessionid"
sessionConfig.EnableSetCookie = true
sessionConfig.Gclifetime = 3600
sessionConfig.Maxlifetime = 3600
sessionConfig.Secure = false
sessionConfig.CookieLifeTime = 3600
sessionConfig.ProviderConfig = redisConfig
globalSessions, err := session.NewManager("redis", sessionConfig)
if err != nil {
t.Log("could not create manager: ", err)
return nil, err
}
return globalSessions, nil
}