128 lines
2.4 KiB
Go
128 lines
2.4 KiB
Go
package neo
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/stretchr/testify/assert"
|
|
httpTest "github.com/yaoapp/gou/http"
|
|
"github.com/yaoapp/yao/config"
|
|
"github.com/yaoapp/yao/helper"
|
|
"github.com/yaoapp/yao/test"
|
|
_ "github.com/yaoapp/yao/utils"
|
|
)
|
|
|
|
func TestAPI(t *testing.T) {
|
|
test.Prepare(t, config.Conf)
|
|
defer test.Clean()
|
|
|
|
// test router
|
|
router := testRouter(t)
|
|
err := Neo.API(router, "/neo/chat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// test server
|
|
host, shutdown := testServer(t, router)
|
|
defer shutdown()
|
|
|
|
// test request
|
|
url := fmt.Sprintf("%s/neo/chat?content=hello&token=%s", host, testToken(t))
|
|
res := []byte{}
|
|
req := httpTest.New(url).
|
|
WithHeader(http.Header{"Content-Type": []string{"application/json"}})
|
|
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
|
|
// send request
|
|
req.Stream(ctx, "GET", nil, func(data []byte) int {
|
|
res = append(res, data...)
|
|
return 1
|
|
})
|
|
|
|
assert.Contains(t, string(res), "[DONE]")
|
|
}
|
|
|
|
func TestAPIAuth(t *testing.T) {
|
|
test.Prepare(t, config.Conf)
|
|
defer test.Clean()
|
|
|
|
router := testRouter(t)
|
|
err := Neo.API(router, "/neo/chat")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
response := httptest.NewRecorder()
|
|
req, _ := http.NewRequest("GET", "/neo/chat?content=hello", nil)
|
|
assert.Panics(t, func() {
|
|
router.ServeHTTP(response, req)
|
|
})
|
|
}
|
|
|
|
func testServer(t *testing.T, router *gin.Engine) (string, func()) {
|
|
|
|
// Listen
|
|
l, err := net.Listen("tcp4", ":0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
srv := &http.Server{Addr: ":0", Handler: router}
|
|
|
|
// start serve
|
|
go func() {
|
|
if err := srv.Serve(l); err != nil && err != http.ErrServerClosed {
|
|
fmt.Println("[TestServer] Error:", err)
|
|
return
|
|
}
|
|
}()
|
|
|
|
addr := strings.Split(l.Addr().String(), ":")
|
|
if len(addr) != 2 {
|
|
t.Fatal("invalid address")
|
|
}
|
|
|
|
host := fmt.Sprintf("http://127.0.0.1:%s", addr[1])
|
|
time.Sleep(50 * time.Millisecond)
|
|
|
|
shutdown := func() {
|
|
srv.Close()
|
|
l.Close()
|
|
}
|
|
return host, shutdown
|
|
}
|
|
|
|
func testRouter(t *testing.T) *gin.Engine {
|
|
|
|
err := Load(config.Conf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
router := gin.New()
|
|
gin.SetMode(gin.ReleaseMode)
|
|
return router
|
|
}
|
|
|
|
func testToken(t *testing.T) string {
|
|
token := helper.JwtMake(1,
|
|
map[string]interface{}{
|
|
"id": 1,
|
|
"name": "Test",
|
|
},
|
|
map[string]interface{}{
|
|
"exp": 3600,
|
|
"sid": "123456",
|
|
})
|
|
return token.Token
|
|
}
|