@@ -10,6 +10,7 @@ import (
1010
1111 middlewareapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/middleware"
1212 sessionsapi "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
13+ "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/clock"
1314 . "github.com/onsi/ginkgo"
1415 . "github.com/onsi/ginkgo/extensions/table"
1516 . "github.com/onsi/gomega"
@@ -24,8 +25,9 @@ var _ = Describe("Stored Session Suite", func() {
2425 var ctx = context.Background()
2526
2627 Context("StoredSessionLoader", func() {
27− createdPast := time.Now().Add(-5 * time.Minute)
28− createdFuture := time.Now().Add(5 * time.Minute)
28+ now := time.Now()
29+ createdPast := now.Add(-5 * time.Minute)
30+ createdFuture := now.Add(5 * time.Minute)
2931
3032 var defaultRefreshFunc = func(_ context.Context, ss *sessionsapi.SessionState) (bool, error) {
3133 switch ss.RefreshToken {
@@ -85,6 +87,14 @@ var _ = Describe("Stored Session Suite", func() {
8587 },
8688 }
8789
90+ BeforeEach(func() {
91+ clock.Set(now)
92+ })
93+
94+ AfterEach(func() {
95+ clock.Reset()
96+ })
97+
8898 type storedSessionLoaderTableInput struct {
8999 requestHeaders http.Header
90100 existingSession *sessionsapi.SessionState
@@ -208,6 +218,21 @@ var _ = Describe("Stored Session Suite", func() {
208218 existingSession: nil,
209219 expectedSession: &sessionsapi.SessionState{
210220 RefreshToken: "Refreshed",
221+ CreatedAt: &now,
222+ ExpiresOn: &createdFuture,
223+ },
224+ store: defaultSessionStore,
225+ refreshPeriod: 1 * time.Minute,
226+ refreshSession: defaultRefreshFunc,
227+ validateSession: defaultValidateFunc,
228+ }),
229+ Entry("when the provider refresh fails but validation succeeds", storedSessionLoaderTableInput{
230+ requestHeaders: http.Header{
231+ "Cookie": []string{"_oauth2_proxy=RefreshError"},
232+ },
233+ existingSession: nil,
234+ expectedSession: &sessionsapi.SessionState{
235+ RefreshToken: "RefreshError",
211236 CreatedAt: &createdPast,
212237 ExpiresOn: &createdFuture,
213238 },
@@ -216,7 +241,7 @@ var _ = Describe("Stored Session Suite", func() {
216241 refreshSession: defaultRefreshFunc,
217242 validateSession: defaultValidateFunc,
218243 }),
219− Entry("when the provider refresh fails", storedSessionLoaderTableInput{
244+ Entry("when the provider refresh fails and validation fails", storedSessionLoaderTableInput{
220245 requestHeaders: http.Header{
221246 "Cookie": []string{"_oauth2_proxy=RefreshError"},
222247 },
@@ -225,7 +250,7 @@ var _ = Describe("Stored Session Suite", func() {
225250 store: defaultSessionStore,
226251 refreshPeriod: 1 * time.Minute,
227252 refreshSession: defaultRefreshFunc,
228− validateSession: defaultValidateFunc,
253+ validateSession: func(context.Context, *sessionsapi.SessionState) bool { return false },
229254 }),
230255 Entry("when the session is not refreshed and is no longer valid", storedSessionLoaderTableInput{
231256 requestHeaders: http.Header{
@@ -326,7 +351,7 @@ var _ = Describe("Stored Session Suite", func() {
326351 },
327352 expectedErr: nil,
328353 expectRefreshed: true,
329− expectValidated: false,
354+ expectValidated: true,
330355 }),
331356 Entry("when the session is not refreshed by the provider", refreshSessionIfNeededTableInput{
332357 refreshPeriod: 1 * time.Minute,
@@ -339,15 +364,15 @@ var _ = Describe("Stored Session Suite", func() {
339364 expectRefreshed: true,
340365 expectValidated: true,
341366 }),
342− Entry("when the provider refresh fails", refreshSessionIfNeededTableInput{
367+ Entry("when the provider refresh fails but validation succeeds", refreshSessionIfNeededTableInput{
343368 refreshPeriod: 1 * time.Minute,
344369 session: &sessionsapi.SessionState{
345370 RefreshToken: "RefreshError",
346371 CreatedAt: &createdPast,
347372 },
348− expectedErr: errors.New("error refreshing access token: error refreshing session"),
373+ expectedErr: nil,
349374 expectRefreshed: true,
350− expectValidated: false,
375+ expectValidated: true,
351376 }),
352377 Entry("when the session is not refreshed by the provider and validation fails", refreshSessionIfNeededTableInput{
353378 refreshPeriod: 1 * time.Minute,
@@ -366,10 +391,9 @@ var _ = Describe("Stored Session Suite", func() {
366391
367392 Context("refreshSession", func() {
368393 type refreshSessionWithProviderTableInput struct {
369− session *sessionsapi.SessionState
370− expectedErr error
371− expectRefreshed bool
372− expectSaved bool
394+ session *sessionsapi.SessionState
395+ expectedErr error
396+ expectSaved bool
373397 }
374398
375399 now := time.Now()
@@ -414,15 +438,15 @@ var _ = Describe("Stored Session Suite", func() {
414438 session: &sessionsapi.SessionState{
415439 RefreshToken: noRefresh,
416440 },
417− expectedErr: nil,
418− expectSaved: false,
441+ expectedErr: nil,
442+ expectSaved: false,
419443 }),
420444 Entry("when the provider refreshes the session", refreshSessionWithProviderTableInput{
421445 session: &sessionsapi.SessionState{
422446 RefreshToken: refresh,
423447 },
424− expectedErr: nil,
425− expectSaved: true,
448+ expectedErr: nil,
449+ expectSaved: true,
426450 }),
427451 Entry("when the provider returns an error", refreshSessionWithProviderTableInput{
428452 session: &sessionsapi.SessionState{
@@ -430,16 +454,16 @@ var _ = Describe("Stored Session Suite", func() {
430454 CreatedAt: &now,
431455 ExpiresOn: &now,
432456 },
433− expectedErr: errors.New("error refreshing access token: error refreshing session"),
434− expectSaved: false,
457+ expectedErr: errors.New("error refreshing tokens: error refreshing session"),
458+ expectSaved: false,
435459 }),
436460 Entry("when the saving the session returns an error", refreshSessionWithProviderTableInput{
437461 session: &sessionsapi.SessionState{
438462 RefreshToken: refresh,
439463 AccessToken: "NoSave",
440464 },
441− expectedErr: errors.New("error saving session: unable to save session"),
442− expectSaved: true,
465+ expectedErr: errors.New("error saving session: unable to save session"),
466+ expectSaved: true,
443467 }),
444468 )
445469 })