diff options
Diffstat (limited to 'spec/lib/atlassian')
4 files changed, 114 insertions, 4 deletions
diff --git a/spec/lib/atlassian/jira_connect/client_spec.rb b/spec/lib/atlassian/jira_connect/client_spec.rb index 40ffec21b26..cefd1fa3274 100644 --- a/spec/lib/atlassian/jira_connect/client_spec.rb +++ b/spec/lib/atlassian/jira_connect/client_spec.rb @@ -11,9 +11,20 @@ RSpec.describe Atlassian::JiraConnect::Client do Timecop.freeze { example.run } end + describe '.generate_update_sequence_id' do + it 'returns monotonic_time converted it to integer' do + allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(1.0) + + expect(described_class.generate_update_sequence_id).to eq(1) + end + end + describe '#store_dev_info' do - it "calls the API with auth headers" do - expected_jwt = Atlassian::Jwt.encode( + let_it_be(:project) { create_default(:project, :repository) } + let_it_be(:merge_requests) { create_list(:merge_request, 2, :unique_branches) } + + let(:expected_jwt) do + Atlassian::Jwt.encode( Atlassian::Jwt.build_claims( Atlassian::JiraConnect.app_key, '/rest/devinfo/0.10/bulk', @@ -21,7 +32,9 @@ RSpec.describe Atlassian::JiraConnect::Client do ), 'sample_secret' ) + end + before do stub_full_request('https://gitlab-test.atlassian.net/rest/devinfo/0.10/bulk', method: :post) .with( headers: { @@ -29,8 +42,18 @@ RSpec.describe Atlassian::JiraConnect::Client do 'Content-Type' => 'application/json' } ) + end + + it "calls the API with auth headers" do + subject.store_dev_info(project: project) + end + + it 'avoids N+1 database queries' do + control_count = ActiveRecord::QueryRecorder.new { subject.store_dev_info(project: project, merge_requests: merge_requests) }.count + + merge_requests << create(:merge_request, :unique_branches) - subject.store_dev_info(project: create(:project)) + expect { subject.store_dev_info(project: project, merge_requests: merge_requests) }.not_to exceed_query_limit(control_count) end end end diff --git a/spec/lib/atlassian/jira_connect/serializers/base_entity_spec.rb b/spec/lib/atlassian/jira_connect/serializers/base_entity_spec.rb new file mode 100644 index 00000000000..d7672c0baf1 --- /dev/null +++ b/spec/lib/atlassian/jira_connect/serializers/base_entity_spec.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Atlassian::JiraConnect::Serializers::BaseEntity do + let(:update_sequence_id) { nil } + + subject do + described_class.represent( + anything, + update_sequence_id: update_sequence_id + ) + end + + it 'generates the update_sequence_id' do + allow(Atlassian::JiraConnect::Client).to receive(:generate_update_sequence_id).and_return(1) + + expect(subject.value_for(:updateSequenceId)).to eq(1) + end + + context 'with update_sequence_id option' do + let(:update_sequence_id) { 123 } + + it 'uses the custom update_sequence_id' do + expect(subject.value_for(:updateSequenceId)).to eq(123) + end + end +end diff --git a/spec/lib/atlassian/jira_connect/serializers/pull_request_entity_spec.rb b/spec/lib/atlassian/jira_connect/serializers/pull_request_entity_spec.rb new file mode 100644 index 00000000000..872ba1ab43d --- /dev/null +++ b/spec/lib/atlassian/jira_connect/serializers/pull_request_entity_spec.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Atlassian::JiraConnect::Serializers::PullRequestEntity do + let_it_be(:project) { create_default(:project, :repository) } + let_it_be(:merge_requests) { create_list(:merge_request, 2, :unique_branches) } + let_it_be(:notes) { create_list(:note, 2, system: false, noteable: merge_requests.first) } + + subject { described_class.represent(merge_requests).as_json } + + it 'exposes commentCount' do + expect(subject.first[:commentCount]).to eq(2) + end + + context 'with user_notes_count option' do + let(:user_notes_count) { merge_requests.map { |merge_request| [merge_request.id, 1] }.to_h } + + subject { described_class.represent(merge_requests, user_notes_count: user_notes_count).as_json } + + it 'avoids N+1 database queries' do + control_count = ActiveRecord::QueryRecorder.new do + described_class.represent(merge_requests, user_notes_count: user_notes_count) + end.count + + merge_requests << create(:merge_request, :unique_branches) + + expect { subject }.not_to exceed_query_limit(control_count) + end + + it 'uses counts from user_notes_count' do + expect(subject.map { |entity| entity[:commentCount] }).to match_array([1, 1, 1]) + end + + context 'when count is missing for some MRs' do + let(:user_notes_count) { [[merge_requests.last.id, 1]].to_h } + + it 'uses 0 as default when count for the MR is not available' do + expect(subject.map { |entity| entity[:commentCount] }).to match_array([0, 0, 1]) + end + end + end +end diff --git a/spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb b/spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb index 23ba1770827..9100398ecc5 100644 --- a/spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb +++ b/spec/lib/atlassian/jira_connect/serializers/repository_entity_spec.rb @@ -3,6 +3,8 @@ require 'spec_helper' RSpec.describe Atlassian::JiraConnect::Serializers::RepositoryEntity do + let(:update_sequence_id) { nil } + subject do project = create(:project, :repository) commits = [project.commit] @@ -13,9 +15,23 @@ RSpec.describe Atlassian::JiraConnect::Serializers::RepositoryEntity do project, commits: commits, branches: branches, - merge_requests: merge_requests + merge_requests: merge_requests, + update_sequence_id: update_sequence_id ).to_json end it { is_expected.to match_schema('jira_connect/repository') } + + context 'with custom update_sequence_id' do + let(:update_sequence_id) { 1.0 } + + it 'passes the update_sequence_id on to the nested entities', :aggregate_failures do + parsed_subject = Gitlab::Json.parse(subject) + + expect(parsed_subject['updateSequenceId']).to eq(update_sequence_id) + expect(parsed_subject['commits'].first['updateSequenceId']).to eq(update_sequence_id) + expect(parsed_subject['branches'].first['updateSequenceId']).to eq(update_sequence_id) + expect(parsed_subject['pullRequests'].first['updateSequenceId']).to eq(update_sequence_id) + end + end end |