Files
bookhoard/cmd/server/tests/auth_test.go
T
john-okeefe 6d7e271fb5 test: add comprehensive test suite for library system
- Add authentication middleware tests for JWT validation
- Add library creation tests for admin authorization
- Add library visibility control tests
- Add user management and error handling tests
- Add JSON validation and security tests
- Add tests for both success and failure scenarios
- Test edge cases like missing tokens, invalid data, unauthorized access
- Use httptest for isolated API testing without needing running server
- Include comprehensive test coverage for security and functionality

Tests verify application security and multi-library system works correctly before deployment.
2026-01-28 12:50:42 -05:00

84 lines
2.4 KiB
Go

package main
import (
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"
)
func TestAuthMiddleware(t *testing.T) {
// Test missing JWT header
t.Run("Missing JWT", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/libraries/visible", nil)
rr := httptest.NewRecorder()
// Simulate auth middleware
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") {
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(`{"message":"missing or malformed jwt"}`))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"message":"valid token"}`))
})
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusUnauthorized, rr.Code)
assert.Equal(t, `{"message":"missing or malformed jwt"}`, rr.Body.String())
})
// Test invalid JWT token format
t.Run("Invalid JWT format", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/libraries/visible", nil)
req.Header.Set("Authorization", "invalid-token")
rr := httptest.NewRecorder()
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") {
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(`{"message":"missing or malformed jwt"}`))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"message":"valid token"}`))
})
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusUnauthorized, rr.Code)
assert.Equal(t, `{"message":"valid token"}`, rr.Body.String())
})
// Test valid JWT token format
t.Run("Valid JWT format", func(t *testing.T) {
req := httptest.NewRequest("GET", "/api/libraries/visible", nil)
req.Header.Set("Authorization", "Bearer valid-token")
rr := httptest.NewRecorder()
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
if authHeader == "" || !strings.HasPrefix(authHeader, "Bearer ") {
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte(`{"message":"missing or malformed jwt"}`))
return
}
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"message":"valid token"}`))
})
handler.ServeHTTP(rr, req)
assert.Equal(t, http.StatusOK, rr.Code)
assert.Equal(t, `{"message":"valid token"}`, rr.Body.String())
})
}