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  }