Files
2026-06-08 15:03:41 -05:00

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)
}
}