From 5f48a359caad1dc9eec0f02a57115a358863d238 Mon Sep 17 00:00:00 2001 From: fume4mattermost Date: Fri, 4 Oct 2024 10:32:53 +0300 Subject: [PATCH] =?UTF-8?q?[MM-56033]Added=20unit=20tests=20for=20UpdateUs?= =?UTF-8?q?erCustomStatus=20and=20RemoveUserCustomStatu=E2=80=A6=20(#28216?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * added unit tests for UpdateUserCustomStatus and RemoveUserCustomStatus functions * stylistic improvements in status endpoint tests * linting fix --------- Co-authored-by: Fume --- server/channels/api4/status_test.go | 176 +++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 2 deletions(-) diff --git a/server/channels/api4/status_test.go b/server/channels/api4/status_test.go index 418a4b7819..62a7c4ee64 100644 --- a/server/channels/api4/status_test.go +++ b/server/channels/api4/status_test.go @@ -5,13 +5,13 @@ package api4 import ( "context" + "strings" "testing" "time" + "github.com/mattermost/mattermost/server/public/model" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - - "github.com/mattermost/mattermost/server/public/model" ) func TestGetUserStatus(t *testing.T) { @@ -243,3 +243,175 @@ func TestUpdateUserStatus(t *testing.T) { CheckUnauthorizedStatus(t, resp) }) } + +func TestUpdateUserCustomStatus(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + client := th.Client + + t.Run("set custom status", func(t *testing.T) { + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "calendar", // Use a valid emoji name + Text: "My custom status", + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.NoError(t, err) + CheckOKStatus(t, resp) + + user, _, err := client.GetUser(context.Background(), th.BasicUser.Id, "") + require.NoError(t, err) + customStatus := user.GetCustomStatus() + require.NotNil(t, customStatus) + assert.Equal(t, toUpdateCustomStatus.Emoji, customStatus.Emoji) + assert.Equal(t, toUpdateCustomStatus.Text, customStatus.Text) + }) + + t.Run("update custom status with duration", func(t *testing.T) { + expiresAt := time.Now().Add(1 * time.Hour) + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "palm_tree", // Use a valid emoji name + Text: "On vacation", + Duration: "date_and_time", + ExpiresAt: expiresAt, + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.NoError(t, err) + CheckOKStatus(t, resp) + + user, _, err := client.GetUser(context.Background(), th.BasicUser.Id, "") + require.NoError(t, err) + customStatus := user.GetCustomStatus() + require.NotNil(t, customStatus) + assert.Equal(t, toUpdateCustomStatus.Emoji, customStatus.Emoji) + assert.Equal(t, toUpdateCustomStatus.Text, customStatus.Text) + assert.Equal(t, toUpdateCustomStatus.Duration, customStatus.Duration) + + require.NotNil(t, customStatus.ExpiresAt, "Expected ExpiresAt to be set") + // Check that ExpiresAt is within 5 seconds of the expected time + assert.WithinDuration(t, expiresAt, customStatus.ExpiresAt, 5*time.Second) + }) + + t.Run("attempt to set custom status when disabled", func(t *testing.T) { + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableCustomUserStatuses = false }) + defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableCustomUserStatuses = true }) + + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "palm_tree", + Text: "My custom status", + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.Error(t, err) + CheckNotImplementedStatus(t, resp) + + // Assert that the error ID is "api.custom_status.disabled" + if appErr, ok := err.(*model.AppError); ok { + assert.Equal(t, "api.custom_status.disabled", appErr.Id) + } else { + t.Errorf("expected *model.AppError, got %T", err) + } + }) + + t.Run("attempt to set custom status for another user", func(t *testing.T) { + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "palm_tree", + Text: "My custom status", + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser2.Id, toUpdateCustomStatus) + require.Error(t, err) + CheckForbiddenStatus(t, resp) + }) + + t.Run("attempt to set custom status with invalid data", func(t *testing.T) { + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "invalid_emoji", + Text: strings.Repeat("a", 101), // Exceeds max length + Duration: "invalid_duration", + ExpiresAt: time.Now().Add(-1 * time.Hour), + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.Error(t, err) + CheckBadRequestStatus(t, resp) + }) + + t.Run("attempt to set custom status as non-authenticated user", func(t *testing.T) { + client.Logout(context.Background()) + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "palm_tree", + Text: "My custom status", + } + _, resp, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.Error(t, err) + CheckUnauthorizedStatus(t, resp) + }) +} + +func TestRemoveUserCustomStatus(t *testing.T) { + th := Setup(t).InitBasic() + defer th.TearDown() + client := th.Client + + t.Run("remove custom status successfully", func(t *testing.T) { + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "calendar", + Text: "My custom status", + } + _, _, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.NoError(t, err) + + resp, err := client.RemoveUserCustomStatus(context.Background(), th.BasicUser.Id) + require.NoError(t, err) + CheckOKStatus(t, resp) + + user, _, err := client.GetUser(context.Background(), th.BasicUser.Id, "") + require.NoError(t, err) + customStatus := user.GetCustomStatus() + assert.Nil(t, customStatus) + }) + + t.Run("attempt to remove custom status when disabled", func(t *testing.T) { + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableCustomUserStatuses = false }) + defer th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.EnableCustomUserStatuses = true }) + + resp, err := client.RemoveUserCustomStatus(context.Background(), th.BasicUser.Id) + require.Error(t, err) + CheckNotImplementedStatus(t, resp) + }) + + t.Run("attempt to remove custom status for another user", func(t *testing.T) { + resp, err := client.RemoveUserCustomStatus(context.Background(), th.BasicUser2.Id) + require.Error(t, err) + CheckForbiddenStatus(t, resp) + }) + + t.Run("attempt to remove custom status as non-authenticated user", func(t *testing.T) { + client.Logout(context.Background()) + resp, err := client.RemoveUserCustomStatus(context.Background(), th.BasicUser.Id) + require.Error(t, err) + CheckUnauthorizedStatus(t, resp) + }) + + t.Run("remove non-existent custom status", func(t *testing.T) { + th.LoginBasic() + resp, err := client.RemoveUserCustomStatus(context.Background(), th.BasicUser.Id) + require.NoError(t, err) + CheckOKStatus(t, resp) + }) + + t.Run("remove custom status with system admin", func(t *testing.T) { + toUpdateCustomStatus := &model.CustomStatus{ + Emoji: "calendar", + Text: "My custom status", + } + _, _, err := client.UpdateUserCustomStatus(context.Background(), th.BasicUser.Id, toUpdateCustomStatus) + require.NoError(t, err) + + resp, err := th.SystemAdminClient.RemoveUserCustomStatus(context.Background(), th.BasicUser.Id) + require.NoError(t, err) + CheckOKStatus(t, resp) + + user, _, err := client.GetUser(context.Background(), th.BasicUser.Id, "") + require.NoError(t, err) + customStatus := user.GetCustomStatus() + assert.Nil(t, customStatus) + }) +}