diff --git a/ee/spec/models/merge_trains/train_spec.rb b/ee/spec/models/merge_trains/train_spec.rb index 37a7aafabe4d9c6fe8fd309b39fcb4b59afc8fd7..148070b8f5a773feb91b5ae6eea3871fc4bfcbc7 100644 --- a/ee/spec/models/merge_trains/train_spec.rb +++ b/ee/spec/models/merge_trains/train_spec.rb @@ -1,74 +1,44 @@ # frozen_string_literal: true -require "spec_helper" +require 'spec_helper' RSpec.describe MergeTrains::Train, feature_category: :merge_trains do - let_it_be(:project) { create(:project, :repository) } + let_it_be(:target_project) { create(:project, :repository) } + let_it_be(:merge_request) { create_merge_request_on_train } - let(:train) { described_class.new(target_project, target_branch) } + let(:train) { described_class.new(target_project, merge_request.target_branch) } describe '#all_cars' do - let(:target_project) { merge_request.target_project } - let(:target_branch) { merge_request.target_branch } - let!(:merge_request) { create_merge_request_on_train } - subject { train.all_cars } it 'returns the merge request car' do is_expected.to eq([merge_request.merge_train_car]) end - context 'when the other merge request is on the merge train' do - let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') } - - it 'returns both cars in order of creation' do - is_expected.to eq([merge_request.merge_train_car, merge_request_2.merge_train_car]) + context 'when another merge request is opened but not on merge train' do + let!(:other_merge_request) do + create(:merge_request, + source_project: target_project, + source_branch: 'improve/awesome', + target_branch: merge_request.target_branch) end - end - - context 'when the merge request has already been merged' do - let!(:merge_request) { create_merge_request_on_train(status: :merged) } - it { is_expected.to be_empty } + it { is_expected.to eq([merge_request.merge_train_car]) } end - context 'when the merge request is not on merge train' do - let(:merge_request) { create(:merge_request) } - - it { is_expected.to be_empty } - end - end - - describe '#first_car' do - subject { train.first_car } - - let(:target_project) { merge_request.target_project } - let(:target_branch) { merge_request.target_branch } - let!(:merge_request) { create_merge_request_on_train } - - it 'returns the merge request' do - is_expected.to eq(merge_request.merge_train_car) - end - - context 'when the other merge request is on the merge train' do + context 'with another open merge request on the merge train' do let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') } - it 'returns the merge request' do - is_expected.to eq(merge_request.merge_train_car) + it 'returns both cars in order of creation' do + is_expected.to eq([merge_request.merge_train_car, merge_request_2.merge_train_car]) end end - context 'when the merge request has already been merged' do - let!(:merge_request) { create_merge_request_on_train(status: :merged) } + context 'with another open merge request that has already been merged' do + let!(:merged_merge_request) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') } - it { is_expected.to be_nil } - end - - context 'when the merge request is not on merge train' do - let(:merge_request) { create(:merge_request) } - - it 'returns empty array' do - is_expected.to be_nil + it 'does not return the merged car' do + is_expected.to eq([merge_request.merge_train_car]) end end end @@ -76,38 +46,35 @@ describe '#sha_exists_in_history?' do subject { train.sha_exists_in_history?(target_sha, limit: limit) } - let(:target_project) { project } - let(:target_branch) { 'master' } let(:target_sha) { '' } let(:limit) { 20 } context 'when there is a merge request on train' do - let!(:merge_request_1) { create_merge_request_on_train } let(:merge_commit_sha_1) { OpenSSL::Digest.hexdigest('SHA256', 'test-1') } let(:target_sha) { merge_commit_sha_1 } context 'when the merge request has already been merging' do - let!(:merge_request_1) { create_merge_request_on_train(status: :merging) } + let!(:merge_request) { create_merge_request_on_train(status: :merging, source_branch: 'improve/awesome') } before do - merge_request_1.update_column(:in_progress_merge_commit_sha, merge_commit_sha_1) + merge_request.update_column(:in_progress_merge_commit_sha, merge_commit_sha_1) end it { is_expected.to eq(true) } end context 'when the merge request has already been merged' do - let!(:merge_request_1) { create_merge_request_on_train(status: :merged) } + let!(:merge_request) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') } before do - merge_request_1.update_column(:merge_commit_sha, merge_commit_sha_1) + merge_request.update_column(:merge_commit_sha, merge_commit_sha_1) end it { is_expected.to eq(true) } end context 'when there is another merge request on train and it has been merged' do - let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome', status: :merged) } + let!(:merge_request_2) { create_merge_request_on_train(status: :merged, source_branch: 'improve/awesome') } let(:merge_commit_sha_2) { OpenSSL::Digest.hexdigest('SHA256', 'test-2') } let(:target_sha) { merge_commit_sha_2 } @@ -135,51 +102,43 @@ end end - describe '#car_count' do - subject { train.car_count } - - let(:target_project) { merge_request.target_project } - let(:target_branch) { merge_request.target_branch } - let!(:merge_request) { create_merge_request_on_train } + describe '#first_car' do + subject { train.first_car } - it 'returns the merge request' do - is_expected.to eq(1) - end + let(:first) { instance_double(MergeTrains::Car) } + let(:last) { instance_double(MergeTrains::Car) } - context 'when the other merge request is on the merge train' do - let!(:merge_request_2) { create_merge_request_on_train(source_branch: 'improve/awesome') } + let(:cars) { [first, last] } - it 'returns the merge request' do - is_expected.to eq(2) + it 'returns the first record of the all_cars relation' do + allow_next_instance_of(MergeTrains::Train) do |train| + allow(train).to receive(:all_cars).and_return(cars) end - end - - context 'when the merge request has already been merged' do - let!(:merge_request) { create_merge_request_on_train(status: :merged) } - it 'returns zero' do - is_expected.to be(0) - end + expect(subject).to eq(first) end + end - context 'when the merge request is not on merge train' do - let(:merge_request) { create(:merge_request) } + describe '#car_count' do + subject { train.car_count } - it 'returns empty array' do - is_expected.to be(0) + let(:cars) { [instance_double(MergeTrains::Car), instance_double(MergeTrains::Car)] } + + it 'returns the count of the all_cars relation' do + allow_next_instance_of(MergeTrains::Train) do |train| + allow(train).to receive(:all_cars).and_return(cars) end + + expect(subject).to eq(cars.length) end end - def create_merge_request_on_train( - target_project: project, target_branch: 'master', source_project: project, - source_branch: 'feature', status: :idle) - create(:merge_request, - :on_train, - target_branch: target_branch, + def create_merge_request_on_train(source_branch: 'feature', status: :idle) + create(:merge_request, :on_train, + source_project: target_project, target_project: target_project, + target_branch: 'master', source_branch: source_branch, - source_project: source_project, status: MergeTrains::Car.state_machines[:status].states[status].value) end end