diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-20 11:43:02 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-10-20 11:43:02 +0300 |
commit | d9ab72d6080f594d0b3cae15f14b3ef2c6c638cb (patch) | |
tree | 2341ef426af70ad1e289c38036737e04b0aa5007 /spec/lib/gitlab/github_import | |
parent | d6e514dd13db8947884cd58fe2a9c2a063400a9b (diff) |
Add latest changes from gitlab-org/gitlab@14-4-stable-eev14.4.0-rc42
Diffstat (limited to 'spec/lib/gitlab/github_import')
11 files changed, 406 insertions, 37 deletions
diff --git a/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb b/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb index 46b9959ff64..be4fc3cbf16 100644 --- a/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer/diff_notes_importer_spec.rb @@ -15,10 +15,18 @@ RSpec.describe Gitlab::GithubImport::Importer::DiffNotesImporter do original_commit_id: 'original123abc', diff_hunk: "@@ -1 +1 @@\n-Hello\n+Hello world", user: double(:user, id: 4, login: 'alice'), - body: 'Hello world', created_at: Time.zone.now, updated_at: Time.zone.now, - id: 1 + line: 23, + start_line: nil, + id: 1, + body: <<~BODY + Hello World + + ```suggestion + sug1 + ``` + BODY ) end diff --git a/spec/lib/gitlab/github_import/parallel_importer_spec.rb b/spec/lib/gitlab/github_import/parallel_importer_spec.rb index 06304bf84ca..c7b300ff043 100644 --- a/spec/lib/gitlab/github_import/parallel_importer_spec.rb +++ b/spec/lib/gitlab/github_import/parallel_importer_spec.rb @@ -9,6 +9,18 @@ RSpec.describe Gitlab::GithubImport::ParallelImporter do end end + describe '.track_start_import' do + it 'tracks the start of import' do + project = double(:project) + metrics = double(:metrics) + + expect(Gitlab::Import::Metrics).to receive(:new).with(:github_importer, project).and_return(metrics) + expect(metrics).to receive(:track_start_import) + + described_class.track_start_import(project) + end + end + describe '#execute', :clean_gitlab_redis_shared_state do let(:project) { create(:project) } let(:importer) { described_class.new(project) } diff --git a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb index 1fc7d3c887f..f375e84e0fd 100644 --- a/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb +++ b/spec/lib/gitlab/github_import/parallel_scheduling_spec.rb @@ -130,7 +130,8 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do project_id: project.id, exception: exception, error_source: 'MyImporter', - fail_import: false + fail_import: false, + metrics: true ).and_call_original expect { importer.execute } @@ -195,7 +196,8 @@ RSpec.describe Gitlab::GithubImport::ParallelScheduling do project_id: project.id, exception: exception, error_source: 'MyImporter', - fail_import: true + fail_import: true, + metrics: true ).and_call_original expect { importer.execute } diff --git a/spec/lib/gitlab/github_import/representation/diff_note_spec.rb b/spec/lib/gitlab/github_import/representation/diff_note_spec.rb index 7c24cd0a5db..81722c0eba7 100644 --- a/spec/lib/gitlab/github_import/representation/diff_note_spec.rb +++ b/spec/lib/gitlab/github_import/representation/diff_note_spec.rb @@ -51,7 +51,7 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do end it 'includes the GitHub ID' do - expect(note.github_id).to eq(1) + expect(note.note_id).to eq(1) end it 'returns the noteable type' do @@ -73,6 +73,8 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do body: 'Hello world', created_at: created_at, updated_at: updated_at, + line: 23, + start_line: nil, id: 1 ) end @@ -90,47 +92,70 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do expect(note.author).to be_nil end - end - describe '.from_json_hash' do - it_behaves_like 'a DiffNote' do - let(:hash) do - { - 'noteable_type' => 'MergeRequest', - 'noteable_id' => 42, - 'file_path' => 'README.md', - 'commit_id' => '123abc', - 'original_commit_id' => 'original123abc', - 'diff_hunk' => hunk, - 'author' => { 'id' => 4, 'login' => 'alice' }, - 'note' => 'Hello world', - 'created_at' => created_at.to_s, - 'updated_at' => updated_at.to_s, - 'github_id' => 1 - } - end + it 'formats a suggestion in the note body' do + allow(response) + .to receive(:body) + .and_return <<~BODY + ```suggestion + Hello World + ``` + BODY - let(:note) { described_class.from_json_hash(hash) } + note = described_class.from_api_response(response) + + expect(note.note).to eq <<~BODY + ```suggestion:-0+0 + Hello World + ``` + BODY end + end - it 'does not convert the author if it was not specified' do - hash = { + describe '.from_json_hash' do + let(:hash) do + { 'noteable_type' => 'MergeRequest', 'noteable_id' => 42, 'file_path' => 'README.md', 'commit_id' => '123abc', 'original_commit_id' => 'original123abc', 'diff_hunk' => hunk, + 'author' => { 'id' => 4, 'login' => 'alice' }, 'note' => 'Hello world', 'created_at' => created_at.to_s, 'updated_at' => updated_at.to_s, - 'github_id' => 1 + 'note_id' => 1 } + end + + it_behaves_like 'a DiffNote' do + let(:note) { described_class.from_json_hash(hash) } + end + + it 'does not convert the author if it was not specified' do + hash.delete('author') note = described_class.from_json_hash(hash) expect(note.author).to be_nil end + + it 'formats a suggestion in the note body' do + hash['note'] = <<~BODY + ```suggestion + Hello World + ``` + BODY + + note = described_class.from_json_hash(hash) + + expect(note.note).to eq <<~BODY + ```suggestion:-0+0 + Hello World + ``` + BODY + end end describe '#line_code' do @@ -154,7 +179,7 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do 'note' => 'Hello world', 'created_at' => created_at.to_s, 'updated_at' => updated_at.to_s, - 'github_id' => 1 + 'note_id' => 1 ) expect(note.diff_hash).to eq( @@ -167,4 +192,68 @@ RSpec.describe Gitlab::GithubImport::Representation::DiffNote do ) end end + + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + noteable_id: 42, + noteable_type: 'MergeRequest', + note_id: 1 + } + other_attributes = { something_else: '_something_else_' } + note = described_class.new(github_identifiers.merge(other_attributes)) + + expect(note.github_identifiers).to eq(github_identifiers) + end + end + + describe '#note' do + it 'returns the given note' do + hash = { + 'note': 'simple text' + } + + note = described_class.new(hash) + + expect(note.note).to eq 'simple text' + end + + it 'returns the suggestion formatted in the note' do + hash = { + 'note': <<~BODY + ```suggestion + Hello World + ``` + BODY + } + + note = described_class.new(hash) + + expect(note.note).to eq <<~BODY + ```suggestion:-0+0 + Hello World + ``` + BODY + end + + it 'returns the multi-line suggestion formatted in the note' do + hash = { + 'start_line': 20, + 'end_line': 23, + 'note': <<~BODY + ```suggestion + Hello World + ``` + BODY + } + + note = described_class.new(hash) + + expect(note.note).to eq <<~BODY + ```suggestion:-3+0 + Hello World + ``` + BODY + end + end end diff --git a/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb b/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb new file mode 100644 index 00000000000..2ffd5f50d3b --- /dev/null +++ b/spec/lib/gitlab/github_import/representation/diff_notes/suggestion_formatter_spec.rb @@ -0,0 +1,164 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::GithubImport::Representation::DiffNotes::SuggestionFormatter do + it 'does nothing when there is any text before the suggestion tag' do + note = <<~BODY + looks like```suggestion but it isn't + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(note) + end + + it 'handles nil value for note' do + note = nil + + expect(described_class.formatted_note_for(note: note)).to eq(note) + end + + it 'does not allow over 3 leading spaces for valid suggestion' do + note = <<~BODY + Single-line suggestion + ```suggestion + sug1 + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(note) + end + + it 'allows up to 3 leading spaces' do + note = <<~BODY + Single-line suggestion + ```suggestion + sug1 + ``` + BODY + + expected = <<~BODY + Single-line suggestion + ```suggestion:-0+0 + sug1 + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(expected) + end + + it 'does nothing when there is any text without space after the suggestion tag' do + note = <<~BODY + ```suggestionbut it isn't + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(note) + end + + it 'formats single-line suggestions' do + note = <<~BODY + Single-line suggestion + ```suggestion + sug1 + ``` + BODY + + expected = <<~BODY + Single-line suggestion + ```suggestion:-0+0 + sug1 + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(expected) + end + + it 'ignores text after suggestion tag on the same line' do + note = <<~BODY + looks like + ```suggestion text to be ignored + suggestion + ``` + BODY + + expected = <<~BODY + looks like + ```suggestion:-0+0 + suggestion + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(expected) + end + + it 'formats multiple single-line suggestions' do + note = <<~BODY + Single-line suggestion + ```suggestion + sug1 + ``` + OR + ```suggestion + sug2 + ``` + BODY + + expected = <<~BODY + Single-line suggestion + ```suggestion:-0+0 + sug1 + ``` + OR + ```suggestion:-0+0 + sug2 + ``` + BODY + + expect(described_class.formatted_note_for(note: note)).to eq(expected) + end + + it 'formats multi-line suggestions' do + note = <<~BODY + Multi-line suggestion + ```suggestion + sug1 + ``` + BODY + + expected = <<~BODY + Multi-line suggestion + ```suggestion:-2+0 + sug1 + ``` + BODY + + expect(described_class.formatted_note_for(note: note, start_line: 6, end_line: 8)).to eq(expected) + end + + it 'formats multiple multi-line suggestions' do + note = <<~BODY + Multi-line suggestion + ```suggestion + sug1 + ``` + OR + ```suggestion + sug2 + ``` + BODY + + expected = <<~BODY + Multi-line suggestion + ```suggestion:-2+0 + sug1 + ``` + OR + ```suggestion:-2+0 + sug2 + ``` + BODY + + expect(described_class.formatted_note_for(note: note, start_line: 6, end_line: 8)).to eq(expected) + end +end diff --git a/spec/lib/gitlab/github_import/representation/issue_spec.rb b/spec/lib/gitlab/github_import/representation/issue_spec.rb index 3d306a4a3a3..f3052efea70 100644 --- a/spec/lib/gitlab/github_import/representation/issue_spec.rb +++ b/spec/lib/gitlab/github_import/representation/issue_spec.rb @@ -181,4 +181,17 @@ RSpec.describe Gitlab::GithubImport::Representation::Issue do expect(object.truncated_title).to eq('foo') end end + + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + iid: 42, + issuable_type: 'MergeRequest' + } + other_attributes = { pull_request: true, something_else: '_something_else_' } + issue = described_class.new(github_identifiers.merge(other_attributes)) + + expect(issue.github_identifiers).to eq(github_identifiers) + end + end end diff --git a/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb b/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb new file mode 100644 index 00000000000..b59ea513436 --- /dev/null +++ b/spec/lib/gitlab/github_import/representation/lfs_object_spec.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::GithubImport::Representation::LfsObject do + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + oid: 42 + } + other_attributes = { something_else: '_something_else_' } + lfs_object = described_class.new(github_identifiers.merge(other_attributes)) + + expect(lfs_object.github_identifiers).to eq(github_identifiers) + end + end +end diff --git a/spec/lib/gitlab/github_import/representation/note_spec.rb b/spec/lib/gitlab/github_import/representation/note_spec.rb index 112bb7eb908..97addcc1c98 100644 --- a/spec/lib/gitlab/github_import/representation/note_spec.rb +++ b/spec/lib/gitlab/github_import/representation/note_spec.rb @@ -40,8 +40,8 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do expect(note.updated_at).to eq(updated_at) end - it 'includes the GitHub ID' do - expect(note.github_id).to eq(1) + it 'includes the note ID' do + expect(note.note_id).to eq(1) end end end @@ -84,7 +84,7 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do 'note' => 'Hello world', 'created_at' => created_at.to_s, 'updated_at' => updated_at.to_s, - 'github_id' => 1 + 'note_id' => 1 } end @@ -98,7 +98,7 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do 'note' => 'Hello world', 'created_at' => created_at.to_s, 'updated_at' => updated_at.to_s, - 'github_id' => 1 + 'note_id' => 1 } note = described_class.from_json_hash(hash) @@ -106,4 +106,18 @@ RSpec.describe Gitlab::GithubImport::Representation::Note do expect(note.author).to be_nil end end + + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + noteable_id: 42, + noteable_type: 'Issue', + note_id: 1 + } + other_attributes = { something_else: '_something_else_' } + note = described_class.new(github_identifiers.merge(other_attributes)) + + expect(note.github_identifiers).to eq(github_identifiers) + end + end end diff --git a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb index cad9b13774e..f812fd85fbc 100644 --- a/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb +++ b/spec/lib/gitlab/github_import/representation/pull_request_review_spec.rb @@ -14,7 +14,7 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do expect(review.note).to eq('note') expect(review.review_type).to eq('APPROVED') expect(review.submitted_at).to eq(submitted_at) - expect(review.github_id).to eq(999) + expect(review.review_id).to eq(999) expect(review.merge_request_id).to eq(42) end end @@ -50,7 +50,7 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do describe '.from_json_hash' do let(:hash) do { - 'github_id' => 999, + 'review_id' => 999, 'merge_request_id' => 42, 'note' => 'note', 'review_type' => 'APPROVED', @@ -75,4 +75,17 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequestReview do expect(review.submitted_at).to be_nil end end + + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + review_id: 999, + merge_request_id: 42 + } + other_attributes = { something_else: '_something_else_' } + review = described_class.new(github_identifiers.merge(other_attributes)) + + expect(review.github_identifiers).to eq(github_identifiers) + end + end end diff --git a/spec/lib/gitlab/github_import/representation/pull_request_spec.rb b/spec/lib/gitlab/github_import/representation/pull_request_spec.rb index 27a82951b01..925dba5b5a7 100644 --- a/spec/lib/gitlab/github_import/representation/pull_request_spec.rb +++ b/spec/lib/gitlab/github_import/representation/pull_request_spec.rb @@ -288,4 +288,16 @@ RSpec.describe Gitlab::GithubImport::Representation::PullRequest do expect(object.truncated_title).to eq('foo') end end + + describe '#github_identifiers' do + it 'returns a hash with needed identifiers' do + github_identifiers = { + iid: 1 + } + other_attributes = { something_else: '_something_else_' } + pr = described_class.new(github_identifiers.merge(other_attributes)) + + expect(pr.github_identifiers).to eq(github_identifiers.merge(issuable_type: 'MergeRequest')) + end + end end diff --git a/spec/lib/gitlab/github_import/sequential_importer_spec.rb b/spec/lib/gitlab/github_import/sequential_importer_spec.rb index 3c3f8ff59d0..2b76f0e27c9 100644 --- a/spec/lib/gitlab/github_import/sequential_importer_spec.rb +++ b/spec/lib/gitlab/github_import/sequential_importer_spec.rb @@ -4,10 +4,17 @@ require 'spec_helper' RSpec.describe Gitlab::GithubImport::SequentialImporter do describe '#execute' do + let_it_be(:project) do + create(:project, import_url: 'http://t0ken@github.another-domain.com/repo-org/repo.git', import_type: 'github') + end + + subject(:importer) { described_class.new(project, token: 'foo') } + it 'imports a project in sequence' do - repository = double(:repository) - project = double(:project, id: 1, repository: repository, import_url: 'http://t0ken@github.another-domain.com/repo-org/repo.git', group: nil) - importer = described_class.new(project, token: 'foo') + expect_next_instance_of(Gitlab::Import::Metrics) do |instance| + expect(instance).to receive(:track_start_import) + expect(instance).to receive(:track_finished_import) + end expect_next_instance_of(Gitlab::GithubImport::Importer::RepositoryImporter) do |instance| expect(instance).to receive(:execute) @@ -35,5 +42,23 @@ RSpec.describe Gitlab::GithubImport::SequentialImporter do expect(importer.execute).to eq(true) end + + it 'raises an error' do + exception = StandardError.new('_some_error_') + + expect_next_instance_of(Gitlab::GithubImport::Importer::RepositoryImporter) do |importer| + expect(importer).to receive(:execute).and_raise(exception) + end + expect(Gitlab::Import::ImportFailureService).to receive(:track) + .with( + project_id: project.id, + exception: exception, + error_source: described_class.name, + fail_import: true, + metrics: true + ).and_call_original + + expect { importer.execute }.to raise_error(StandardError) + end end end |