sponge/pkg/sse/server_test.go

133 lines
3.0 KiB
Go

package sse
import (
"fmt"
"net/http"
"strconv"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
"github.com/go-dev-frame/sponge/pkg/httpcli"
"github.com/go-dev-frame/sponge/pkg/utils"
)
func runSSEServer(port int, hub *Hub) {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
count := 10000
r.GET("/events", func(c *gin.Context) {
count++
uid := strconv.Itoa(count) // mock user id
hub.Serve(c, uid)
})
r.Run(":" + strconv.Itoa(port))
}
func TestServe(t *testing.T) {
port, _ := utils.GetAvailablePort()
eventType := DefaultEventType
gin.SetMode(gin.TestMode)
r := gin.New()
hub := NewHub()
defer hub.Close()
r.GET("/events", func(c *gin.Context) {
c.Set("uid", "user1")
handler := hub.ServeHandler(WithServeExtraHeaders(map[string]string{"X-Test": "test"}))
handler(c)
})
go func() {
r.Run(":" + strconv.Itoa(port))
}()
time.Sleep(100 * time.Millisecond) // wait for server to start
client := NewClient(fmt.Sprintf("http://localhost:%d/events", port))
var receivedEvent *Event
client.OnEvent(eventType, func(event *Event) {
t.Log("on event", event)
receivedEvent = event
})
err := client.Connect()
assert.NoError(t, err)
defer client.Disconnect()
time.Sleep(100 * time.Millisecond)
event := &Event{
Event: eventType,
Data: map[string]string{"msg": "hi"},
}
_ = hub.Push([]string{"user1"}, event)
time.Sleep(100 * time.Millisecond) // wait for event to be received
assert.Equal(t, event.Event, receivedEvent.Event)
}
func TestServeHTTPWithMissingUID(t *testing.T) {
port, _ := utils.GetAvailablePort()
hub := NewHub()
defer hub.Close()
gin.SetMode(gin.TestMode)
r := gin.New()
r.GET("/events", hub.ServeHandler())
go func() {
r.Run(":" + strconv.Itoa(port))
}()
time.Sleep(100 * time.Millisecond) // wait for server to start
req, _ := http.NewRequest("GET", fmt.Sprintf("http://localhost:%d/events", port), nil)
req.Header.Set("Accept", "text/event-stream")
resp, err := http.DefaultClient.Do(req)
assert.NoError(t, err)
defer resp.Body.Close()
assert.Equal(t, http.StatusBadRequest, resp.StatusCode)
}
func TestPushEventHandler(t *testing.T) {
port, _ := utils.GetAvailablePort()
eventType := DefaultEventType
gin.SetMode(gin.TestMode)
r := gin.New()
hub := NewHub()
defer hub.Close()
r.GET("/events", func(c *gin.Context) {
c.Set("uid", "u123")
handler := hub.ServeHandler()
handler(c)
})
r.POST("/push", hub.PushEventHandler())
go func() {
r.Run(":" + strconv.Itoa(port))
}()
time.Sleep(100 * time.Millisecond) // wait for server to start
result := map[string]interface{}{}
err := httpcli.Post(&result, fmt.Sprintf("http://localhost:%d/push", port), nil)
assert.Error(t, err)
event := &Event{
Event: eventType,
Data: "hello world",
}
body := PushRequest{
UIDs: []string{"u123"},
Events: []*Event{event},
}
result = map[string]interface{}{}
err = httpcli.Post(&result, fmt.Sprintf("http://localhost:%d/push", port), &body)
assert.NoError(t, err)
assert.Equal(t, "ok", result["msg"])
}