|
| 1 | +// Copyright (c) 2022-present Mattermost, Inc. All Rights Reserved. |
| 2 | +// See LICENSE.txt for license information. |
| 3 | + |
| 4 | +package main |
| 5 | + |
| 6 | +import ( |
| 7 | + "encoding/json" |
| 8 | + "fmt" |
| 9 | + "net/http" |
| 10 | + "net/http/httptest" |
| 11 | + "testing" |
| 12 | + |
| 13 | + "github.com/mattermost/mattermost-plugin-calls/server/cluster" |
| 14 | + "github.com/mattermost/mattermost-plugin-calls/server/enterprise" |
| 15 | + "github.com/mattermost/mattermost-plugin-calls/server/public" |
| 16 | + "github.com/mattermost/mattermost/server/public/model" |
| 17 | + "github.com/mattermost/mattermost/server/public/plugin" |
| 18 | + |
| 19 | + serverMocks "github.com/mattermost/mattermost-plugin-calls/server/mocks/github.com/mattermost/mattermost-plugin-calls/server/interfaces" |
| 20 | + pluginMocks "github.com/mattermost/mattermost-plugin-calls/server/mocks/github.com/mattermost/mattermost/server/public/plugin" |
| 21 | + |
| 22 | + "github.com/stretchr/testify/mock" |
| 23 | + "github.com/stretchr/testify/require" |
| 24 | +) |
| 25 | + |
| 26 | +func TestHandleBotGetProfileForSession(t *testing.T) { |
| 27 | + mockAPI := &pluginMocks.MockAPI{} |
| 28 | + mockMetrics := &serverMocks.MockMetrics{} |
| 29 | + |
| 30 | + botUserID := model.NewId() |
| 31 | + |
| 32 | + p := Plugin{ |
| 33 | + MattermostPlugin: plugin.MattermostPlugin{ |
| 34 | + API: mockAPI, |
| 35 | + }, |
| 36 | + metrics: mockMetrics, |
| 37 | + botSession: &model.Session{ |
| 38 | + UserId: botUserID, |
| 39 | + }, |
| 40 | + callsClusterLocks: map[string]*cluster.Mutex{}, |
| 41 | + } |
| 42 | + |
| 43 | + p.licenseChecker = enterprise.NewLicenseChecker(p.API) |
| 44 | + |
| 45 | + store, tearDown := NewTestStore(t) |
| 46 | + t.Cleanup(tearDown) |
| 47 | + p.store = store |
| 48 | + |
| 49 | + mockAPI.On("KVSetWithOptions", mock.Anything, mock.Anything, mock.Anything).Return(true, nil) |
| 50 | + mockMetrics.On("ObserveClusterMutexGrabTime", "mutex_call", mock.AnythingOfType("float64")) |
| 51 | + mockMetrics.On("ObserveAppHandlersTime", mock.AnythingOfType("string"), mock.AnythingOfType("float64")) |
| 52 | + mockMetrics.On("ObserveClusterMutexLockedTime", "mutex_call", mock.AnythingOfType("float64")) |
| 53 | + mockMetrics.On("Handler").Return(nil).Once() |
| 54 | + |
| 55 | + mockAPI.On("GetConfig").Return(&model.Config{}, nil) |
| 56 | + mockAPI.On("GetLicense").Return(&model.License{ |
| 57 | + SkuShortName: "enterprise", |
| 58 | + }, nil) |
| 59 | + |
| 60 | + apiRouter := p.newAPIRouter() |
| 61 | + |
| 62 | + t.Run("no call ongoing", func(t *testing.T) { |
| 63 | + defer mockAPI.AssertExpectations(t) |
| 64 | + defer mockMetrics.AssertExpectations(t) |
| 65 | + |
| 66 | + channelID := model.NewId() |
| 67 | + sessionID := model.NewId() |
| 68 | + |
| 69 | + mockAPI.On("LogDebug", "creating cluster mutex for call", |
| 70 | + "origin", mock.AnythingOfType("string"), "channelID", channelID).Once() |
| 71 | + mockAPI.On("KVDelete", "mutex_call_"+channelID).Return(nil).Once() |
| 72 | + |
| 73 | + w := httptest.NewRecorder() |
| 74 | + r := httptest.NewRequest("GET", fmt.Sprintf("/bot/calls/%s/sessions/%s/profile", channelID, sessionID), nil) |
| 75 | + r.Header.Set("Mattermost-User-Id", botUserID) |
| 76 | + |
| 77 | + apiRouter.ServeHTTP(w, r) |
| 78 | + |
| 79 | + resp := w.Result() |
| 80 | + require.Equal(t, http.StatusBadRequest, resp.StatusCode) |
| 81 | + var res httpResponse |
| 82 | + err := json.NewDecoder(resp.Body).Decode(&res) |
| 83 | + require.NoError(t, err) |
| 84 | + require.Equal(t, "no call ongoing", res.Msg) |
| 85 | + require.Equal(t, 400, res.Code) |
| 86 | + }) |
| 87 | + |
| 88 | + t.Run("session not found", func(t *testing.T) { |
| 89 | + defer mockAPI.AssertExpectations(t) |
| 90 | + defer mockMetrics.AssertExpectations(t) |
| 91 | + |
| 92 | + channelID := model.NewId() |
| 93 | + sessionID := model.NewId() |
| 94 | + call := &public.Call{ |
| 95 | + ID: model.NewId(), |
| 96 | + ChannelID: channelID, |
| 97 | + CreateAt: 45, |
| 98 | + StartAt: 45, |
| 99 | + OwnerID: botUserID, |
| 100 | + } |
| 101 | + err := store.CreateCall(call) |
| 102 | + require.NoError(t, err) |
| 103 | + |
| 104 | + w := httptest.NewRecorder() |
| 105 | + r := httptest.NewRequest("GET", fmt.Sprintf("/bot/calls/%s/sessions/%s/profile", channelID, sessionID), nil) |
| 106 | + |
| 107 | + mockAPI.On("LogDebug", "creating cluster mutex for call", |
| 108 | + "origin", mock.AnythingOfType("string"), "channelID", channelID).Once() |
| 109 | + mockAPI.On("KVDelete", "mutex_call_"+channelID).Return(nil).Once() |
| 110 | + |
| 111 | + r.Header.Set("Mattermost-User-Id", botUserID) |
| 112 | + apiRouter.ServeHTTP(w, r) |
| 113 | + |
| 114 | + resp := w.Result() |
| 115 | + require.Equal(t, http.StatusNotFound, resp.StatusCode) |
| 116 | + var res httpResponse |
| 117 | + err = json.NewDecoder(resp.Body).Decode(&res) |
| 118 | + require.NoError(t, err) |
| 119 | + require.Equal(t, "not found", res.Msg) |
| 120 | + require.Equal(t, 404, res.Code) |
| 121 | + }) |
| 122 | + |
| 123 | + t.Run("get user error", func(t *testing.T) { |
| 124 | + channelID := model.NewId() |
| 125 | + userID := model.NewId() |
| 126 | + sessionID := model.NewId() |
| 127 | + call := &public.Call{ |
| 128 | + ID: model.NewId(), |
| 129 | + ChannelID: channelID, |
| 130 | + CreateAt: 45, |
| 131 | + StartAt: 45, |
| 132 | + OwnerID: userID, |
| 133 | + } |
| 134 | + err := store.CreateCall(call) |
| 135 | + require.NoError(t, err) |
| 136 | + |
| 137 | + err = store.CreateCallSession(&public.CallSession{ |
| 138 | + ID: sessionID, |
| 139 | + CallID: call.ID, |
| 140 | + UserID: userID, |
| 141 | + JoinAt: 45, |
| 142 | + }) |
| 143 | + require.NoError(t, err) |
| 144 | + |
| 145 | + mockAPI.On("GetUser", userID).Return(nil, &model.AppError{ |
| 146 | + Message: "failed to get user", |
| 147 | + }).Once() |
| 148 | + |
| 149 | + w := httptest.NewRecorder() |
| 150 | + r := httptest.NewRequest("GET", "/bot/calls/"+channelID+"/sessions/"+sessionID+"/profile", nil) |
| 151 | + |
| 152 | + mockAPI.On("LogDebug", "creating cluster mutex for call", |
| 153 | + "origin", mock.AnythingOfType("string"), "channelID", channelID).Once() |
| 154 | + mockAPI.On("KVDelete", "mutex_call_"+channelID).Return(nil).Once() |
| 155 | + |
| 156 | + r.Header.Set("Mattermost-User-Id", botUserID) |
| 157 | + apiRouter.ServeHTTP(w, r) |
| 158 | + |
| 159 | + resp := w.Result() |
| 160 | + require.Equal(t, http.StatusInternalServerError, resp.StatusCode) |
| 161 | + |
| 162 | + var res httpResponse |
| 163 | + err = json.NewDecoder(resp.Body).Decode(&res) |
| 164 | + require.NoError(t, err) |
| 165 | + require.Equal(t, "failed to get user", res.Msg) |
| 166 | + require.Equal(t, 500, res.Code) |
| 167 | + }) |
| 168 | + |
| 169 | + t.Run("success", func(t *testing.T) { |
| 170 | + channelID := model.NewId() |
| 171 | + userID := model.NewId() |
| 172 | + sessionID := model.NewId() |
| 173 | + call := &public.Call{ |
| 174 | + ID: model.NewId(), |
| 175 | + ChannelID: channelID, |
| 176 | + CreateAt: 45, |
| 177 | + StartAt: 45, |
| 178 | + OwnerID: userID, |
| 179 | + } |
| 180 | + err := store.CreateCall(call) |
| 181 | + require.NoError(t, err) |
| 182 | + |
| 183 | + err = store.CreateCallSession(&public.CallSession{ |
| 184 | + ID: sessionID, |
| 185 | + CallID: call.ID, |
| 186 | + UserID: userID, |
| 187 | + JoinAt: 45, |
| 188 | + }) |
| 189 | + require.NoError(t, err) |
| 190 | + |
| 191 | + user := &model.User{ |
| 192 | + Id: userID, |
| 193 | + Username: "testuser", |
| 194 | + Email: "test@example.com", |
| 195 | + } |
| 196 | + mockAPI.On("GetUser", userID).Return(user, nil).Once() |
| 197 | + |
| 198 | + w := httptest.NewRecorder() |
| 199 | + r := httptest.NewRequest("GET", "/bot/calls/"+channelID+"/sessions/"+sessionID+"/profile", nil) |
| 200 | + |
| 201 | + mockAPI.On("LogDebug", "creating cluster mutex for call", |
| 202 | + "origin", mock.AnythingOfType("string"), "channelID", channelID).Once() |
| 203 | + mockAPI.On("KVDelete", "mutex_call_"+channelID).Return(nil).Once() |
| 204 | + |
| 205 | + r.Header.Set("Mattermost-User-Id", botUserID) |
| 206 | + apiRouter.ServeHTTP(w, r) |
| 207 | + |
| 208 | + resp := w.Result() |
| 209 | + require.Equal(t, http.StatusOK, resp.StatusCode) |
| 210 | + |
| 211 | + var respUser model.User |
| 212 | + err = json.NewDecoder(resp.Body).Decode(&respUser) |
| 213 | + require.NoError(t, err) |
| 214 | + require.Equal(t, userID, respUser.Id) |
| 215 | + require.Equal(t, user.Username, respUser.Username) |
| 216 | + require.Equal(t, user.Email, respUser.Email) |
| 217 | + }) |
| 218 | +} |
0 commit comments