github.com/volatiletech/authboss@v2.4.1+incompatible/logout/logout_test.go (about) 1 package logout 2 3 import ( 4 "context" 5 "net/http" 6 "net/http/httptest" 7 "testing" 8 "time" 9 10 "github.com/volatiletech/authboss" 11 "github.com/volatiletech/authboss/mocks" 12 ) 13 14 func TestLogout(t *testing.T) { 15 t.Parallel() 16 17 ab := authboss.New() 18 19 router := &mocks.Router{} 20 errHandler := &mocks.ErrorHandler{} 21 ab.Config.Core.Router = router 22 ab.Config.Core.ErrorHandler = errHandler 23 24 l := &Logout{} 25 if err := l.Init(ab); err != nil { 26 t.Fatal(err) 27 } 28 29 if err := router.HasDeletes("/logout"); err != nil { 30 t.Error(err) 31 } 32 } 33 34 func TestLogoutRoutes(t *testing.T) { 35 t.Parallel() 36 37 ab := authboss.New() 38 router := &mocks.Router{} 39 errHandler := &mocks.ErrorHandler{} 40 ab.Config.Core.Router = router 41 ab.Config.Core.ErrorHandler = errHandler 42 43 l := &Logout{} 44 ab.Config.Modules.LogoutMethod = "what" 45 if err := l.Init(ab); err == nil { 46 t.Error("should have failed to register the route") 47 } 48 49 ab.Config.Modules.LogoutMethod = "GET" 50 if err := l.Init(ab); err != nil { 51 t.Error("should have failed to register the route") 52 } 53 if err := router.HasGets("/logout"); err != nil { 54 t.Error(err) 55 } 56 57 ab.Config.Modules.LogoutMethod = "POST" 58 if err := l.Init(ab); err != nil { 59 t.Error("should have failed to register the route") 60 } 61 if err := router.HasPosts("/logout"); err != nil { 62 t.Error(err) 63 } 64 } 65 66 type testHarness struct { 67 logout *Logout 68 ab *authboss.Authboss 69 70 redirector *mocks.Redirector 71 session *mocks.ClientStateRW 72 cookies *mocks.ClientStateRW 73 storer *mocks.ServerStorer 74 } 75 76 func testSetup() *testHarness { 77 harness := &testHarness{} 78 79 harness.ab = authboss.New() 80 harness.redirector = &mocks.Redirector{} 81 harness.session = mocks.NewClientRW() 82 harness.cookies = mocks.NewClientRW() 83 harness.storer = mocks.NewServerStorer() 84 85 harness.ab.Paths.LogoutOK = "/logout/ok" 86 87 harness.ab.Config.Core.Logger = mocks.Logger{} 88 harness.ab.Config.Core.Redirector = harness.redirector 89 harness.ab.Config.Storage.SessionState = harness.session 90 harness.ab.Config.Storage.CookieState = harness.cookies 91 harness.ab.Config.Storage.Server = harness.storer 92 93 harness.logout = &Logout{harness.ab} 94 95 return harness 96 } 97 98 func TestLogoutLogout(t *testing.T) { 99 t.Parallel() 100 101 h := testSetup() 102 103 h.session.ClientValues[authboss.SessionKey] = "test@test.com" 104 h.session.ClientValues[authboss.SessionHalfAuthKey] = "true" 105 h.session.ClientValues[authboss.SessionLastAction] = time.Now().UTC().Format(time.RFC3339) 106 h.cookies.ClientValues[authboss.CookieRemember] = "token" 107 108 r := mocks.Request("POST") 109 resp := httptest.NewRecorder() 110 w := h.ab.NewResponse(resp) 111 112 // This enables the logging portion 113 // which is debatable-y not useful in a log out method 114 user := &mocks.User{Email: "test@test.com"} 115 r = r.WithContext(context.WithValue(r.Context(), authboss.CTXKeyUser, user)) 116 117 var err error 118 r, err = h.ab.LoadClientState(w, r) 119 if err != nil { 120 t.Error(err) 121 } 122 123 if err := h.logout.Logout(w, r); err != nil { 124 t.Fatal(err) 125 } 126 127 if resp.Code != http.StatusTemporaryRedirect { 128 t.Error("response code wrong:", resp.Code) 129 } 130 if h.redirector.Options.RedirectPath != "/logout/ok" { 131 t.Error("redirect path was wrong:", h.redirector.Options.RedirectPath) 132 } 133 134 if _, ok := h.session.ClientValues[authboss.SessionKey]; ok { 135 t.Error("want session key gone") 136 } 137 if _, ok := h.session.ClientValues[authboss.SessionHalfAuthKey]; ok { 138 t.Error("want session half auth key gone") 139 } 140 if _, ok := h.session.ClientValues[authboss.SessionLastAction]; ok { 141 t.Error("want session last action") 142 } 143 if _, ok := h.cookies.ClientValues[authboss.CookieRemember]; ok { 144 t.Error("want remember me cookies gone") 145 } 146 }