auth_test.go
2038 bytes
1package auth
2
3import (
4 "net/http"
5 "net/http/httptest"
6 "testing"
7
8 "github.com/gin-gonic/gin"
9 "github.com/stretchr/testify/suite"
10
11 "github.com/TheEdgeOfRage/ytrssil-api/config"
12)
13
14type AuthTestSuite struct {
15 suite.Suite
16
17 cfg config.Config
18 server *http.Server
19 engine *gin.Engine
20}
21
22func TestAuthTestSuite(t *testing.T) {
23 suite.Run(t, new(AuthTestSuite))
24}
25
26func (s *AuthTestSuite) SetupSuite() {
27 s.cfg = config.TestConfig()
28
29 gin.SetMode(gin.TestMode)
30 s.engine = gin.New()
31 s.engine.Use(
32 gin.Recovery(),
33 APIAuthMiddleware(s.cfg.AuthToken),
34 )
35 s.engine.GET("/", func(c *gin.Context) {
36 c.String(http.StatusOK, "OK")
37 })
38
39 s.server = &http.Server{Handler: s.engine}
40}
41
42func (s *AuthTestSuite) TestSuccessfulAuthentication() {
43 w := httptest.NewRecorder()
44 req, _ := http.NewRequest("GET", "/", nil)
45 req.Header["Authorization"] = []string{"foo"}
46 s.server.Handler.ServeHTTP(w, req)
47
48 s.Equal(http.StatusOK, w.Code)
49 s.Equal("OK", w.Body.String())
50}
51
52func (s *AuthTestSuite) TestMissingAuthorizationHeader() {
53 w := httptest.NewRecorder()
54 req, _ := http.NewRequest("GET", "/", nil)
55 s.server.Handler.ServeHTTP(w, req)
56
57 s.Equal(http.StatusUnauthorized, w.Code)
58 s.Equal(`{"error":"missing Authorization header"}`, w.Body.String())
59}
60
61func (s *AuthTestSuite) TestWrongCredentials() {
62 w := httptest.NewRecorder()
63 req, _ := http.NewRequest("GET", "/", nil)
64 req.Header["Authorization"] = []string{"bar"}
65 s.server.Handler.ServeHTTP(w, req)
66
67 s.Equal(http.StatusUnauthorized, w.Code)
68 s.Equal(`{"error":"invalid auth token"}`, w.Body.String())
69}
70
71func (s *AuthTestSuite) TestPageAuthenticationStopsHandler() {
72 engine := gin.New()
73 handlerCalled := false
74 engine.Use(PageAuthMiddleware(s.cfg.AuthToken))
75 engine.POST("/", func(c *gin.Context) {
76 handlerCalled = true
77 c.Status(http.StatusNoContent)
78 })
79
80 w := httptest.NewRecorder()
81 req, _ := http.NewRequest(http.MethodPost, "/", nil)
82 engine.ServeHTTP(w, req)
83
84 s.Equal(http.StatusFound, w.Code)
85 s.Equal("/auth", w.Header().Get("Location"))
86 s.False(handlerCalled)
87}