3
0

Adds unit test for sending message to user via websocket

This commit is contained in:
Vivek Patel
2021-04-28 12:09:36 +05:30
committed by Denis Arh
parent 7d58795123
commit f1f53313b2
4 changed files with 129 additions and 9 deletions
+1 -2
View File
@@ -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))
}
}
+1 -2
View File
@@ -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))
}
}
-5
View File
@@ -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 {
+127
View File
@@ -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)
}
})
}
}