Update store/store_test.go
This commit is contained in:
parent
20aa2a34a8
commit
ffe81b84ea
3 changed files with 230 additions and 1 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -23,3 +23,4 @@ _testmain.go
|
|||
*.test
|
||||
|
||||
*.db
|
||||
*.out
|
||||
|
|
|
@ -120,7 +120,7 @@ func (s *Store) save(session *sessions.Session) error {
|
|||
}
|
||||
data, err := proto.Marshal(shared.NewSession(buf.Bytes(), session.Options.MaxAge))
|
||||
if err != nil {
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
err = s.db.Update(func(tx *bolt.Tx) error {
|
||||
return tx.Bucket(s.config.DBOptions.BucketName).Put([]byte(session.ID), data)
|
||||
|
|
|
@ -2,9 +2,13 @@ package store
|
|||
|
||||
import (
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/boltdb/bolt"
|
||||
"github.com/gorilla/securecookie"
|
||||
"github.com/gorilla/sessions"
|
||||
)
|
||||
|
||||
func TestStore_Get(t *testing.T) {
|
||||
|
@ -37,3 +41,227 @@ func TestStore_Get(t *testing.T) {
|
|||
t.Errorf("session.IsNew should be true (actual: %+v)", session.IsNew)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStore_New(t *testing.T) {
|
||||
db, err := bolt.Open("./sessions.db", 0666)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
str, err := New(
|
||||
db,
|
||||
Config{},
|
||||
[]byte("secret-key"),
|
||||
)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", "http://localhost:3000/", nil)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
encoded, err := securecookie.EncodeMulti("test", "1", str.codecs...)
|
||||
|
||||
req.AddCookie(sessions.NewCookie("test", encoded, &sessions.Options{
|
||||
MaxAge: 1024,
|
||||
}))
|
||||
|
||||
session, err := str.New(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
if session.IsNew != true {
|
||||
t.Errorf("session.IsNew should be true (actual: %+v)", session.IsNew)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStore_Save(t *testing.T) {
|
||||
// When session.Options.MaxAge < 0
|
||||
db, err := bolt.Open("./sessions.db", 0666)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
str, err := New(
|
||||
db,
|
||||
Config{},
|
||||
[]byte("secret-key"),
|
||||
)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", "http://localhost:3000/", nil)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
session, err := str.Get(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
session.Options.MaxAge = -1
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
|
||||
str.Save(req, w, session)
|
||||
|
||||
// When session.Options.MaxAge >= 0
|
||||
session, err = str.Get(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
session.Options.MaxAge = 1
|
||||
|
||||
w = httptest.NewRecorder()
|
||||
|
||||
str.Save(req, w, session)
|
||||
|
||||
// When session.Options.MaxAge >= 0 and
|
||||
// s.save returns an error
|
||||
session.Values = make(map[interface{}]interface{})
|
||||
session.Values[make(chan int)] = make(chan int)
|
||||
str.Save(req, w, session)
|
||||
|
||||
// When session.Options.MaxAge >= 0 and
|
||||
// securecookie.EncodeMulti returns an error
|
||||
session.Values = make(map[interface{}]interface{})
|
||||
str.codecs = nil
|
||||
str.Save(req, w, session)
|
||||
}
|
||||
|
||||
func TestStore_load(t *testing.T) {
|
||||
db, err := bolt.Open("./sessions.db", 0666)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
str, err := New(
|
||||
db,
|
||||
Config{},
|
||||
[]byte("secret-key"),
|
||||
)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", "http://localhost:3000/", nil)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
session, err := str.Get(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
w := httptest.NewRecorder()
|
||||
|
||||
str.Save(req, w, session)
|
||||
|
||||
exists, err := str.load(session)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
if exists != true {
|
||||
t.Error("Store.load should return true (actual: false)")
|
||||
}
|
||||
|
||||
// When the target session data is nil
|
||||
session.ID = "x"
|
||||
exists, err = str.load(session)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
if exists != false {
|
||||
t.Error("Store.load should return false (actual: true)")
|
||||
}
|
||||
|
||||
// When shared.Session returns an error
|
||||
err = db.Update(func(tx *bolt.Tx) error {
|
||||
return tx.Bucket(str.config.DBOptions.BucketName).Put([]byte("x"), []byte("test"))
|
||||
})
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
_, err = str.load(session)
|
||||
if err == nil || err.Error() != "proto: field/encoding mismatch: wrong type for field" {
|
||||
t.Error(`str.load should return an error "%s" (actual: %s)`, "proto: field/encoding mismatch: wrong type for field", err)
|
||||
}
|
||||
|
||||
// When the target session data is expired
|
||||
session, err = str.Get(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
session.Options.MaxAge = 0
|
||||
str.Save(req, w, session)
|
||||
time.Sleep(time.Second)
|
||||
_, err = str.load(session)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func TestSession_delete(t *testing.T) {
|
||||
db, err := bolt.Open("./sessions.db", 0666)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
str, err := New(
|
||||
db,
|
||||
Config{},
|
||||
[]byte("secret-key"),
|
||||
)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("GET", "http://localhost:3000/", nil)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
session, err := str.Get(req, "test")
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
|
||||
db.Close()
|
||||
|
||||
err = str.delete(session)
|
||||
|
||||
if err.Error() != "database not open" {
|
||||
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
// When db.Update returns an error
|
||||
db, err := bolt.Open("./sessions.db", 0666)
|
||||
if err != nil {
|
||||
t.Error(err.Error())
|
||||
}
|
||||
db.Close()
|
||||
|
||||
_, err = New(
|
||||
db,
|
||||
Config{},
|
||||
[]byte("secret-key"),
|
||||
)
|
||||
if err.Error() != "database not open" {
|
||||
t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue