diff options
Diffstat (limited to 'spec/lib/gitlab/ci/tags/bulk_insert_spec.rb')
-rw-r--r-- | spec/lib/gitlab/ci/tags/bulk_insert_spec.rb | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb index 6c4f69fb036..5ab859241c6 100644 --- a/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb +++ b/spec/lib/gitlab/ci/tags/bulk_insert_spec.rb @@ -18,7 +18,7 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do let(:error_message) do <<~MESSAGE A mechanism depending on internals of 'act-as-taggable-on` has been designed - to bulk insert tags for Ci::Build records. + to bulk insert tags for Ci::Build/Ci::Runner records. Please review the code carefully before updating the gem version https://gitlab.com/gitlab-org/gitlab/-/issues/350053 MESSAGE @@ -27,6 +27,21 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do it { expect(ActsAsTaggableOn::VERSION).to eq(acceptable_version), error_message } end + describe '.bulk_insert_tags!' do + let(:inserter) { instance_double(described_class) } + + it 'delegates to bulk insert class' do + expect(Gitlab::Ci::Tags::BulkInsert) + .to receive(:new) + .with(statuses) + .and_return(inserter) + + expect(inserter).to receive(:insert!) + + described_class.bulk_insert_tags!(statuses) + end + end + describe '#insert!' do context 'without tags' do it { expect(service.insert!).to be_falsey } @@ -44,6 +59,50 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do expect(job.reload.tag_list).to match_array(%w[tag1 tag2]) expect(other_job.reload.tag_list).to match_array(%w[tag2 tag3 tag4]) end + + it 'persists taggings' do + service.insert! + + expect(job.taggings.size).to eq(2) + expect(other_job.taggings.size).to eq(3) + + expect(Ci::Build.tagged_with('tag1')).to include(job) + expect(Ci::Build.tagged_with('tag2')).to include(job, other_job) + expect(Ci::Build.tagged_with('tag3')).to include(other_job) + end + + it 'strips tags' do + job.tag_list = [' taga', 'tagb ', ' tagc '] + + service.insert! + expect(job.tags.map(&:name)).to match_array(%w[taga tagb tagc]) + end + + context 'when batching inserts for tags' do + before do + stub_const("#{described_class}::TAGS_BATCH_SIZE", 2) + end + + it 'inserts tags in batches' do + recorder = ActiveRecord::QueryRecorder.new { service.insert! } + count = recorder.log.count { |query| query.include?('INSERT INTO "tags"') } + + expect(count).to eq(2) + end + end + + context 'when batching inserts for taggings' do + before do + stub_const("#{described_class}::TAGGINGS_BATCH_SIZE", 2) + end + + it 'inserts taggings in batches' do + recorder = ActiveRecord::QueryRecorder.new { service.insert! } + count = recorder.log.count { |query| query.include?('INSERT INTO "taggings"') } + + expect(count).to eq(3) + end + end end context 'with tags for only one job' do @@ -57,6 +116,15 @@ RSpec.describe Gitlab::Ci::Tags::BulkInsert do expect(job.reload.tag_list).to match_array(%w[tag1 tag2]) expect(other_job.reload.tag_list).to be_empty end + + it 'persists taggings' do + service.insert! + + expect(job.taggings.size).to eq(2) + + expect(Ci::Build.tagged_with('tag1')).to include(job) + expect(Ci::Build.tagged_with('tag2')).to include(job) + end end end end |