[MM-63504] When changing a channel to group synced, it doesn't always clear members (#30526)
* fix issue with channel and team membership after group constraints are enabled
Этот коммит содержится в:
@@ -831,6 +831,168 @@ func TestUnlinkGroupChannel(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
CheckBadRequestStatus(t, response)
|
||||
})
|
||||
|
||||
t.Run("Unlinking a group in a group constrained channel causes group members to be removed", func(t *testing.T) {
|
||||
// Create a test group
|
||||
group := th.CreateGroup()
|
||||
|
||||
// Create a channel and set it as group-constrained
|
||||
channel := th.CreatePrivateChannel()
|
||||
|
||||
// Create a group user
|
||||
groupUser := th.CreateUser()
|
||||
th.LinkUserToTeam(groupUser, th.BasicTeam)
|
||||
|
||||
// Create a group member
|
||||
_, appErr := th.App.UpsertGroupMember(group.Id, groupUser.Id)
|
||||
require.Nil(t, appErr)
|
||||
|
||||
// Associate the group with the channel
|
||||
autoAdd := true
|
||||
schemeAdmin := true
|
||||
_, r, err := th.SystemAdminClient.LinkGroupSyncable(context.Background(), group.Id, channel.Id, model.GroupSyncableTypeChannel, &model.GroupSyncablePatch{AutoAdd: &autoAdd, SchemeAdmin: &schemeAdmin})
|
||||
require.NoError(t, err)
|
||||
CheckCreatedStatus(t, r)
|
||||
|
||||
// Wait for the user to be added to the channel by polling until you see them
|
||||
// or until we hit the timeout
|
||||
timeout := time.After(5 * time.Second)
|
||||
ticker := time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
var cm *model.ChannelMember
|
||||
userFound := false
|
||||
for !userFound {
|
||||
select {
|
||||
case <-timeout:
|
||||
require.Fail(t, "Timed out waiting for user to be added to the channel")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// Check if the user is now a member
|
||||
cm, _, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
if err == nil && cm.UserId == groupUser.Id {
|
||||
// User has been added, we can continue the test
|
||||
userFound = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
patch := &model.ChannelPatch{}
|
||||
patch.GroupConstrained = model.NewPointer(true)
|
||||
_, r, err = th.SystemAdminClient.PatchChannel(context.Background(), channel.Id, patch)
|
||||
require.NoError(t, err)
|
||||
CheckOKStatus(t, r)
|
||||
|
||||
// Unlink the group
|
||||
r, err = th.SystemAdminClient.UnlinkGroupSyncable(context.Background(), group.Id, channel.Id, model.GroupSyncableTypeChannel)
|
||||
require.NoError(t, err)
|
||||
CheckOKStatus(t, r)
|
||||
|
||||
// Wait for the user to be removed from the channel by polling until they're gone
|
||||
// or until we hit the timeout
|
||||
timeout = time.After(3 * time.Second)
|
||||
ticker = time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
userRemoved := false
|
||||
for !userRemoved {
|
||||
select {
|
||||
case <-timeout:
|
||||
require.Fail(t, "Timed out waiting for user to be removed from channel")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// Check if the user is still a member
|
||||
_, r, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
if err != nil && r.StatusCode == http.StatusNotFound {
|
||||
// User has been removed, we can continue the test
|
||||
userRemoved = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Verify the user is no longer a member of the channel
|
||||
_, r, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
require.Error(t, err)
|
||||
CheckNotFoundStatus(t, r)
|
||||
})
|
||||
|
||||
t.Run("Unlinking a group in a non group constrained channel does not remove group members from the channel", func(t *testing.T) {
|
||||
// Create a test group
|
||||
group := th.CreateGroup()
|
||||
|
||||
// Create a channel and set it as group-constrained
|
||||
channel := th.CreatePrivateChannel()
|
||||
|
||||
// Create a group user
|
||||
groupUser := th.CreateUser()
|
||||
th.LinkUserToTeam(groupUser, th.BasicTeam)
|
||||
|
||||
// Create a group member
|
||||
_, appErr := th.App.UpsertGroupMember(group.Id, groupUser.Id)
|
||||
require.Nil(t, appErr)
|
||||
|
||||
// Associate the group with the channel
|
||||
autoAdd := true
|
||||
schemeAdmin := true
|
||||
_, r, err := th.SystemAdminClient.LinkGroupSyncable(context.Background(), group.Id, channel.Id, model.GroupSyncableTypeChannel, &model.GroupSyncablePatch{AutoAdd: &autoAdd, SchemeAdmin: &schemeAdmin})
|
||||
require.NoError(t, err)
|
||||
CheckCreatedStatus(t, r)
|
||||
|
||||
// Wait for the user to be added to the channel by polling until you see them
|
||||
// or until we hit the timeout
|
||||
timeout := time.After(5 * time.Second)
|
||||
ticker := time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
var cm *model.ChannelMember
|
||||
userFound := false
|
||||
for !userFound {
|
||||
select {
|
||||
case <-timeout:
|
||||
require.Fail(t, "Timed out waiting for user to be added to the channel")
|
||||
return
|
||||
case <-ticker.C:
|
||||
// Check if the user is now a member
|
||||
cm, _, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
if err == nil && cm.UserId == groupUser.Id {
|
||||
// User has been added, we can continue the test
|
||||
userFound = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Unlink the group
|
||||
r, err = th.SystemAdminClient.UnlinkGroupSyncable(context.Background(), group.Id, channel.Id, model.GroupSyncableTypeChannel)
|
||||
require.NoError(t, err)
|
||||
CheckOKStatus(t, r)
|
||||
|
||||
// Wait for a reasonable amount of time to ensure the user is not removed because the channel is not group constrained
|
||||
timeout = time.After(2 * time.Second)
|
||||
ticker = time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
userStillPresent := true
|
||||
for userStillPresent {
|
||||
select {
|
||||
case <-timeout:
|
||||
// If we reach the timeout, the user is still present, which is what we want
|
||||
// Verify the user is still a member of the channel
|
||||
cm, r, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
require.NoError(t, err)
|
||||
CheckOKStatus(t, r)
|
||||
require.Equal(t, groupUser.Id, cm.UserId)
|
||||
return
|
||||
case <-ticker.C:
|
||||
// Check if the user is still a member
|
||||
_, r, err = th.SystemAdminClient.GetChannelMember(context.Background(), channel.Id, groupUser.Id, "")
|
||||
if err != nil && r.StatusCode == http.StatusNotFound {
|
||||
// User has been removed, which is not what we want
|
||||
require.Fail(t, "User was incorrectly removed from the channel")
|
||||
userStillPresent = false
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetGroupTeam(t *testing.T) {
|
||||
|
||||
Ссылка в новой задаче
Block a user