| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package routes
- import (
- "net/http"
- "net/http/httptest"
- "strings"
- "testing"
- "time"
- "github.com/Wei-Shaw/sub2api/internal/handler"
- servermiddleware "github.com/Wei-Shaw/sub2api/internal/server/middleware"
- "github.com/gin-gonic/gin"
- "github.com/redis/go-redis/v9"
- "github.com/stretchr/testify/require"
- )
- func newAuthRoutesTestRouter(redisClient *redis.Client) *gin.Engine {
- gin.SetMode(gin.TestMode)
- router := gin.New()
- v1 := router.Group("/api/v1")
- RegisterAuthRoutes(
- v1,
- &handler.Handlers{
- Auth: &handler.AuthHandler{},
- Setting: &handler.SettingHandler{},
- },
- servermiddleware.JWTAuthMiddleware(func(c *gin.Context) {
- c.Next()
- }),
- servermiddleware.AuditLogMiddleware(func(c *gin.Context) {
- c.Next()
- }),
- redisClient,
- nil,
- nil,
- )
- return router
- }
- func TestAuthRoutesRateLimitFailCloseWhenRedisUnavailable(t *testing.T) {
- rdb := redis.NewClient(&redis.Options{
- Addr: "127.0.0.1:1",
- DialTimeout: 50 * time.Millisecond,
- ReadTimeout: 50 * time.Millisecond,
- WriteTimeout: 50 * time.Millisecond,
- })
- t.Cleanup(func() {
- _ = rdb.Close()
- })
- router := newAuthRoutesTestRouter(rdb)
- paths := []string{
- "/api/v1/auth/register",
- "/api/v1/auth/login",
- "/api/v1/auth/login/2fa",
- "/api/v1/auth/send-verify-code",
- "/api/v1/auth/oauth/pending/send-verify-code",
- }
- for _, path := range paths {
- req := httptest.NewRequest(http.MethodPost, path, strings.NewReader(`{}`))
- req.Header.Set("Content-Type", "application/json")
- req.RemoteAddr = "203.0.113.10:12345"
- w := httptest.NewRecorder()
- router.ServeHTTP(w, req)
- require.Equal(t, http.StatusTooManyRequests, w.Code, "path=%s", path)
- require.Contains(t, w.Body.String(), "rate limit exceeded", "path=%s", path)
- }
- }
|