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 }