220 lines
4.9 KiB
Go
220 lines
4.9 KiB
Go
package sessions
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type storeFactory func(*testing.T) Store
|
|
|
|
const sessionName = "mysession"
|
|
|
|
const ok = "ok"
|
|
|
|
func sessionGetSet(t *testing.T, newStore storeFactory) {
|
|
r := gin.Default()
|
|
r.Use(Sessions(sessionName, newStore(t)))
|
|
|
|
r.GET("/set", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.Set("key", ok)
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/get", func(c *gin.Context) {
|
|
session := Default(c)
|
|
if session.Get("key") != ok {
|
|
t.Error("Session writing failed")
|
|
}
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
res1 := httptest.NewRecorder()
|
|
req1, _ := http.NewRequest("GET", "/set", nil)
|
|
r.ServeHTTP(res1, req1)
|
|
|
|
res2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest("GET", "/get", nil)
|
|
req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res2, req2)
|
|
}
|
|
|
|
func sessionDeleteKey(t *testing.T, newStore storeFactory) {
|
|
r := gin.Default()
|
|
r.Use(Sessions(sessionName, newStore(t)))
|
|
|
|
r.GET("/set", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.Set("key", ok)
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/delete", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.Delete("key")
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/get", func(c *gin.Context) {
|
|
session := Default(c)
|
|
if session.Get("key") != nil {
|
|
t.Error("Session deleting failed")
|
|
}
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
res1 := httptest.NewRecorder()
|
|
req1, _ := http.NewRequest("GET", "/set", nil)
|
|
r.ServeHTTP(res1, req1)
|
|
|
|
res2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest("GET", "/delete", nil)
|
|
req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res2, req2)
|
|
|
|
res3 := httptest.NewRecorder()
|
|
req3, _ := http.NewRequest("GET", "/get", nil)
|
|
req3.Header.Set("Cookie", res2.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res3, req3)
|
|
}
|
|
|
|
func sessionFlashes(t *testing.T, newStore storeFactory) {
|
|
r := gin.Default()
|
|
store := newStore(t)
|
|
store.Options(Options{
|
|
Domain: "localhost",
|
|
})
|
|
r.Use(Sessions(sessionName, store))
|
|
|
|
r.GET("/set", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.AddFlash(ok)
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/flash", func(c *gin.Context) {
|
|
session := Default(c)
|
|
l := len(session.Flashes())
|
|
if l != 1 {
|
|
t.Error("Flashes count does not equal 1. Equals ", l)
|
|
}
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/check", func(c *gin.Context) {
|
|
session := Default(c)
|
|
l := len(session.Flashes())
|
|
if l != 0 {
|
|
t.Error("flashes count is not 0 after reading. Equals ", l)
|
|
}
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
res1 := httptest.NewRecorder()
|
|
req1, _ := http.NewRequest("GET", "/set", nil)
|
|
r.ServeHTTP(res1, req1)
|
|
|
|
res2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest("GET", "/flash", nil)
|
|
req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res2, req2)
|
|
|
|
res3 := httptest.NewRecorder()
|
|
req3, _ := http.NewRequest("GET", "/check", nil)
|
|
req3.Header.Set("Cookie", res2.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res3, req3)
|
|
}
|
|
|
|
func sessionClear(t *testing.T, newStore storeFactory) {
|
|
data := map[string]string{
|
|
"key": "val",
|
|
"foo": "bar",
|
|
}
|
|
r := gin.Default()
|
|
store := newStore(t)
|
|
r.Use(Sessions(sessionName, store))
|
|
|
|
r.GET("/set", func(c *gin.Context) {
|
|
session := Default(c)
|
|
for k, v := range data {
|
|
session.Set(k, v)
|
|
}
|
|
session.Clear()
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
r.GET("/check", func(c *gin.Context) {
|
|
session := Default(c)
|
|
for k, v := range data {
|
|
if session.Get(k) == v {
|
|
t.Fatal("Session clear failed")
|
|
}
|
|
}
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
|
|
res1 := httptest.NewRecorder()
|
|
req1, _ := http.NewRequest("GET", "/set", nil)
|
|
r.ServeHTTP(res1, req1)
|
|
|
|
res2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest("GET", "/check", nil)
|
|
req2.Header.Set("Cookie", res1.Header().Get("Set-Cookie"))
|
|
r.ServeHTTP(res2, req2)
|
|
}
|
|
|
|
func sessionOptions(t *testing.T, newStore storeFactory) {
|
|
r := gin.Default()
|
|
store := newStore(t)
|
|
store.Options(Options{
|
|
Domain: "localhost",
|
|
})
|
|
r.Use(Sessions(sessionName, store))
|
|
|
|
r.GET("/domain", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.Set("key", ok)
|
|
session.Options(Options{
|
|
Path: "/foo/bar/bat",
|
|
})
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
r.GET("/path", func(c *gin.Context) {
|
|
session := Default(c)
|
|
session.Set("key", ok)
|
|
session.Save()
|
|
c.String(200, ok)
|
|
})
|
|
res1 := httptest.NewRecorder()
|
|
req1, _ := http.NewRequest("GET", "/domain", nil)
|
|
r.ServeHTTP(res1, req1)
|
|
|
|
res2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest("GET", "/path", nil)
|
|
r.ServeHTTP(res2, req2)
|
|
|
|
s := strings.Split(res1.Header().Get("Set-Cookie"), ";")
|
|
if s[1] != " Path=/foo/bar/bat" {
|
|
t.Error("Error writing path with options:", s[1])
|
|
}
|
|
|
|
s = strings.Split(res2.Header().Get("Set-Cookie"), ";")
|
|
if s[1] != " Domain=localhost" {
|
|
t.Error("Error writing domain with options:", s[1])
|
|
}
|
|
}
|