[MM-62004] update threads after a channel gets moved (#29624)

Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2025-02-07 16:20:13 +01:00
коммит произвёл GitHub
родитель 3aaa379687
Коммит a3f22bd349
8 изменённых файлов: 247 добавлений и 0 удалений

Просмотреть файл

@@ -721,6 +721,24 @@ func (_m *ThreadStore) UpdateMembership(membership *model.ThreadMembership) (*mo
return r0, r1
}
// UpdateTeamIdForChannelThreads provides a mock function with given fields: channelId, teamId
func (_m *ThreadStore) UpdateTeamIdForChannelThreads(channelId string, teamId string) error {
ret := _m.Called(channelId, teamId)
if len(ret) == 0 {
panic("no return value specified for UpdateTeamIdForChannelThreads")
}
var r0 error
if rf, ok := ret.Get(0).(func(string, string) error); ok {
r0 = rf(channelId, teamId)
} else {
r0 = ret.Error(0)
}
return r0
}
// NewThreadStore creates a new instance of ThreadStore. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewThreadStore(t interface {

Просмотреть файл

@@ -32,6 +32,7 @@ func TestThreadStore(t *testing.T, rctx request.CTX, ss store.Store, s SqlStore)
t.Run("DeleteMembershipsForChannel", func(t *testing.T) { testDeleteMembershipsForChannel(t, rctx, ss) })
t.Run("SaveMultipleMemberships", func(t *testing.T) { testSaveMultipleMemberships(t, ss) })
t.Run("MaintainMultipleFromImport", func(t *testing.T) { testMaintainMultipleFromImport(t, rctx, ss) })
t.Run("UpdateTeamIdForChannelThreads", func(t *testing.T) { testUpdateTeamIdForChannelThreads(t, rctx, ss) })
}
func testThreadStorePopulation(t *testing.T, rctx request.CTX, ss store.Store) {
@@ -2016,3 +2017,113 @@ func testMaintainMultipleFromImport(t *testing.T, rctx request.CTX, ss store.Sto
require.NoError(t, err)
})
}
func testUpdateTeamIdForChannelThreads(t *testing.T, rctx request.CTX, ss store.Store) {
createThreadMembership := func(userID, postID string, following bool) (*model.ThreadMembership, func()) {
t.Helper()
opts := store.ThreadMembershipOpts{
Following: following,
IncrementMentions: false,
UpdateFollowing: true,
UpdateViewedTimestamp: false,
UpdateParticipants: true,
}
mem, err := ss.Thread().MaintainMembership(userID, postID, opts)
require.NoError(t, err)
return mem, func() {
err := ss.Thread().DeleteMembershipForUser(userID, postID)
require.NoError(t, err)
}
}
postingUserID := model.NewId()
team1, err := ss.Team().Save(&model.Team{
DisplayName: "DisplayName",
Name: "team" + model.NewId(),
Email: MakeEmail(),
Type: model.TeamOpen,
})
require.NoError(t, err)
team2, err := ss.Team().Save(&model.Team{
DisplayName: "DisplayNameTwo",
Name: "team" + model.NewId(),
Email: MakeEmail(),
Type: model.TeamOpen,
})
require.NoError(t, err)
channel1, err := ss.Channel().Save(rctx, &model.Channel{
TeamId: team1.Id,
DisplayName: "DisplayName",
Name: "channel1" + model.NewId(),
Type: model.ChannelTypeOpen,
}, -1)
require.NoError(t, err)
rootPost1, err := ss.Post().Save(rctx, &model.Post{
ChannelId: channel1.Id,
UserId: postingUserID,
Message: model.NewRandomString(10),
})
require.NoError(t, err)
_, err = ss.Post().Save(rctx, &model.Post{
ChannelId: channel1.Id,
UserId: postingUserID,
Message: model.NewRandomString(10),
RootId: rootPost1.Id,
})
require.NoError(t, err)
t.Run("Should move threads to the new team", func(t *testing.T) {
userA, err := ss.User().Save(request.TestContext(t), &model.User{
Username: model.NewId(),
Email: MakeEmail(),
Password: model.NewId(),
})
require.NoError(t, err)
_, clean := createThreadMembership(userA.Id, rootPost1.Id, true)
defer clean()
err = ss.Thread().UpdateTeamIdForChannelThreads(channel1.Id, team2.Id)
require.NoError(t, err)
defer func() {
err = ss.Thread().UpdateTeamIdForChannelThreads(channel1.Id, team1.Id)
require.NoError(t, err)
}()
threads, err := ss.Thread().GetThreadsForUser(userA.Id, team2.Id, model.GetUserThreadsOpts{})
require.NoError(t, err)
require.Len(t, threads, 1)
})
t.Run("Should not move threads to a non existent team", func(t *testing.T) {
userA, err := ss.User().Save(request.TestContext(t), &model.User{
Username: model.NewId(),
Email: MakeEmail(),
Password: model.NewId(),
})
require.NoError(t, err)
newTeamID := model.NewId()
_, clean := createThreadMembership(userA.Id, rootPost1.Id, true)
t.Cleanup(clean)
err = ss.Thread().UpdateTeamIdForChannelThreads(channel1.Id, newTeamID)
require.NoError(t, err)
threads, err := ss.Thread().GetThreadsForUser(userA.Id, newTeamID, model.GetUserThreadsOpts{})
require.NoError(t, err)
require.Len(t, threads, 0)
threads, err = ss.Thread().GetThreadsForUser(userA.Id, team1.Id, model.GetUserThreadsOpts{})
require.NoError(t, err)
require.Len(t, threads, 1)
})
}