improve user merge for user observer links

fixes FOO-1591
flag = none

test plan:
- have two users observing the same student
- remove user 1 as an observer
- merge user 2 into user 1
- it should work

Change-Id: Ic7cecc446e88a62916329d0411fa49d0787f89a1
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/258572
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Cody Cutrer <cody@instructure.com>
Product-Review: Cody Cutrer <cody@instructure.com>
QA-Review: Simon Williams <simon@instructure.com>
This commit is contained in:
Simon Williams 2021-02-10 15:39:57 -06:00
parent d97a457542
commit c7224cf89f
2 changed files with 10 additions and 1 deletions

View File

@ -410,6 +410,8 @@ class UserMerge
merge_data.build_more_data(observer_links, user: from_user, data: data)
Shard.partition_by_shard(observer_links) do |shard_observer_links|
# restore user observation links that are deleted on the target user but active on the from_user
UserObservationLink.where(observer_id: target_user, workflow_state: 'deleted', user_id: shard_observer_links.map(&:user_id)).update_all(workflow_state: 'active')
# delete links that are now duplicates between the from_user and target_user
UserObservationLink.where(id: shard_observer_links).where(user_id: target_user.as_observer_observation_links.select(:user_id)).destroy_all
# delete what would be observing themselves.

View File

@ -460,15 +460,22 @@ describe UserMerge do
it "should move and uniquify observed users" do
student1 = user_model
student2 = user_model
student3 = user_model
add_linked_observer(student1, user1)
add_linked_observer(student2, user1)
add_linked_observer(student3, user1)
add_linked_observer(student2, user2)
# make sure active link from user 1 comes over even if user 2 has
# a destroyed link
link = add_linked_observer(student3, user2)
link.destroy
UserMerge.from(user1).into(user2)
user1.reload
expect(user1.linked_students).to be_empty
user2.reload
expect(user2.linked_students.sort_by(&:id)).to eql [student1, student2]
expect(user2.linked_students.sort_by(&:id)).to eql [student1, student2, student3]
end
it "should move conversations to the new user" do