github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/services/sharedchannel/channelinvite_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package sharedchannel 5 6 import ( 7 "encoding/json" 8 "errors" 9 "fmt" 10 "net/http" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 16 "github.com/masterhung0112/hk_server/v5/model" 17 "github.com/masterhung0112/hk_server/v5/plugin/plugintest/mock" 18 "github.com/masterhung0112/hk_server/v5/shared/mlog" 19 "github.com/masterhung0112/hk_server/v5/store/storetest/mocks" 20 ) 21 22 type mockLogger struct { 23 mlog.LoggerIFace 24 } 25 26 func (ml *mockLogger) Log(level mlog.LogLevel, s string, flds ...mlog.Field) {} 27 28 func TestOnReceiveChannelInvite(t *testing.T) { 29 t.Run("when msg payload is empty, it does nothing", func(t *testing.T) { 30 mockServer := &MockServerIface{} 31 mockLogger := &mockLogger{} 32 mockServer.On("GetLogger").Return(mockLogger) 33 mockApp := &MockAppIface{} 34 scs := &Service{ 35 server: mockServer, 36 app: mockApp, 37 } 38 39 mockStore := &mocks.Store{} 40 mockServer = scs.server.(*MockServerIface) 41 mockServer.On("GetStore").Return(mockStore) 42 43 remoteCluster := &model.RemoteCluster{} 44 msg := model.RemoteClusterMsg{} 45 46 err := scs.onReceiveChannelInvite(msg, remoteCluster, nil) 47 require.NoError(t, err) 48 mockStore.AssertNotCalled(t, "Channel") 49 }) 50 51 t.Run("when invitation prescribes a readonly channel, it does create a readonly channel", func(t *testing.T) { 52 mockServer := &MockServerIface{} 53 mockLogger := &mockLogger{} 54 mockServer.On("GetLogger").Return(mockLogger) 55 mockApp := &MockAppIface{} 56 scs := &Service{ 57 server: mockServer, 58 app: mockApp, 59 } 60 61 mockStore := &mocks.Store{} 62 remoteCluster := &model.RemoteCluster{Name: "test"} 63 invitation := channelInviteMsg{ 64 ChannelId: model.NewId(), 65 TeamId: model.NewId(), 66 ReadOnly: true, 67 Type: "0", 68 } 69 payload, err := json.Marshal(invitation) 70 require.NoError(t, err) 71 72 msg := model.RemoteClusterMsg{ 73 Payload: payload, 74 } 75 mockChannelStore := mocks.ChannelStore{} 76 mockSharedChannelStore := mocks.SharedChannelStore{} 77 channel := &model.Channel{} 78 79 mockChannelStore.On("Get", invitation.ChannelId, true).Return(channel, nil) 80 mockSharedChannelStore.On("Save", mock.Anything).Return(nil, nil) 81 mockSharedChannelStore.On("SaveRemote", mock.Anything).Return(nil, nil) 82 mockStore.On("Channel").Return(&mockChannelStore) 83 mockStore.On("SharedChannel").Return(&mockSharedChannelStore) 84 85 mockServer = scs.server.(*MockServerIface) 86 mockServer.On("GetStore").Return(mockStore) 87 createPostPermission := model.ChannelModeratedPermissionsMap[model.PERMISSION_CREATE_POST.Id] 88 createReactionPermission := model.ChannelModeratedPermissionsMap[model.PERMISSION_ADD_REACTION.Id] 89 updateMap := model.ChannelModeratedRolesPatch{ 90 Guests: model.NewBool(false), 91 Members: model.NewBool(false), 92 } 93 94 readonlyChannelModerations := []*model.ChannelModerationPatch{ 95 { 96 Name: &createPostPermission, 97 Roles: &updateMap, 98 }, 99 { 100 Name: &createReactionPermission, 101 Roles: &updateMap, 102 }, 103 } 104 mockApp.On("PatchChannelModerationsForChannel", channel, readonlyChannelModerations).Return(nil, nil) 105 defer mockApp.AssertExpectations(t) 106 107 err = scs.onReceiveChannelInvite(msg, remoteCluster, nil) 108 require.NoError(t, err) 109 }) 110 111 t.Run("when invitation prescribes a readonly channel and readonly update fails, it returns an error", func(t *testing.T) { 112 mockServer := &MockServerIface{} 113 mockLogger := &mockLogger{} 114 mockServer.On("GetLogger").Return(mockLogger) 115 mockApp := &MockAppIface{} 116 scs := &Service{ 117 server: mockServer, 118 app: mockApp, 119 } 120 121 mockStore := &mocks.Store{} 122 remoteCluster := &model.RemoteCluster{Name: "test2"} 123 invitation := channelInviteMsg{ 124 ChannelId: model.NewId(), 125 TeamId: model.NewId(), 126 ReadOnly: true, 127 Type: "0", 128 } 129 payload, err := json.Marshal(invitation) 130 require.NoError(t, err) 131 132 msg := model.RemoteClusterMsg{ 133 Payload: payload, 134 } 135 mockChannelStore := mocks.ChannelStore{} 136 channel := &model.Channel{} 137 138 mockChannelStore.On("Get", invitation.ChannelId, true).Return(channel, nil) 139 mockStore.On("Channel").Return(&mockChannelStore) 140 141 mockServer = scs.server.(*MockServerIface) 142 mockServer.On("GetStore").Return(mockStore) 143 appErr := model.NewAppError("foo", "bar", nil, "boom", http.StatusBadRequest) 144 145 mockApp.On("PatchChannelModerationsForChannel", channel, mock.Anything).Return(nil, appErr) 146 defer mockApp.AssertExpectations(t) 147 148 err = scs.onReceiveChannelInvite(msg, remoteCluster, nil) 149 require.Error(t, err) 150 assert.Equal(t, fmt.Sprintf("cannot make channel readonly `%s`: foo: bar, boom", invitation.ChannelId), err.Error()) 151 }) 152 153 t.Run("when invitation prescribes a direct channel, it does create a direct channel", func(t *testing.T) { 154 mockServer := &MockServerIface{} 155 mockLogger := &mockLogger{} 156 mockServer.On("GetLogger").Return(mockLogger) 157 mockApp := &MockAppIface{} 158 scs := &Service{ 159 server: mockServer, 160 app: mockApp, 161 } 162 163 mockStore := &mocks.Store{} 164 remoteCluster := &model.RemoteCluster{Name: "test3", CreatorId: model.NewId()} 165 invitation := channelInviteMsg{ 166 ChannelId: model.NewId(), 167 TeamId: model.NewId(), 168 ReadOnly: false, 169 Type: model.CHANNEL_DIRECT, 170 DirectParticipantIDs: []string{model.NewId(), model.NewId()}, 171 } 172 payload, err := json.Marshal(invitation) 173 require.NoError(t, err) 174 175 msg := model.RemoteClusterMsg{ 176 Payload: payload, 177 } 178 mockChannelStore := mocks.ChannelStore{} 179 mockSharedChannelStore := mocks.SharedChannelStore{} 180 channel := &model.Channel{} 181 182 mockChannelStore.On("Get", invitation.ChannelId, true).Return(nil, errors.New("boom")) 183 mockSharedChannelStore.On("Save", mock.Anything).Return(nil, nil) 184 mockSharedChannelStore.On("SaveRemote", mock.Anything).Return(nil, nil) 185 mockStore.On("Channel").Return(&mockChannelStore) 186 mockStore.On("SharedChannel").Return(&mockSharedChannelStore) 187 188 mockServer = scs.server.(*MockServerIface) 189 mockServer.On("GetStore").Return(mockStore) 190 191 mockApp.On("GetOrCreateDirectChannel", mock.AnythingOfType("*request.Context"), invitation.DirectParticipantIDs[0], invitation.DirectParticipantIDs[1], mock.AnythingOfType("model.ChannelOption")).Return(channel, nil) 192 defer mockApp.AssertExpectations(t) 193 194 err = scs.onReceiveChannelInvite(msg, remoteCluster, nil) 195 require.NoError(t, err) 196 }) 197 }