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  }