mirror of
https://github.com/gin-gonic/gin.git
synced 2025-12-13 13:12:17 +08:00
113 lines
2.6 KiB
Go
113 lines
2.6 KiB
Go
package gin
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestLiteralColonWithRun(t *testing.T) {
|
|
SetMode(TestMode)
|
|
router := New()
|
|
|
|
router.GET(`/test\:action`, func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"path": "literal_colon"})
|
|
})
|
|
|
|
router.updateRouteTrees()
|
|
|
|
w := httptest.NewRecorder()
|
|
|
|
req, _ := http.NewRequest(http.MethodGet, "/test:action", nil)
|
|
router.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Contains(t, w.Body.String(), "literal_colon")
|
|
}
|
|
|
|
func TestLiteralColonWithDirectServeHTTP(t *testing.T) {
|
|
SetMode(TestMode)
|
|
router := New()
|
|
|
|
router.GET(`/test\:action`, func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"path": "literal_colon"})
|
|
})
|
|
|
|
w := httptest.NewRecorder()
|
|
req, _ := http.NewRequest(http.MethodGet, "/test:action", nil)
|
|
router.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Contains(t, w.Body.String(), "literal_colon")
|
|
}
|
|
|
|
func TestLiteralColonWithHandler(t *testing.T) {
|
|
|
|
SetMode(TestMode)
|
|
router := New()
|
|
|
|
router.GET(`/test\:action`, func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"path": "literal_colon"})
|
|
})
|
|
|
|
handler := router.Handler()
|
|
|
|
w := httptest.NewRecorder()
|
|
req, _ := http.NewRequest(http.MethodGet, "/test:action", nil)
|
|
handler.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Contains(t, w.Body.String(), "literal_colon")
|
|
}
|
|
|
|
func TestLiteralColonWithHTTPServer(t *testing.T) {
|
|
SetMode(TestMode)
|
|
router := New()
|
|
|
|
router.GET(`/test\:action`, func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"path": "literal_colon"})
|
|
})
|
|
|
|
router.GET("/test/:param", func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"param": c.Param("param")})
|
|
})
|
|
|
|
w := httptest.NewRecorder()
|
|
req, _ := http.NewRequest(http.MethodGet, "/test:action", nil)
|
|
router.ServeHTTP(w, req)
|
|
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
assert.Contains(t, w.Body.String(), "literal_colon")
|
|
|
|
w2 := httptest.NewRecorder()
|
|
req2, _ := http.NewRequest(http.MethodGet, "/test/foo", nil)
|
|
router.ServeHTTP(w2, req2)
|
|
|
|
assert.Equal(t, http.StatusOK, w2.Code)
|
|
assert.Contains(t, w2.Body.String(), "foo")
|
|
}
|
|
|
|
// Test that updateRouteTrees is called only once
|
|
func TestUpdateRouteTreesCalledOnce(t *testing.T) {
|
|
SetMode(TestMode)
|
|
router := New()
|
|
|
|
callCount := 0
|
|
originalUpdate := router.updateRouteTrees
|
|
|
|
router.GET(`/test\:action`, func(c *Context) {
|
|
c.JSON(http.StatusOK, H{"call": callCount})
|
|
})
|
|
|
|
for i := 0; i < 5; i++ {
|
|
w := httptest.NewRecorder()
|
|
req, _ := http.NewRequest(http.MethodGet, "/test:action", nil)
|
|
router.ServeHTTP(w, req)
|
|
assert.Equal(t, http.StatusOK, w.Code)
|
|
}
|
|
|
|
_ = originalUpdate
|
|
}
|