diff --git a/automation/service/session.go b/automation/service/session.go index 71862a4ce..9f970e1fa 100644 --- a/automation/service/session.go +++ b/automation/service/session.go @@ -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)) } } diff --git a/system/service/reminder.go b/system/service/reminder.go index 432807335..f3a7c8fa7 100644 --- a/system/service/reminder.go +++ b/system/service/reminder.go @@ -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)) } } diff --git a/websocket/types.go b/websocket/types.go index 33116fabd..d67d7dd9b 100644 --- a/websocket/types.go +++ b/websocket/types.go @@ -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 { diff --git a/websocket/websocket_test.go b/websocket/websocket_test.go new file mode 100644 index 000000000..f91ecd4e8 --- /dev/null +++ b/websocket/websocket_test.go @@ -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) + } + }) + } +}