github.com/status-im/status-go@v1.1.0/cmd/statusd/server/signals_server_test.go (about)

     1  package server
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/url"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/gorilla/websocket"
    14  
    15  	"github.com/status-im/status-go/protocol/common"
    16  	"github.com/status-im/status-go/signal"
    17  )
    18  
    19  func TestSignalsServer(t *testing.T) {
    20  	server := NewServer()
    21  	server.Setup()
    22  	err := server.Listen("localhost:0")
    23  	require.NoError(t, err)
    24  	defer func() {
    25  		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    26  		defer cancel()
    27  		server.Stop(ctx)
    28  	}()
    29  
    30  	addr := server.Address()
    31  	serverURLString := fmt.Sprintf("ws://%s", addr)
    32  	serverURL, err := url.Parse(serverURLString)
    33  	require.NoError(t, err)
    34  	require.NotZero(t, serverURL.Port())
    35  
    36  	connection, _, err := websocket.DefaultDialer.Dial(serverURLString+"/signals", nil)
    37  	require.NoError(t, err)
    38  	require.NotNil(t, connection)
    39  	defer func() {
    40  		err := connection.Close()
    41  		require.NoError(t, err)
    42  	}()
    43  
    44  	sentEvent := signal.MessageDeliveredSignal{
    45  		ChatID:    randomAlphabeticalString(t, 10),
    46  		MessageID: randomAlphabeticalString(t, 10),
    47  	}
    48  
    49  	signal.SendMessageDelivered(sentEvent.ChatID, sentEvent.MessageID)
    50  
    51  	messageType, data, err := connection.ReadMessage()
    52  	require.NoError(t, err)
    53  	require.Equal(t, websocket.TextMessage, messageType)
    54  
    55  	receivedSignal := signal.Envelope{}
    56  	err = json.Unmarshal(data, &receivedSignal)
    57  	require.NoError(t, err)
    58  	require.Equal(t, signal.EventMesssageDelivered, receivedSignal.Type)
    59  	require.NotNil(t, receivedSignal.Event)
    60  
    61  	// Convert `interface{}` to json and then back to the original struct
    62  	tempJson, err := json.Marshal(receivedSignal.Event)
    63  	require.NoError(t, err)
    64  
    65  	receivedEvent := signal.MessageDeliveredSignal{}
    66  	err = json.Unmarshal(tempJson, &receivedEvent)
    67  	require.NoError(t, err)
    68  	require.Equal(t, sentEvent, receivedEvent)
    69  }
    70  
    71  func randomAlphabeticalString(t *testing.T, n int) string {
    72  	s, err := common.RandomAlphabeticalString(n)
    73  	require.NoError(t, err)
    74  	return s
    75  }