diff --git a/.gitignore b/.gitignore index 47de6d1..976f308 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ _testmain.go *.db *.out +go.mod +go.sum \ No newline at end of file diff --git a/store/config_test.go b/store/config_test.go index 53c157f..3f168ae 100644 --- a/store/config_test.go +++ b/store/config_test.go @@ -9,13 +9,7 @@ import ( func TestConfig_setDefault(t *testing.T) { config := Config{} config.setDefault() - if config.SessionOptions.Path != shared.DefaultPath { - t.Errorf("config.SessionOptions.Path should be %s (actual: %s)", shared.DefaultPath, config.SessionOptions.Path) - } - if config.SessionOptions.MaxAge != shared.DefaultMaxAge { - t.Errorf("config.SessionOptions.MaxAge should be %s (actual: %s)", shared.DefaultMaxAge, config.SessionOptions.MaxAge) - } if string(config.DBOptions.BucketName) != shared.DefaultBucketName { - t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, config.DBOptions.BucketName) + t.Errorf("config.SessionOptions.BucketName should be %+v (actual: %+v)", shared.DefaultBucketName, string(config.DBOptions.BucketName)) } } diff --git a/store/store.go b/store/store.go index 088deff..54e351a 100644 --- a/store/store.go +++ b/store/store.go @@ -55,7 +55,7 @@ func (s *Store) Reload(ctx echo.Context, session *sessions.Session) error { // Save adds a single session to the response. func (s *Store) Save(ctx echo.Context, session *sessions.Session) error { if ctx.CookieOptions().MaxAge < 0 { - s.Remove(session.ID) + s.delete(session) sessions.SetCookie(ctx, session.Name(), "") } else { // Build an alphanumeric ID. @@ -112,6 +112,11 @@ func (s *Store) Remove(sessionID string) error { }) } +// delete removes the key-value from the database. +func (s *Store) delete(session *sessions.Session) error { + return s.Remove(session.ID) +} + // save stores the session data in the database. func (s *Store) save(ctx echo.Context, session *sessions.Session) error { var buf bytes.Buffer diff --git a/store/store_test.go b/store/store_test.go index 2978af9..fb06baf 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -10,11 +10,14 @@ import ( "time" "github.com/gogo/protobuf/proto" + "github.com/webx-top/echo" + "github.com/webx-top/echo/defaults" + "github.com/webx-top/echo/engine/mock" "github.com/admpub/boltstore/shared" + "github.com/admpub/securecookie" "github.com/admpub/sessions" "github.com/boltdb/bolt" - "github.com/gorilla/securecookie" ) var benchmarkDB = fmt.Sprintf("benchmark_store_%d.db", time.Now().Unix()) @@ -83,6 +86,8 @@ func TestStore_Get(t *testing.T) { if err != nil { t.Error(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) str, err := New( db, @@ -93,7 +98,7 @@ func TestStore_Get(t *testing.T) { t.Error(err) } - session, err := str.Get(req, "test") + session, err := str.Get(ctx, "test") if err != nil { t.Error(err) } @@ -123,14 +128,15 @@ func TestStore_New(t *testing.T) { if err != nil { t.Error(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) + ctx.SessionOptions().MaxAge = 1024 encoded, err := securecookie.EncodeMulti("test", "1", str.codecs...) - req.AddCookie(sessions.NewCookie("test", encoded, &sessions.Options{ - MaxAge: 1024, - })) + req.AddCookie(sessions.NewCookie(ctx, "test", encoded)) - session, err := str.New(req, "test") + session, err := str.New(ctx, "test") if err != nil { t.Error(err) } @@ -141,7 +147,7 @@ func TestStore_New(t *testing.T) { } func TestStore_Save(t *testing.T) { - // When session.Options.MaxAge < 0 + // When ctx.SessionOptions().MaxAge < 0 db, err := bolt.Open("./sessions.db", 0666, nil) if err != nil { t.Error(err) @@ -161,47 +167,48 @@ func TestStore_Save(t *testing.T) { if err != nil { t.Error(err) } - - session, err := str.Get(req, "test") - if err != nil { - t.Error(err) - } - - session.Options.MaxAge = -1 - w := httptest.NewRecorder() - if err := str.Save(req, w, session); err != nil { - t.Error(err) - } + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) - // When session.Options.MaxAge >= 0 - session, err = str.Get(req, "test") + session, err := str.Get(ctx, "test") if err != nil { t.Error(err) } - session.Options.MaxAge = 1 + ctx.SessionOptions().MaxAge = -1 + + if err := str.Save(ctx, session); err != nil { + t.Error(err) + } + + // When ctx.SessionOptions().MaxAge >= 0 + session, err = str.Get(ctx, "test") + if err != nil { + t.Error(err) + } + + ctx.SessionOptions().MaxAge = 1 w = httptest.NewRecorder() - if err := str.Save(req, w, session); err != nil { + if err := str.Save(ctx, session); err != nil { t.Error(err) } - // When session.Options.MaxAge >= 0 and + // When ctx.SessionOptions().MaxAge >= 0 and // s.save returns an error session.Values = make(map[interface{}]interface{}) session.Values[make(chan int)] = make(chan int) - if err := str.Save(req, w, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" { + if err := str.Save(ctx, session); err == nil || err.Error() != "gob: type not registered for interface: chan int" { t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "gob: type not registered for interface: chan int", err) } - // When session.Options.MaxAge >= 0 and + // When ctx.SessionOptions().MaxAge >= 0 and // securecookie.EncodeMulti returns an error session.Values = make(map[interface{}]interface{}) str.codecs = nil - if err := str.Save(req, w, session); err == nil || err.Error() != "securecookie: no codecs provided" { + if err := str.Save(ctx, session); err == nil || err.Error() != "securecookie: no codecs provided" { t.Errorf(`str.Save should return an error "%s" (actual: %+v)`, "securecookie: no codecs provided", err) } } @@ -227,14 +234,15 @@ func TestStore_load(t *testing.T) { t.Error(err) } - session, err := str.Get(req, "test") + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) + + session, err := str.Get(ctx, "test") if err != nil { t.Error(err) } - w := httptest.NewRecorder() - - if err := str.Save(req, w, session); err != nil { + if err := str.Save(ctx, session); err != nil { t.Error(err) } @@ -271,12 +279,12 @@ func TestStore_load(t *testing.T) { } // When the target session data is expired - session, err = str.Get(req, "test") + session, err = str.Get(ctx, "test") if err != nil { t.Error(err) } - session.Options.MaxAge = 0 - if err := str.Save(req, w, session); err != nil { + ctx.SessionOptions().MaxAge = 0 + if err := str.Save(ctx, session); err != nil { t.Error(err) } @@ -308,7 +316,10 @@ func TestSession_delete(t *testing.T) { t.Error(err) } - session, err := str.Get(req, "test") + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) + + session, err := str.Get(ctx, "test") if err != nil { t.Error(err) } @@ -318,7 +329,7 @@ func TestSession_delete(t *testing.T) { 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) + t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err) } } @@ -336,7 +347,7 @@ func TestNew(t *testing.T) { []byte("secret-key"), ) if err.Error() != "database not open" { - t.Error(`str.delete should return an error "%s" (actual: %s)`, "database not open", err) + t.Errorf(`str.delete should return an error "%s" (actual: %s)`, "database not open", err) } } @@ -352,9 +363,11 @@ func ExampleStore_Get() { if err != nil { panic(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default) // Get a session. - session, err := str.Get(r, "session-key") + session, err := str.Get(ctx, "session-key") if err != nil { panic(err) } @@ -375,9 +388,11 @@ func ExampleStore_New() { if err != nil { panic(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default) // Create a session. - session, err := str.New(r, "session-key") + session, err := str.New(ctx, "session-key") if err != nil { panic(err) } @@ -402,8 +417,10 @@ func ExampleStore_Save() { panic(err) } + ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default) + // Create a session. - session, err := str.New(r, "session-key") + session, err := str.New(ctx, "session-key") if err != nil { panic(err) } @@ -412,14 +429,14 @@ func ExampleStore_Save() { session.Values["foo"] = "bar" // Save the session. - if err := sessions.Save(r, w); err != nil { + if err := sessions.Save(ctx); err != nil { panic(err) } // You can delete the session by setting the session options's MaxAge // to a minus value. - session.Options.MaxAge = -1 - if err := sessions.Save(r, w); err != nil { + ctx.SessionOptions().MaxAge = -1 + if err := sessions.Save(ctx); err != nil { panic(err) } } @@ -436,9 +453,11 @@ func ExampleNew() { if err != nil { panic(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(r), mock.NewResponse(w), defaults.Default) // Get a session. - session, err := str.Get(r, "session-key") + session, err := str.Get(ctx, "session-key") if err != nil { panic(err) } @@ -488,9 +507,11 @@ func BenchmarkStore_Get(b *testing.B) { if err != nil { b.Error(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) for i := 0; i < b.N; i++ { - _, err := str.Get(req, "test") + _, err := str.Get(ctx, "test") if err != nil { b.Error(err) } @@ -518,9 +539,11 @@ func BenchmarkStore_New(b *testing.B) { if err != nil { b.Error(err) } + w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) for i := 0; i < b.N; i++ { - _, err := str.New(req, "test") + _, err := str.New(ctx, "test") if err != nil { b.Error(err) } @@ -550,8 +573,9 @@ func BenchmarkStore_Save(b *testing.B) { } w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) - session, err := str.Get(req, "test") + session, err := str.Get(ctx, "test") if err != nil { b.Error(err) } @@ -559,7 +583,7 @@ func BenchmarkStore_Save(b *testing.B) { session.Values["foo"] = "bar" for i := 0; i < b.N; i++ { - if err := str.Save(req, w, session); err != nil { + if err := str.Save(ctx, session); err != nil { b.Error(err) } } @@ -588,18 +612,19 @@ func BenchmarkStore_Save_delete(b *testing.B) { } w := httptest.NewRecorder() + ctx := echo.NewContext(mock.NewRequest(req), mock.NewResponse(w), defaults.Default) - session, err := str.Get(req, "test") + session, err := str.Get(ctx, "test") if err != nil { b.Error(err) } session.Values["foo"] = "bar" - session.Options.MaxAge = -1 + ctx.SessionOptions().MaxAge = -1 for i := 0; i < b.N; i++ { - if err := str.Save(req, w, session); err != nil { + if err := str.Save(ctx, session); err != nil { b.Error(err) } }