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:
Diffstat (limited to 'spec/workers/jira_connect')
-rw-r--r--spec/workers/jira_connect/sync_branch_worker_spec.rb33
-rw-r--r--spec/workers/jira_connect/sync_merge_request_worker_spec.rb33
-rw-r--r--spec/workers/jira_connect/sync_project_worker_spec.rb77
3 files changed, 139 insertions, 4 deletions
diff --git a/spec/workers/jira_connect/sync_branch_worker_spec.rb b/spec/workers/jira_connect/sync_branch_worker_spec.rb
index 2da3ea9d256..4aa2f89de7b 100644
--- a/spec/workers/jira_connect/sync_branch_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_branch_worker_spec.rb
@@ -4,7 +4,10 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncBranchWorker do
describe '#perform' do
- let_it_be(:project) { create(:project, :repository) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, group: group) }
+ let_it_be(:subscription) { create(:jira_connect_subscription, installation: create(:jira_connect_installation), namespace: group) }
+
let(:project_id) { project.id }
let(:branch_name) { 'master' }
let(:commit_shas) { %w(b83d6e3 5a62481) }
@@ -13,7 +16,7 @@ RSpec.describe JiraConnect::SyncBranchWorker do
def expect_jira_sync_service_execute(args)
expect_next_instance_of(JiraConnect::SyncService) do |instance|
- expect(instance).to receive(:execute).with(args)
+ expect(instance).to receive(:execute).with(args.merge(update_sequence_id: nil))
end
end
@@ -61,5 +64,31 @@ RSpec.describe JiraConnect::SyncBranchWorker do
subject
end
end
+
+ context 'with update_sequence_id' do
+ let(:update_sequence_id) { 1 }
+ let(:request_url) { 'https://sample.atlassian.net/rest/devinfo/0.10/bulk' }
+ let(:request_body) do
+ {
+ repositories: [
+ Atlassian::JiraConnect::Serializers::RepositoryEntity.represent(
+ project,
+ commits: project.commits_by(oids: commit_shas),
+ branches: [project.repository.find_branch(branch_name)],
+ update_sequence_id: update_sequence_id
+ )
+ ]
+ }.to_json
+ end
+
+ subject { described_class.new.perform(project_id, branch_name, commit_shas, update_sequence_id) }
+
+ it 'sends the reqeust with custom update_sequence_id' do
+ expect(Atlassian::JiraConnect::Client).to receive(:post)
+ .with(URI(request_url), headers: anything, body: request_body)
+
+ subject
+ end
+ end
end
end
diff --git a/spec/workers/jira_connect/sync_merge_request_worker_spec.rb b/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
index 764201e750a..b3c0db4f260 100644
--- a/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
+++ b/spec/workers/jira_connect/sync_merge_request_worker_spec.rb
@@ -4,14 +4,18 @@ require 'spec_helper'
RSpec.describe JiraConnect::SyncMergeRequestWorker do
describe '#perform' do
- let(:merge_request) { create(:merge_request) }
+ let_it_be(:group) { create(:group) }
+ let_it_be(:project) { create(:project, :repository, group: group) }
+ let_it_be(:subscription) { create(:jira_connect_subscription, installation: create(:jira_connect_installation), namespace: group) }
+ let_it_be(:merge_request) { create(:merge_request, source_project: project) }
+
let(:merge_request_id) { merge_request.id }
subject { described_class.new.perform(merge_request_id) }
it 'calls JiraConnect::SyncService#execute' do
expect_next_instance_of(JiraConnect::SyncService) do |service|
- expect(service).to receive(:execute).with(merge_requests: [merge_request])
+ expect(service).to receive(:execute).with(merge_requests: [merge_request], update_sequence_id: nil)
end
subject
@@ -26,5 +30,30 @@ RSpec.describe JiraConnect::SyncMergeRequestWorker do
subject
end
end
+
+ context 'with update_sequence_id' do
+ let(:update_sequence_id) { 1 }
+ let(:request_url) { 'https://sample.atlassian.net/rest/devinfo/0.10/bulk' }
+ let(:request_body) do
+ {
+ repositories: [
+ Atlassian::JiraConnect::Serializers::RepositoryEntity.represent(
+ project,
+ merge_requests: [merge_request],
+ update_sequence_id: update_sequence_id
+ )
+ ]
+ }.to_json
+ end
+
+ subject { described_class.new.perform(merge_request_id, update_sequence_id) }
+
+ it 'sends the request with custom update_sequence_id' do
+ expect(Atlassian::JiraConnect::Client).to receive(:post)
+ .with(URI(request_url), headers: anything, body: request_body)
+
+ subject
+ end
+ end
end
end
diff --git a/spec/workers/jira_connect/sync_project_worker_spec.rb b/spec/workers/jira_connect/sync_project_worker_spec.rb
new file mode 100644
index 00000000000..25210de828c
--- /dev/null
+++ b/spec/workers/jira_connect/sync_project_worker_spec.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe JiraConnect::SyncProjectWorker, factory_default: :keep do
+ describe '#perform' do
+ let_it_be(:project) { create_default(:project) }
+ let!(:mr_with_jira_title) { create(:merge_request, :unique_branches, title: 'TEST-123') }
+ let!(:mr_with_jira_description) { create(:merge_request, :unique_branches, description: 'TEST-323') }
+ let!(:mr_with_other_title) { create(:merge_request, :unique_branches) }
+ let!(:jira_subscription) { create(:jira_connect_subscription, namespace: project.namespace) }
+
+ let(:jira_connect_sync_service) { JiraConnect::SyncService.new(project) }
+ let(:job_args) { [project.id, update_sequence_id] }
+ let(:update_sequence_id) { 1 }
+
+ before do
+ stub_request(:post, 'https://sample.atlassian.net/rest/devinfo/0.10/bulk').to_return(status: 200, body: '', headers: {})
+
+ jira_connect_sync_service
+ allow(JiraConnect::SyncService).to receive(:new) { jira_connect_sync_service }
+ end
+
+ context 'when the project is not found' do
+ it 'does not raise an error' do
+ expect { described_class.new.perform('non_existing_record_id', update_sequence_id) }.not_to raise_error
+ end
+ end
+
+ it 'avoids N+1 database queries' do
+ control_count = ActiveRecord::QueryRecorder.new { described_class.new.perform(project.id, update_sequence_id) }.count
+
+ create(:merge_request, :unique_branches, title: 'TEST-123')
+
+ expect { described_class.new.perform(project.id, update_sequence_id) }.not_to exceed_query_limit(control_count)
+ end
+
+ it_behaves_like 'an idempotent worker' do
+ let(:request_url) { 'https://sample.atlassian.net/rest/devinfo/0.10/bulk' }
+ let(:request_body) do
+ {
+ repositories: [
+ Atlassian::JiraConnect::Serializers::RepositoryEntity.represent(
+ project,
+ merge_requests: [mr_with_jira_description, mr_with_jira_title],
+ update_sequence_id: update_sequence_id
+ )
+ ]
+ }.to_json
+ end
+
+ it 'sends the request with custom update_sequence_id' do
+ expect(Atlassian::JiraConnect::Client).to receive(:post)
+ .exactly(IdempotentWorkerHelper::WORKER_EXEC_TIMES).times
+ .with(URI(request_url), headers: anything, body: request_body)
+
+ subject
+ end
+
+ context 'when the number of merge requests to sync is higher than the limit' do
+ let!(:most_recent_merge_request) { create(:merge_request, :unique_branches, description: 'TEST-323', title: 'TEST-123') }
+
+ before do
+ stub_const("#{described_class}::MERGE_REQUEST_LIMIT", 1)
+ end
+
+ it 'syncs only the most recent merge requests within the limit' do
+ expect(jira_connect_sync_service).to receive(:execute)
+ .exactly(IdempotentWorkerHelper::WORKER_EXEC_TIMES).times
+ .with(merge_requests: [most_recent_merge_request], update_sequence_id: update_sequence_id)
+
+ subject
+ end
+ end
+ end
+ end
+end