diff --git a/api4/channel_category_test.go b/api4/channel_category_test.go index 28876a3c8c..c877e3983d 100644 --- a/api4/channel_category_test.go +++ b/api4/channel_category_test.go @@ -4,7 +4,9 @@ package api4 import ( + "encoding/json" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -71,6 +73,82 @@ func TestCreateCategoryForTeamForUser(t *testing.T) { assert.NotContains(t, received.Channels, channel.Id) assert.Equal(t, []string{th.BasicChannel.Id}, received.Channels) }) + + t.Run("should return expected sort order value", func(t *testing.T) { + user, client := setupUserForSubtest(t, th) + + customCategory, _, err := client.CreateSidebarCategoryForTeamForUser(user.Id, th.BasicTeam.Id, &model.SidebarCategoryWithChannels{ + SidebarCategory: model.SidebarCategory{ + UserId: user.Id, + TeamId: th.BasicTeam.Id, + DisplayName: "custom123", + }, + }) + require.NoError(t, err) + + // Initial new category sort order is 10 (first) + require.Equal(t, int64(10), customCategory.SortOrder) + }) + + t.Run("should publish expected WS payload", func(t *testing.T) { + userWSClient, err := th.CreateWebSocketClient() + require.NoError(t, err) + defer userWSClient.Close() + userWSClient.Listen() + + category := &model.SidebarCategoryWithChannels{ + SidebarCategory: model.SidebarCategory{ + UserId: th.BasicUser.Id, + TeamId: th.BasicTeam.Id, + DisplayName: "test", + }, + Channels: []string{th.BasicChannel.Id, "notachannel", th.BasicChannel2.Id}, + } + + received, _, err := th.Client.CreateSidebarCategoryForTeamForUser(th.BasicUser.Id, th.BasicTeam.Id, category) + require.NoError(t, err) + + testCategories := []*model.SidebarCategoryWithChannels{ + { + SidebarCategory: model.SidebarCategory{ + Id: received.Id, + UserId: th.BasicUser.Id, + TeamId: th.BasicTeam.Id, + Sorting: model.SidebarCategorySortRecent, + Muted: true, + }, + Channels: []string{th.BasicChannel.Id}, + }, + } + + testCategories, _, err = th.Client.UpdateSidebarCategoriesForTeamForUser(th.BasicUser.Id, th.BasicTeam.Id, testCategories) + require.NoError(t, err) + + b, err := json.Marshal(testCategories) + require.NoError(t, err) + expected := string(b) + + var caught bool + func() { + for { + select { + case ev := <-userWSClient.EventChannel: + if ev.EventType() == model.WebsocketEventSidebarCategoryUpdated { + caught = true + data := ev.GetData() + + updatedCategoriesData, ok := data["updatedCategories"] + require.True(t, ok) + require.EqualValues(t, expected, updatedCategoriesData) + } + case <-time.After(1 * time.Second): + return + } + } + }() + + require.Truef(t, caught, "User should have received %s event", model.WebsocketEventSidebarCategoryUpdated) + }) } func TestUpdateCategoryForTeamForUser(t *testing.T) { diff --git a/app/channel_category.go b/app/channel_category.go index 0050dec661..bc903e2851 100644 --- a/app/channel_category.go +++ b/app/channel_category.go @@ -4,6 +4,7 @@ package app import ( + "encoding/json" "errors" "net/http" @@ -119,6 +120,14 @@ func (a *App) UpdateSidebarCategories(userID, teamID string, categories []*model } message := model.NewWebSocketEvent(model.WebsocketEventSidebarCategoryUpdated, teamID, "", userID, nil) + + updatedCategoriesJSON, jsonErr := json.Marshal(updatedCategories) + if jsonErr != nil { + mlog.Warn("Failed to encode original categories to JSON", mlog.Err(jsonErr)) + } + + message.Add("updatedCategories", string(updatedCategoriesJSON)) + a.Publish(message) a.muteChannelsForUpdatedCategories(userID, updatedCategories, originalCategories) diff --git a/model/channel_sidebar.go b/model/channel_sidebar.go index e434e17417..d5d21112da 100644 --- a/model/channel_sidebar.go +++ b/model/channel_sidebar.go @@ -37,12 +37,11 @@ const ( ) // SidebarCategory represents the corresponding DB table -// SortOrder is never returned to the user and only used for queries type SidebarCategory struct { Id string `json:"id"` UserId string `json:"user_id"` TeamId string `json:"team_id"` - SortOrder int64 `json:"-"` + SortOrder int64 `json:"sort_order"` Sorting SidebarCategorySorting `json:"sorting"` Type SidebarCategoryType `json:"type"` DisplayName string `json:"display_name"`