package session import ( "testing" "time" ) func TestManagerRoundTrip(t *testing.T) { m, err := NewManager([]byte("test-key"), time.Hour) if err != nil { t.Fatalf("NewManager() error = %v", err) } sess, cookie, err := m.New("Sam") if err != nil { t.Fatalf("New() error = %v", err) } if sess.User != "Sam" { t.Errorf("User = %q, want Sam", sess.User) } got, ok := m.Lookup(cookie) if !ok { t.Fatal("Lookup() = not ok, want a live session") } if got.ID != sess.ID { t.Errorf("Lookup ID = %q, want %q", got.ID, sess.ID) } m.Destroy(cookie) if _, ok := m.Lookup(cookie); ok { t.Error("Lookup() after Destroy() = ok, want expired") } } func TestManagerRejectsTamperedCookie(t *testing.T) { m, err := NewManager([]byte("key-a"), time.Hour) if err != nil { t.Fatalf("NewManager() error = %v", err) } _, cookie, err := m.New("Sam") if err != nil { t.Fatalf("New() error = %v", err) } other, err := NewManager([]byte("key-b"), time.Hour) if err != nil { t.Fatalf("NewManager() error = %v", err) } if _, ok := other.Lookup(cookie); ok { t.Error("Lookup() with a different key = ok, want rejected") } for _, bad := range []string{"", "garbage", "abc.", ".abc", "a.b.c", cookie + "x"} { if _, ok := m.Lookup(bad); ok { t.Errorf("Lookup(%q) = ok, want rejected", bad) } } } func TestStoreExpiry(t *testing.T) { st := NewStore(time.Minute) base := time.Now() st.now = func() time.Time { return base } sess, err := st.Create("Sam") if err != nil { t.Fatalf("Create() error = %v", err) } if _, ok := st.Get(sess.ID); !ok { t.Fatal("Get() = not ok before expiry") } st.now = func() time.Time { return base.Add(2 * time.Minute) } if _, ok := st.Get(sess.ID); ok { t.Error("Get() = ok after expiry, want expired") } }