59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package app
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/DATA-DOG/go-sqlmock"
|
|
)
|
|
|
|
func TestHandleLogoutAndMe(t *testing.T) {
|
|
s, mock, cleanup := newMockServer(t)
|
|
defer cleanup()
|
|
user := User{ID: 1, Email: "alice@example.com", Username: "alice", IsAdmin: true}
|
|
token := "tok"
|
|
|
|
rr := httptest.NewRecorder()
|
|
s.handleLogout(rr, httptest.NewRequest(http.MethodPost, "/api/logout", nil))
|
|
if rr.Code != http.StatusUnauthorized {
|
|
t.Fatalf("logout without token status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
|
|
mock.ExpectExec("UPDATE auth_tokens SET revoked_at").WithArgs(hashToken(token)).WillReturnResult(sqlmock.NewResult(0, 1))
|
|
rr = httptest.NewRecorder()
|
|
req := httptest.NewRequest(http.MethodPost, "/api/logout", nil)
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
s.handleLogout(rr, req)
|
|
if rr.Code != http.StatusOK || !strings.Contains(rr.Body.String(), "ok") {
|
|
t.Fatalf("logout status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
|
|
expectBearerUser(mock, token, user)
|
|
rr = httptest.NewRecorder()
|
|
req = httptest.NewRequest(http.MethodGet, "/api/me", nil)
|
|
req.Header.Set("Authorization", "Bearer "+token)
|
|
s.handleMe(rr, req)
|
|
if rr.Code != http.StatusOK {
|
|
t.Fatalf("me status=%d body=%s", rr.Code, rr.Body.String())
|
|
}
|
|
var got User
|
|
if err := json.Unmarshal(rr.Body.Bytes(), &got); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if got != user {
|
|
t.Fatalf("me got %#v", got)
|
|
}
|
|
|
|
rr = httptest.NewRecorder()
|
|
s.handleMe(rr, httptest.NewRequest(http.MethodGet, "/api/me", nil))
|
|
if rr.Code != http.StatusUnauthorized {
|
|
t.Fatalf("me without token status=%d", rr.Code)
|
|
}
|
|
if err := mock.ExpectationsWereMet(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|