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  }