spec/lib/release_tools/tracker/merge_request_updater_spec.rb (111 lines of code) (raw):
# frozen_string_literal: true
require 'spec_helper'
describe ReleaseTools::Tracker::MergeRequestUpdater do
describe '.for_successful_deployments' do
it 'returns a MergeRequestUpdater operating only on successful deployments' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'failed')
expect(ReleaseTools::GitlabClient)
.not_to receive(:deployed_merge_requests)
described_class.for_successful_deployments([deploy]).add_label('foo')
end
end
describe '#add_label' do
it 'adds the label to every merge request' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
mr1 = double(:mr, project_id: 2, iid: 3, web_url: 'foo', labels: %w[foo], source_project_id: 1)
page = Gitlab::PaginatedResponse.new([mr1])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.to receive(:update_merge_request)
.with(2, 3, { labels: 'bar,foo' })
described_class.new([deploy]).add_label('bar')
end
it 'removes existing scoped labels if the new label is a scoped label' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
mr1 = double(
:mr,
project_id: 2,
iid: 3,
web_url: 'foo',
labels: %w[workflow::canary foo],
source_project_id: 1
)
page = Gitlab::PaginatedResponse.new([mr1])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.to receive(:update_merge_request)
.with(2, 3, { labels: 'workflow::production,foo' })
described_class.new([deploy]).add_label('workflow::production')
end
it 'does not remove any scoped labels when adding a regular label' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
mr1 = double(
:mr,
project_id: 2,
iid: 3,
web_url: 'foo',
labels: %w[workflow::canary foo],
source_project_id: 1
)
page = Gitlab::PaginatedResponse.new([mr1])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.to receive(:update_merge_request)
.with(2, 3, { labels: 'kittens,workflow::canary,foo' })
described_class.new([deploy]).add_label('kittens')
end
it 'ignores Unprocessable errors' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
mr1 = double(:mr, project_id: 2, iid: 3, web_url: 'foo', labels: %w[foo], source_project_id: 1)
page = Gitlab::PaginatedResponse.new([mr1])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.to receive(:update_merge_request)
.with(2, 3, { labels: 'bar,foo' })
.and_raise(gitlab_error(:Unprocessable))
expect { described_class.new([deploy]).add_label('bar') }
.not_to raise_error
end
it 'ignores MRs with a missing source_project_id' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
mr1 = double(:mr, project_id: 2, iid: 3, web_url: 'foo', labels: %w[foo], source_project_id: nil)
page = Gitlab::PaginatedResponse.new([mr1])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.not_to receive(:update_merge_request)
described_class.new([deploy]).add_label('bar')
end
it 'does not fail when no MRs are returned' do
deploy = ReleaseTools::Deployments::DeploymentTracker::Deployment
.new(ReleaseTools::Project::GitlabEe.canonical_or_security_path, 1, 'success')
page = Gitlab::PaginatedResponse.new([])
expect(ReleaseTools::GitlabClient)
.to receive(:deployed_merge_requests)
.with(deploy.project_path, deploy.id)
.and_return(page)
expect(ReleaseTools::GitlabClient)
.not_to receive(:update_merge_request)
described_class.new([deploy]).add_label('bar')
end
end
end