Adds unit test for sending message to user via websocket
This commit is contained in:
@@ -11,7 +11,6 @@ import (
|
||||
"github.com/cortezaproject/corteza-server/pkg/sentry"
|
||||
"github.com/cortezaproject/corteza-server/pkg/wfexec"
|
||||
"github.com/cortezaproject/corteza-server/store"
|
||||
"github.com/cortezaproject/corteza-server/websocket"
|
||||
"go.uber.org/zap"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -368,7 +367,7 @@ func (svc *session) stateChangeHandler(ctx context.Context) wfexec.StateChangeHa
|
||||
// Send the pending prompts to user
|
||||
if svc.promptSender != nil {
|
||||
for _, pp := range s.AllPendingPrompts() {
|
||||
if err := svc.promptSender.Send(websocket.StatusOK, pp, pp.OwnerId); err != nil {
|
||||
if err := svc.promptSender.Send("ok", pp, pp.OwnerId); err != nil {
|
||||
svc.log.Error("failed to send prompt to user", zap.Error(err))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
intAuth "github.com/cortezaproject/corteza-server/pkg/auth"
|
||||
"github.com/cortezaproject/corteza-server/store"
|
||||
"github.com/cortezaproject/corteza-server/system/types"
|
||||
"github.com/cortezaproject/corteza-server/websocket"
|
||||
"github.com/getsentry/sentry-go"
|
||||
"go.uber.org/zap"
|
||||
"time"
|
||||
@@ -309,7 +308,7 @@ func (svc reminder) Watch(ctx context.Context) {
|
||||
// Send scheduled reminders to users
|
||||
_ = rr.Walk(func(r *types.Reminder) error {
|
||||
if r.RemindAt != nil && sendReminderNow(*r.RemindAt) {
|
||||
if err := svc.reminderSender.Send(websocket.StatusOK, r, r.AssignedTo); err != nil {
|
||||
if err := svc.reminderSender.Send("ok", r, r.AssignedTo); err != nil {
|
||||
svc.log.Error("failed to send reminder to user", zap.Error(err))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,6 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
StatusOK = "ok"
|
||||
StatusError = "error"
|
||||
)
|
||||
|
||||
func (a *Auth) ParseWithClaims() (jwt.MapClaims, error) {
|
||||
token, err := jwt.Parse(*a.AccessToken, nil)
|
||||
if token == nil {
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package websocket
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/cortezaproject/corteza-server/pkg/options"
|
||||
gWebsocket "github.com/gorilla/websocket"
|
||||
"go.uber.org/zap"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// WebsocketServer provide websocket server for testing
|
||||
func WebsocketTestServer(t *testing.T) (*httptest.Server, *gWebsocket.Conn) {
|
||||
// Create test server with the websocket handler.
|
||||
s := httptest.NewServer(http.HandlerFunc(wsOpen))
|
||||
|
||||
// Convert http://.. to ws://..
|
||||
u := "ws" + strings.TrimPrefix(s.URL, "http")
|
||||
|
||||
// Connect to the server
|
||||
conn, _, err := gWebsocket.DefaultDialer.Dial(u, nil)
|
||||
if err != nil {
|
||||
t.Fatalf("WebsocketServer() error while creating connection = %v", err)
|
||||
}
|
||||
|
||||
return s, conn
|
||||
}
|
||||
|
||||
// wsOpen opens websocket connection
|
||||
func wsOpen(w http.ResponseWriter, r *http.Request) {
|
||||
var gUpgrader = gWebsocket.Upgrader{}
|
||||
c, err := gUpgrader.Upgrade(w, r, nil)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer func(c *gWebsocket.Conn) {
|
||||
_ = c.Close()
|
||||
}(c)
|
||||
|
||||
for {
|
||||
mt, message, err := c.ReadMessage()
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
err = c.WriteMessage(mt, message)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSendingMessageToUser(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
kind string
|
||||
payload interface{}
|
||||
expectedP string
|
||||
}{
|
||||
{
|
||||
name: "send json",
|
||||
kind: "Json",
|
||||
payload: struct {
|
||||
Title string `json:"title"`
|
||||
Description string `json:"description"`
|
||||
}{Title: "Websocket", Description: "Testing connection.."},
|
||||
expectedP: `{"status":"ok","data":{"title":"Websocket","description":"Testing connection.."}}`,
|
||||
},
|
||||
{
|
||||
name: "send text",
|
||||
kind: "Text",
|
||||
payload: "testing connectivity",
|
||||
expectedP: "testing connectivity",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var logger *zap.Logger
|
||||
var config options.WebsocketOpt
|
||||
ws := Websocket(logger, config)
|
||||
s, conn := WebsocketTestServer(t)
|
||||
defer s.Close()
|
||||
defer func(ws *gWebsocket.Conn) {
|
||||
err := ws.Close()
|
||||
if err != nil {
|
||||
t.Fatalf("TestSendingMessageToUser() error closing connection = %v", err)
|
||||
}
|
||||
}(conn)
|
||||
|
||||
// Open a session using ws connection
|
||||
wsSession := Session(context.Background(), ws.logger, ws.config, conn)
|
||||
|
||||
var messageType int
|
||||
var data []byte
|
||||
switch tt.kind {
|
||||
case "Text":
|
||||
messageType = gWebsocket.TextMessage
|
||||
data = []byte(fmt.Sprintf("%v", tt.payload))
|
||||
case "Json":
|
||||
res := Response("ok", tt.payload)
|
||||
messageType = gWebsocket.BinaryMessage
|
||||
var err error
|
||||
data, err = res.Marshal()
|
||||
if err != nil {
|
||||
t.Fatalf("TestSendingMessageToUser() error while marshaling payload = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Send message to server, read response and check to see if it's what we expect.
|
||||
if err := wsSession.conn.WriteMessage(messageType, data); err != nil {
|
||||
t.Fatalf("TestSendingMessageToUser() error while sending message = %v", err)
|
||||
}
|
||||
|
||||
_, p, err := wsSession.conn.ReadMessage()
|
||||
if err != nil {
|
||||
t.Fatalf("TestSendingMessageToUser() error while reading message =%v", err)
|
||||
}
|
||||
|
||||
if string(p) != tt.expectedP {
|
||||
t.Fatalf("TestSendingMessageToUser() gotP = %v, want = %v", string(p), tt.expectedP)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user