diff options
Diffstat (limited to 'spec/services/releases/update_service_spec.rb')
-rw-r--r-- | spec/services/releases/update_service_spec.rb | 77 |
1 files changed, 57 insertions, 20 deletions
diff --git a/spec/services/releases/update_service_spec.rb b/spec/services/releases/update_service_spec.rb index 7461470a844..6bddea48251 100644 --- a/spec/services/releases/update_service_spec.rb +++ b/spec/services/releases/update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Releases::UpdateService do +RSpec.describe Releases::UpdateService, feature_category: :continuous_integration do let(:project) { create(:project, :repository) } let(:user) { create(:user) } let(:new_name) { 'A new name' } @@ -60,18 +60,22 @@ RSpec.describe Releases::UpdateService do release.milestones << milestone end - context 'a different milestone' do - let(:new_title) { 'v2.0' } - + shared_examples 'updates milestones' do it 'updates the related milestone accordingly' do - result = service.execute release.reload + result = service.execute expect(release.milestones.first.title).to eq(new_title) expect(result[:milestones_updated]).to be_truthy end end + context 'a different milestone' do + let(:new_title) { 'v2.0' } + + it_behaves_like 'updates milestones' + end + context 'an identical milestone' do let(:new_title) { 'v1.0' } @@ -79,11 +83,17 @@ RSpec.describe Releases::UpdateService do expect { service.execute }.to raise_error(ActiveRecord::RecordInvalid) end end + + context 'by ids' do + let(:new_title) { 'v2.0' } + let(:params_with_milestone) { params.merge!({ milestone_ids: [new_milestone.id] }) } + + it_behaves_like 'updates milestones' + end end context "when an 'empty' milestone is passed in" do let(:milestone) { create(:milestone, project: project, title: 'v1.0') } - let(:params_with_empty_milestone) { params.merge!({ milestones: [] }) } before do release.milestones << milestone @@ -91,12 +101,26 @@ RSpec.describe Releases::UpdateService do service.params = params_with_empty_milestone end - it 'removes the old milestone and does not associate any new milestone' do - result = service.execute - release.reload + shared_examples 'removes milestones' do + it 'removes the old milestone and does not associate any new milestone' do + result = service.execute + release.reload + + expect(release.milestones).not_to be_present + expect(result[:milestones_updated]).to be_truthy + end + end - expect(release.milestones).not_to be_present - expect(result[:milestones_updated]).to be_truthy + context 'by title' do + let(:params_with_empty_milestone) { params.merge!({ milestones: [] }) } + + it_behaves_like 'removes milestones' + end + + context 'by id' do + let(:params_with_empty_milestone) { params.merge!({ milestone_ids: [] }) } + + it_behaves_like 'removes milestones' end end @@ -104,22 +128,35 @@ RSpec.describe Releases::UpdateService do let(:new_title_1) { 'v2.0' } let(:new_title_2) { 'v2.0-rc' } let(:milestone) { create(:milestone, project: project, title: 'v1.0') } - let(:params_with_milestones) { params.merge!({ milestones: [new_title_1, new_title_2] }) } let(:service) { described_class.new(project, user, params_with_milestones) } + let!(:new_milestone_1) { create(:milestone, project: project, title: new_title_1) } + let!(:new_milestone_2) { create(:milestone, project: project, title: new_title_2) } before do - create(:milestone, project: project, title: new_title_1) - create(:milestone, project: project, title: new_title_2) release.milestones << milestone end - it 'removes the old milestone and update the release with the new ones' do - result = service.execute - release.reload + shared_examples 'updates multiple milestones' do + it 'removes the old milestone and update the release with the new ones' do + result = service.execute + release.reload + + milestone_titles = release.milestones.map(&:title) + expect(milestone_titles).to match_array([new_title_1, new_title_2]) + expect(result[:milestones_updated]).to be_truthy + end + end + + context 'by title' do + let(:params_with_milestones) { params.merge!({ milestones: [new_title_1, new_title_2] }) } + + it_behaves_like 'updates multiple milestones' + end + + context 'by id' do + let(:params_with_milestones) { params.merge!({ milestone_ids: [new_milestone_1.id, new_milestone_2.id] }) } - milestone_titles = release.milestones.map(&:title) - expect(milestone_titles).to match_array([new_title_1, new_title_2]) - expect(result[:milestones_updated]).to be_truthy + it_behaves_like 'updates multiple milestones' end end end |