Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-26 15:07:48 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-26 15:07:48 +0300
commitef31adeb0fb9a02b2c6a4529ec4e38d7082a4b2b (patch)
treef0ee2b8bdffd7f91ad0b31388562c90825179585 /spec/lib/gitlab/jira_import
parent7e019504f5ac6decde690565857238e7e59aa034 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib/gitlab/jira_import')
-rw-r--r--spec/lib/gitlab/jira_import/base_importer_spec.rb89
-rw-r--r--spec/lib/gitlab/jira_import/issues_importer_spec.rb110
2 files changed, 199 insertions, 0 deletions
diff --git a/spec/lib/gitlab/jira_import/base_importer_spec.rb b/spec/lib/gitlab/jira_import/base_importer_spec.rb
new file mode 100644
index 00000000000..8bc43feb356
--- /dev/null
+++ b/spec/lib/gitlab/jira_import/base_importer_spec.rb
@@ -0,0 +1,89 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::JiraImport::BaseImporter do
+ let(:project) { create(:project) }
+
+ describe 'with any inheriting class' do
+ context 'when feature flag disabled' do
+ before do
+ stub_feature_flags(jira_issue_import: false)
+ end
+
+ it 'raises exception' do
+ expect { described_class.new(project) }.to raise_error(Projects::ImportService::Error, 'Jira import feature is disabled.')
+ end
+ end
+
+ context 'when feature flag enabled' do
+ before do
+ stub_feature_flags(jira_issue_import: true)
+ end
+
+ context 'when Jira service was not setup' do
+ it 'raises exception' do
+ expect { described_class.new(project) }.to raise_error(Projects::ImportService::Error, 'Jira integration not configured.')
+ end
+ end
+
+ context 'when Jira service exists' do
+ let!(:jira_service) { create(:jira_service, project: project) }
+
+ context 'when Jira import data is not present' do
+ it 'raises exception' do
+ expect { described_class.new(project) }.to raise_error(Projects::ImportService::Error, 'Unable to find Jira project to import data from.')
+ end
+ end
+
+ context 'when import data exists' do
+ let(:jira_import_data) do
+ data = JiraImportData.new
+ data << JiraImportData::JiraProjectDetails.new('xx', Time.now.strftime('%Y-%m-%d %H:%M:%S'), { user_id: 1, name: 'root' })
+ data
+ end
+ let(:project) { create(:project, import_data: jira_import_data) }
+ let(:subject) { described_class.new(project) }
+
+ context 'when #imported_items_cache_key is not implemented' do
+ it { expect { subject.send(:imported_items_cache_key) }.to raise_error(NotImplementedError) }
+ end
+
+ context 'when #imported_items_cache_key is implemented' do
+ before do
+ allow(subject).to receive(:imported_items_cache_key).and_return('dumb-importer-key')
+ end
+
+ describe '#imported_items_cache_key' do
+ it { expect(subject.send(:imported_items_cache_key)).to eq('dumb-importer-key') }
+ end
+
+ describe '#mark_as_imported', :clean_gitlab_redis_cache do
+ it 'stores id in redis cache' do
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_add).once.and_call_original
+
+ subject.send(:mark_as_imported, 'some-id')
+
+ expect(Gitlab::Cache::Import::Caching.set_includes?(subject.send(:imported_items_cache_key), 'some-id')).to be true
+ end
+ end
+
+ describe '#already_imported?', :clean_gitlab_redis_cache do
+ it 'returns false if value is not in cache' do
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_includes?).once.and_call_original
+
+ expect(subject.send(:already_imported?, 'some-id')).to be false
+ end
+
+ it 'returns true if value already stored in cache' do
+ Gitlab::Cache::Import::Caching.set_add(subject.send(:imported_items_cache_key), 'some-id')
+
+ expect(subject.send(:already_imported?, 'some-id')).to be true
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/lib/gitlab/jira_import/issues_importer_spec.rb b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
new file mode 100644
index 00000000000..88e8b195dbe
--- /dev/null
+++ b/spec/lib/gitlab/jira_import/issues_importer_spec.rb
@@ -0,0 +1,110 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe Gitlab::JiraImport::IssuesImporter do
+ let(:user) { create(:user) }
+ let(:jira_import_data) do
+ data = JiraImportData.new
+ data << JiraImportData::JiraProjectDetails.new('XX', Time.now.strftime('%Y-%m-%d %H:%M:%S'), { user_id: user.id, name: user.name })
+ data
+ end
+ let(:project) { create(:project, import_data: jira_import_data) }
+ let!(:jira_service) { create(:jira_service, project: project) }
+
+ subject { described_class.new(project) }
+
+ before do
+ stub_feature_flags(jira_issue_import: true)
+ end
+
+ describe '#imported_items_cache_key' do
+ it_behaves_like 'raise exception if not implemented'
+ it { expect(subject.imported_items_cache_key).to eq("jira-importer/already-imported/#{project.id}/issues") }
+ end
+
+ describe '#execute', :clean_gitlab_redis_cache do
+ context 'when no returned issues' do
+ it 'does not schedule any import jobs' do
+ expect(subject).to receive(:fetch_issues).with(0).and_return([])
+ expect(subject).not_to receive(:already_imported?)
+ expect(subject).not_to receive(:mark_as_imported)
+ expect(Gitlab::JiraImport::ImportIssueWorker).not_to receive(:perform_async)
+
+ job_waiter = subject.execute
+
+ expect(job_waiter.jobs_remaining).to eq(0)
+ expect(Gitlab::JiraImport.get_issues_next_start_at(project.id)).to eq(-1)
+ end
+ end
+
+ context 'with results returned' do
+ JiraIssue = Struct.new(:id)
+ let_it_be(:jira_issue1) { JiraIssue.new(1) }
+ let_it_be(:jira_issue2) { JiraIssue.new(2) }
+
+ context 'when single page of results is returned' do
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 3)
+ end
+
+ it 'schedules 2 import jobs' do
+ expect(subject).to receive(:fetch_issues).and_return([jira_issue1, jira_issue2])
+ expect(Gitlab::JiraImport::ImportIssueWorker).to receive(:perform_async).twice
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_add).twice.and_call_original
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_includes?).twice.and_call_original
+ allow_next_instance_of(Gitlab::JiraImport::IssueSerializer) do |instance|
+ allow(instance).to receive(:execute).and_return({ key: 'data' })
+ end
+
+ job_waiter = subject.execute
+
+ expect(job_waiter.jobs_remaining).to eq(2)
+ expect(Gitlab::JiraImport.get_issues_next_start_at(project.id)).to eq(2)
+ end
+ end
+
+ context 'when there is more than one page of results' do
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'schedules 3 import jobs' do
+ expect(subject).to receive(:fetch_issues).with(0).and_return([jira_issue1, jira_issue2])
+ expect(Gitlab::JiraImport::ImportIssueWorker).to receive(:perform_async).twice.times
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_add).twice.times.and_call_original
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_includes?).twice.times.and_call_original
+ allow_next_instance_of(Gitlab::JiraImport::IssueSerializer) do |instance|
+ allow(instance).to receive(:execute).and_return({ key: 'data' })
+ end
+
+ job_waiter = subject.execute
+
+ expect(job_waiter.jobs_remaining).to eq(2)
+ expect(Gitlab::JiraImport.get_issues_next_start_at(project.id)).to eq(2)
+ end
+ end
+
+ context 'when duplicate results are returned' do
+ before do
+ stub_const("#{described_class.name}::BATCH_SIZE", 2)
+ end
+
+ it 'schedules 2 import jobs' do
+ expect(subject).to receive(:fetch_issues).with(0).and_return([jira_issue1, jira_issue1])
+ expect(Gitlab::JiraImport::ImportIssueWorker).to receive(:perform_async).once
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_add).once.and_call_original
+ expect(Gitlab::Cache::Import::Caching).to receive(:set_includes?).twice.times.and_call_original
+ allow_next_instance_of(Gitlab::JiraImport::IssueSerializer) do |instance|
+ allow(instance).to receive(:execute).and_return({ key: 'data' })
+ end
+
+ job_waiter = subject.execute
+
+ expect(job_waiter.jobs_remaining).to eq(1)
+ expect(Gitlab::JiraImport.get_issues_next_start_at(project.id)).to eq(2)
+ end
+ end
+ end
+ end
+end