320 lines
10 KiB
Ruby
320 lines
10 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
require 'spec_helper'
|
||
|
|
||
|
RSpec.describe Import::GithubFailureEntity, feature_category: :importers do
|
||
|
let(:project) { instance_double(Project, id: 123456, import_url: 'https://github.com/example/repo.git', import_source: 'example/repo') }
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::PullRequestImporter' }
|
||
|
let(:github_identifiers) { { 'iid' => 2, 'object_type' => 'pull_request', 'title' => 'Implement cool feature' } }
|
||
|
let(:import_failure) do
|
||
|
instance_double(
|
||
|
ImportFailure,
|
||
|
project: project,
|
||
|
exception_class: 'Some class',
|
||
|
exception_message: 'Something went wrong',
|
||
|
source: source,
|
||
|
correlation_id_value: '2ea9c4b8587b6df49f35a3fb703688aa',
|
||
|
external_identifiers: github_identifiers,
|
||
|
created_at: Time.current
|
||
|
)
|
||
|
end
|
||
|
|
||
|
let(:failure_details) do
|
||
|
{
|
||
|
exception_class: import_failure.exception_class,
|
||
|
exception_message: import_failure.exception_message,
|
||
|
correlation_id_value: import_failure.correlation_id_value,
|
||
|
source: import_failure.source,
|
||
|
github_identifiers: github_identifiers,
|
||
|
created_at: import_failure.created_at
|
||
|
}
|
||
|
end
|
||
|
|
||
|
subject(:entity) { described_class.new(import_failure).as_json.with_indifferent_access }
|
||
|
|
||
|
shared_examples 'import failure entity' do
|
||
|
it 'exposes required fields for import entity' do
|
||
|
expect(entity).to eq(
|
||
|
{
|
||
|
type: import_failure.external_identifiers['object_type'],
|
||
|
title: title,
|
||
|
provider_url: provider_url,
|
||
|
details: failure_details
|
||
|
}.with_indifferent_access
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
it 'exposes correct attributes' do
|
||
|
expect(entity.keys).to match_array(%w[type title provider_url details])
|
||
|
end
|
||
|
|
||
|
context 'with `pull_request` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:title) { 'Implement cool feature' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2' }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `pull_request_merged_by` failure' do
|
||
|
before do
|
||
|
import_failure.external_identifiers.merge!({ 'object_type' => 'pull_request_merged_by' })
|
||
|
end
|
||
|
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::PullRequests::MergedByImporter' }
|
||
|
let(:title) { 'Pull request 2 merger' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2' }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `pull_request_review_request` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::PullRequests::ReviewRequestImporter' }
|
||
|
let(:title) { 'Pull request 2 review request' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'merge_request_iid' => 2,
|
||
|
'requested_reviewers' => %w[alice bob],
|
||
|
'object_type' => 'pull_request_review_request'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `pull_request_review` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::PullRequests::ReviewImporter' }
|
||
|
let(:title) { 'Pull request review 123456' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2#pullrequestreview-123456' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'merge_request_iid' => 2,
|
||
|
'review_id' => 123456,
|
||
|
'object_type' => 'pull_request_review'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `issue` failure' do
|
||
|
before do
|
||
|
import_failure.external_identifiers.merge!({ 'object_type' => 'issue' })
|
||
|
end
|
||
|
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::IssueAndLabelLinksImporter' }
|
||
|
let(:title) { 'Implement cool feature' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/issues/2' }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `collaborator` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::CollaboratorImporter' }
|
||
|
let(:title) { 'alice' }
|
||
|
let(:provider_url) { 'https://github.com/alice' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'id' => 123456,
|
||
|
'login' => 'alice',
|
||
|
'object_type' => 'collaborator'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `protected_branch` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::ProtectedBranchImporter' }
|
||
|
let(:title) { 'main' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/tree/main' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'id' => 'main',
|
||
|
'object_type' => 'protected_branch'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `issue_event` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::IssueEventImporter' }
|
||
|
let(:title) { 'closed' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/issues/2#event-123456' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'id' => 123456,
|
||
|
'issuable_iid' => 2,
|
||
|
'event' => 'closed',
|
||
|
'object_type' => 'issue_event'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `label` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::LabelsImporter' }
|
||
|
let(:title) { 'bug' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/labels/bug' }
|
||
|
let(:github_identifiers) { { 'title' => 'bug', 'object_type' => 'label' } }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `milestone` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::MilestonesImporter' }
|
||
|
let(:title) { '1 release' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/milestone/1' }
|
||
|
let(:github_identifiers) { { 'iid' => 1, 'title' => '1 release', 'object_type' => 'milestone' } }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `release` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::ReleasesImporter' }
|
||
|
let(:title) { 'v1.0' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/releases/tag/v1.0' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'tag' => 'v1.0',
|
||
|
'object_type' => 'release'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `note` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NoteImporter' }
|
||
|
let(:title) { 'MergeRequest comment 123456' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/issues/2#issuecomment-123456' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'note_id' => 123456,
|
||
|
'noteable_iid' => 2,
|
||
|
'noteable_type' => 'MergeRequest',
|
||
|
'object_type' => 'note'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `diff_note` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::DiffNoteImporter' }
|
||
|
let(:title) { 'Pull request review comment 123456' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2#discussion_r123456' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'note_id' => 123456,
|
||
|
'noteable_iid' => 2,
|
||
|
'noteable_type' => 'MergeRequest',
|
||
|
'object_type' => 'diff_note'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `issue_attachment` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NoteAttachmentsImporter' }
|
||
|
let(:title) { 'Issue 2 attachment' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/issues/2' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'db_id' => 123456,
|
||
|
'noteable_iid' => 2,
|
||
|
'object_type' => 'issue_attachment'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `merge_request_attachment` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NoteAttachmentsImporter' }
|
||
|
let(:title) { 'Merge request 2 attachment' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/pull/2' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'db_id' => 123456,
|
||
|
'noteable_iid' => 2,
|
||
|
'object_type' => 'merge_request_attachment'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `release_attachment` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NoteAttachmentsImporter' }
|
||
|
let(:title) { 'Release v1.0 attachment' }
|
||
|
let(:provider_url) { 'https://github.com/example/repo/releases/tag/v1.0' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'db_id' => 123456,
|
||
|
'tag' => 'v1.0',
|
||
|
'object_type' => 'release_attachment'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `note_attachment` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NoteAttachmentsImporter' }
|
||
|
let(:title) { 'Note attachment' }
|
||
|
let(:provider_url) { '' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'db_id' => 123456,
|
||
|
'noteable_type' => 'Issue',
|
||
|
'object_type' => 'note_attachment'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with `lfs_object` failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::LfsObjectImporter' }
|
||
|
let(:title) { '42' }
|
||
|
let(:provider_url) { '' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'oid' => 42,
|
||
|
'size' => 123456,
|
||
|
'object_type' => 'lfs_object'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with unknown failure' do
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:source) { 'Gitlab::GithubImport::Importer::NewObjectTypeImporter' }
|
||
|
let(:title) { '' }
|
||
|
let(:provider_url) { '' }
|
||
|
let(:github_identifiers) do
|
||
|
{
|
||
|
'id' => 123456,
|
||
|
'object_type' => 'new_object_type'
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with an invalid import_url' do
|
||
|
let(:project) { instance_double(Project, id: 123456, import_url: 'Invalid url', import_source: 'example/repo') }
|
||
|
|
||
|
it_behaves_like 'import failure entity' do
|
||
|
let(:title) { 'Implement cool feature' }
|
||
|
let(:provider_url) { '' }
|
||
|
end
|
||
|
end
|
||
|
end
|