diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb index 349ca26ec03c931224659133acd3034b5d2d0ddc..3a087a3ef83062c44773a21a872bd2275a5bdc58 100644 --- a/lib/gitlab/bitbucket_import/importer.rb +++ b/lib/gitlab/bitbucket_import/importer.rb @@ -182,7 +182,6 @@ def import_pull_requests target_branch_sha: target_branch_sha, state: pull_request.state, author_id: gitlab_user_id(project, pull_request.author), - assignee_id: nil, created_at: pull_request.created_at, updated_at: pull_request.updated_at ) diff --git a/lib/gitlab/bitbucket_server_import/importer.rb b/lib/gitlab/bitbucket_server_import/importer.rb index b7b2fe115c1fb0a9d5d7cd54d2c626fcbf719427..886fbaaff486e52dcfb6156366ea66db3013f5de 100644 --- a/lib/gitlab/bitbucket_server_import/importer.rb +++ b/lib/gitlab/bitbucket_server_import/importer.rb @@ -211,7 +211,6 @@ def import_bitbucket_pull_request(pull_request) target_branch_sha: pull_request.target_branch_sha, state_id: MergeRequest.available_states[pull_request.state], author_id: author_id, - assignee_id: nil, created_at: pull_request.created_at, updated_at: pull_request.updated_at } diff --git a/lib/gitlab/github_import/importer/pull_request_importer.rb b/lib/gitlab/github_import/importer/pull_request_importer.rb index 6d2aff63a4753b0be22cdd6ab7225c7554f88c9b..f09e0bd980633dde44fa8f88b3eed5267fddd20c 100644 --- a/lib/gitlab/github_import/importer/pull_request_importer.rb +++ b/lib/gitlab/github_import/importer/pull_request_importer.rb @@ -27,6 +27,7 @@ def execute mr, already_exists = create_merge_request if mr + set_merge_request_assignees(mr) insert_git_data(mr, already_exists) issuable_finder.cache_database_id(mr.id) end @@ -57,7 +58,6 @@ def create_merge_request state_id: ::MergeRequest.available_states[pull_request.state], milestone_id: milestone_finder.id_for(pull_request), author_id: author_id, - assignee_id: user_finder.assignee_id_for(pull_request), created_at: pull_request.created_at, updated_at: pull_request.updated_at } @@ -65,6 +65,10 @@ def create_merge_request create_merge_request_without_hooks(project, attributes, pull_request.iid) end + def set_merge_request_assignees(merge_request) + merge_request.assignee_ids = [user_finder.assignee_id_for(pull_request)] + end + def insert_git_data(merge_request, already_exists) insert_or_replace_git_data(merge_request, pull_request.source_branch_sha, pull_request.target_branch_sha, already_exists) # We need to create the branch after the merge request is diff --git a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb index 877b4d4bbafbaffcebf7d9dde986a92e141c635f..bffae9e2ba0e0ef43aca2de4b370910ebdc202b5 100644 --- a/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer/pull_request_importer_spec.rb @@ -49,6 +49,10 @@ .to receive(:create_merge_request) .and_return([mr, false]) + expect(importer) + .to receive(:set_merge_request_assignees) + .with(mr) + expect(importer) .to receive(:insert_git_data) .with(mr, false) @@ -75,11 +79,6 @@ .to receive(:author_id_for) .with(pull_request) .and_return([user.id, true]) - - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) end it 'imports the pull request with the pull request author as the merge request author' do @@ -97,7 +96,6 @@ state_id: 3, milestone_id: milestone.id, author_id: user.id, - assignee_id: user.id, created_at: created_at, updated_at: updated_at }, @@ -114,20 +112,72 @@ expect(mr).to be_instance_of(MergeRequest) expect(exists).to eq(false) end + + context 'when the source and target branch are identical' do + before do + allow(pull_request).to receive_messages( + source_repository_id: pull_request.target_repository_id, + source_branch: 'master' + ) + end + + it 'uses a generated source branch name for the merge request' do + expect(importer) + .to receive(:insert_and_return_id) + .with( + { + iid: 42, + title: 'My Pull Request', + description: 'This is my pull request', + source_project_id: project.id, + target_project_id: project.id, + source_branch: 'master-42', + target_branch: 'master', + state_id: 3, + milestone_id: milestone.id, + author_id: user.id, + created_at: created_at, + updated_at: updated_at + }, + project.merge_requests + ) + .and_call_original + + importer.create_merge_request + end + end + + context 'when the import fails due to a foreign key error' do + it 'does not raise any errors' do + expect(importer) + .to receive(:insert_and_return_id) + .and_raise(ActiveRecord::InvalidForeignKey, 'invalid foreign key') + + expect { importer.create_merge_request }.not_to raise_error + end + end + + context 'when the merge request already exists' do + it 'returns the existing merge request' do + mr1, exists1 = importer.create_merge_request + mr2, exists2 = importer.create_merge_request + + expect(mr2).to eq(mr1) + expect(exists1).to eq(false) + expect(exists2).to eq(true) + end + end end context 'when the author could not be found' do - it 'imports the pull request with the project creator as the merge request author' do + before do allow(importer.user_finder) .to receive(:author_id_for) .with(pull_request) .and_return([project.creator_id, false]) + end - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) - + it 'imports the pull request with the project creator as the merge request author' do expect(importer) .to receive(:insert_and_return_id) .with( @@ -142,7 +192,6 @@ state_id: 3, milestone_id: milestone.id, author_id: project.creator_id, - assignee_id: user.id, created_at: created_at, updated_at: updated_at }, @@ -153,93 +202,33 @@ importer.create_merge_request end end + end - context 'when the source and target branch are identical' do - it 'uses a generated source branch name for the merge request' do - allow(importer.user_finder) - .to receive(:author_id_for) - .with(pull_request) - .and_return([user.id, true]) - - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) - - allow(pull_request) - .to receive(:source_repository_id) - .and_return(pull_request.target_repository_id) - - allow(pull_request) - .to receive(:source_branch) - .and_return('master') + describe '#set_merge_request_assignees' do + let_it_be(:merge_request) { create(:merge_request) } - expect(importer) - .to receive(:insert_and_return_id) - .with( - { - iid: 42, - title: 'My Pull Request', - description: 'This is my pull request', - source_project_id: project.id, - target_project_id: project.id, - source_branch: 'master-42', - target_branch: 'master', - state_id: 3, - milestone_id: milestone.id, - author_id: user.id, - assignee_id: user.id, - created_at: created_at, - updated_at: updated_at - }, - project.merge_requests - ) - .and_call_original + before do + allow(importer.user_finder) + .to receive(:assignee_id_for) + .with(pull_request) + .and_return(user_id) - importer.create_merge_request - end + importer.set_merge_request_assignees(merge_request) end - context 'when the import fails due to a foreign key error' do - it 'does not raise any errors' do - allow(importer.user_finder) - .to receive(:author_id_for) - .with(pull_request) - .and_return([user.id, true]) - - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) - - expect(importer) - .to receive(:insert_and_return_id) - .and_raise(ActiveRecord::InvalidForeignKey, 'invalid foreign key') + context 'when pull request has an assignee' do + let(:user_id) { user.id } - expect { importer.create_merge_request }.not_to raise_error + it 'sets merge request assignees' do + expect(merge_request.assignee_ids).to eq [user.id] end end - context 'when the merge request already exists' do - before do - allow(importer.user_finder) - .to receive(:author_id_for) - .with(pull_request) - .and_return([user.id, true]) - - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) - end - - it 'returns the existing merge request' do - mr1, exists1 = importer.create_merge_request - mr2, exists2 = importer.create_merge_request + context 'when pull request does not have any assignees' do + let(:user_id) { nil } - expect(mr2).to eq(mr1) - expect(exists1).to eq(false) - expect(exists2).to eq(true) + it 'does not set merge request assignees' do + expect(merge_request.assignee_ids).to eq [] end end end @@ -255,11 +244,6 @@ .to receive(:author_id_for) .with(pull_request) .and_return([user.id, true]) - - allow(importer.user_finder) - .to receive(:assignee_id_for) - .with(pull_request) - .and_return(user.id) end it 'does not create the source branch if merge request is merged' do diff --git a/spec/lib/gitlab/import/merge_request_helpers_spec.rb b/spec/lib/gitlab/import/merge_request_helpers_spec.rb index 42515888d4ffc6a977519e221f8e0bd06ca5e6d5..2b16599415279c18239f4d652bba59a156ee3dd8 100644 --- a/spec/lib/gitlab/import/merge_request_helpers_spec.rb +++ b/spec/lib/gitlab/import/merge_request_helpers_spec.rb @@ -19,8 +19,7 @@ source_branch: 'master-42', target_branch: 'master', state_id: 3, - author_id: user.id, - assignee_id: user.id + author_id: user.id } end