github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/ginx/anyfn/anyfn_test.go (about) 1 package anyfn_test 2 3 import ( 4 "fmt" 5 "net/http" 6 "testing" 7 8 "github.com/bingoohuang/gg/pkg/ginx/adapt" 9 "github.com/bingoohuang/gg/pkg/ginx/anyfn" 10 "github.com/bingoohuang/gg/pkg/ginx/gintest" 11 "github.com/gin-gonic/gin" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func init() { 16 gin.SetMode(gin.TestMode) 17 } 18 19 func TestAnyFn(t *testing.T) { 20 r := adapt.Adapt(gin.New()) 21 r.RegisterAdapter(func(f func(string) string) gin.HandlerFunc { 22 return func(c *gin.Context) { 23 c.String(http.StatusOK, f(StringArg(c))) 24 } 25 }) 26 af := anyfn.NewAdapter() 27 r.RegisterAdapter(af) 28 29 // This handler will match /user/john but will not match /user/ or /user 30 r.GET("/user/:name", func(name string) string { return fmt.Sprintf("Hello %s", name) }) 31 32 type MyObject struct { 33 Name string 34 } 35 36 r.POST("/MyObject1", af.F(func(m MyObject) string { return "Object: " + m.Name })) 37 r.POST("/MyObject2", af.F(func(m *MyObject) string { return "Object: " + m.Name })) 38 39 // r.Run(":8080") 40 41 rr := gintest.Get("/user/bingoohuang", r) 42 assert.Equal(t, "Hello bingoohuang", rr.Body()) 43 44 rr = gintest.Post("/MyObject1", r, gintest.JSONVar(MyObject{Name: "bingoo"})) 45 assert.Equal(t, "Object: bingoo", rr.Body()) 46 rr = gintest.Post("/MyObject2", r, gintest.JSONVar(MyObject{Name: "bingoo2"})) 47 assert.Equal(t, "Object: bingoo2", rr.Body()) 48 } 49 50 func TestAnyFnHttpRequest(t *testing.T) { 51 af := anyfn.NewAdapter() 52 53 r := adapt.Adapt(gin.New(), af) 54 55 r.POST("/http", af.F(func(w http.ResponseWriter, r *http.Request) string { 56 return "Object: " + r.URL.String() 57 })) 58 59 rr := gintest.Post("/http", r) 60 assert.Equal(t, "Object: /http", rr.Body()) 61 } 62 63 func TestAnyFnAround(t *testing.T) { 64 af := anyfn.NewAdapter() 65 r := adapt.Adapt(gin.New(), af) 66 67 beforeTag := "" 68 afterTag := "" 69 70 r.POST("/http", af.F(func(w http.ResponseWriter, r *http.Request) string { 71 return beforeTag + r.URL.String() 72 }, af.Before(anyfn.BeforeFn(func(args []interface{}) error { 73 _ = args[0].(http.ResponseWriter) 74 _ = args[1].(*http.Request) 75 76 beforeTag = "BeforeFn: " 77 return nil 78 })), af.After(anyfn.AfterFn(func(args []interface{}, results []interface{}) error { 79 _ = args[0].(http.ResponseWriter) 80 _ = args[1].(*http.Request) 81 82 afterTag = results[0].(string) 83 return nil 84 })))) 85 86 rr := gintest.Post("/http", r) 87 assert.Equal(t, "BeforeFn: /http", rr.Body()) 88 assert.Equal(t, "BeforeFn: /http", afterTag) 89 } 90 91 func StringArg(c *gin.Context) string { 92 if len(c.Params) == 1 { 93 return c.Params[0].Value 94 } 95 96 if q := c.Request.URL.Query(); len(q) == 1 { 97 for _, v := range q { 98 return v[0] 99 } 100 } 101 102 return "" 103 }