github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/model/websocket_message_test.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package model
     5  
     6  import (
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestWebSocketEvent(t *testing.T) {
    15  	userId := NewId()
    16  	m := NewWebSocketEvent("some_event", NewId(), NewId(), userId, nil)
    17  	m.Add("RootId", NewId())
    18  	user := &User{
    19  		Id: userId,
    20  	}
    21  	m.Add("user", user)
    22  	json := m.ToJson()
    23  	result := WebSocketEventFromJson(strings.NewReader(json))
    24  
    25  	require.True(t, m.IsValid(), "should be valid")
    26  	require.Equal(t, m.GetBroadcast().TeamId, result.GetBroadcast().TeamId, "Team ids do not match")
    27  	require.Equal(t, m.GetData()["RootId"], result.GetData()["RootId"], "Root ids do not match")
    28  	require.Equal(t, m.GetData()["user"].(*User).Id, result.GetData()["user"].(*User).Id, "User ids do not match")
    29  }
    30  
    31  func TestWebSocketEventImmutable(t *testing.T) {
    32  	m := NewWebSocketEvent("some_event", NewId(), NewId(), NewId(), nil)
    33  
    34  	new := m.SetEvent("new_event")
    35  	if new == m {
    36  		require.Fail(t, "pointers should not be the same")
    37  	}
    38  	require.NotEqual(t, m.Event, new.Event)
    39  	require.Equal(t, new.Event, "new_event")
    40  	require.Equal(t, new.Event, new.EventType())
    41  
    42  	new = m.SetSequence(45)
    43  	if new == m {
    44  		require.Fail(t, "pointers should not be the same")
    45  	}
    46  	require.NotEqual(t, m.Sequence, new.Sequence)
    47  	require.Equal(t, new.Sequence, int64(45))
    48  	require.Equal(t, new.Sequence, new.GetSequence())
    49  
    50  	broadcast := &WebsocketBroadcast{}
    51  	new = m.SetBroadcast(broadcast)
    52  	if new == m {
    53  		require.Fail(t, "pointers should not be the same")
    54  	}
    55  	require.NotEqual(t, m.Broadcast, new.Broadcast)
    56  	require.Equal(t, new.Broadcast, broadcast)
    57  	require.Equal(t, new.Broadcast, new.GetBroadcast())
    58  
    59  	data := map[string]interface{}{
    60  		"key":  "val",
    61  		"key2": "val2",
    62  	}
    63  	new = m.SetData(data)
    64  	if new == m {
    65  		require.Fail(t, "pointers should not be the same")
    66  	}
    67  	require.NotEqual(t, m, new)
    68  	require.Equal(t, new.Data, data)
    69  	require.Equal(t, new.Data, new.GetData())
    70  
    71  	copy := m.Copy()
    72  	if copy == m {
    73  		require.Fail(t, "pointers should not be the same")
    74  	}
    75  	require.Equal(t, m, copy)
    76  }
    77  
    78  func TestWebSocketEventFromJson(t *testing.T) {
    79  	ev := WebSocketEventFromJson(strings.NewReader("junk"))
    80  	require.Nil(t, ev, "should not have parsed")
    81  	data := `{"event": "test", "data": {"key": "val"}, "seq": 45, "broadcast": {"user_id": "userid"}}`
    82  	ev = WebSocketEventFromJson(strings.NewReader(data))
    83  	require.NotNil(t, ev, "should have parsed")
    84  	require.Equal(t, ev.Event, "test")
    85  	require.Equal(t, ev.Sequence, int64(45))
    86  	require.Equal(t, ev.Data, map[string]interface{}{"key": "val"})
    87  	require.Equal(t, ev.Broadcast, &WebsocketBroadcast{UserId: "userid"})
    88  }
    89  
    90  func TestWebSocketResponse(t *testing.T) {
    91  	m := NewWebSocketResponse("OK", 1, map[string]interface{}{})
    92  	e := NewWebSocketError(1, &AppError{})
    93  	m.Add("RootId", NewId())
    94  	json := m.ToJson()
    95  	result := WebSocketResponseFromJson(strings.NewReader(json))
    96  	json2 := e.ToJson()
    97  	WebSocketResponseFromJson(strings.NewReader(json2))
    98  
    99  	badresult := WebSocketResponseFromJson(strings.NewReader("junk"))
   100  	require.Nil(t, badresult, "should not have parsed")
   101  
   102  	require.True(t, m.IsValid(), "should be valid")
   103  
   104  	require.Equal(t, m.Data["RootId"], result.Data["RootId"], "Ids do not match")
   105  }
   106  
   107  func TestWebSocketEvent_PrecomputeJSON(t *testing.T) {
   108  	event := NewWebSocketEvent(WEBSOCKET_EVENT_POSTED, "foo", "bar", "baz", nil)
   109  	event = event.SetSequence(7)
   110  
   111  	before := event.ToJson()
   112  	event.PrecomputeJSON()
   113  	after := event.ToJson()
   114  
   115  	assert.JSONEq(t, before, after)
   116  }
   117  
   118  var stringSink string
   119  
   120  func BenchmarkWebSocketEvent_ToJson(b *testing.B) {
   121  	event := NewWebSocketEvent(WEBSOCKET_EVENT_POSTED, "foo", "bar", "baz", nil)
   122  	for i := 0; i < 100; i++ {
   123  		event.GetData()[NewId()] = NewId()
   124  	}
   125  
   126  	b.Run("SerializedNTimes", func(b *testing.B) {
   127  		for i := 0; i < b.N; i++ {
   128  			stringSink = event.ToJson()
   129  		}
   130  	})
   131  
   132  	b.Run("PrecomputedNTimes", func(b *testing.B) {
   133  		for i := 0; i < b.N; i++ {
   134  			event.PrecomputeJSON()
   135  		}
   136  	})
   137  
   138  	b.Run("PrecomputedAndSerializedNTimes", func(b *testing.B) {
   139  		for i := 0; i < b.N; i++ {
   140  			event.PrecomputeJSON()
   141  			stringSink = event.ToJson()
   142  		}
   143  	})
   144  
   145  	event.PrecomputeJSON()
   146  	b.Run("PrecomputedOnceAndSerializedNTimes", func(b *testing.B) {
   147  		for i := 0; i < b.N; i++ {
   148  			stringSink = event.ToJson()
   149  		}
   150  	})
   151  }