diff options
Diffstat (limited to 'spec/models/ci/commit_spec.rb')
-rw-r--r-- | spec/models/ci/commit_spec.rb | 220 |
1 files changed, 127 insertions, 93 deletions
diff --git a/spec/models/ci/commit_spec.rb b/spec/models/ci/commit_spec.rb index 5429151c8d9..acff1ddf0fc 100644 --- a/spec/models/ci/commit_spec.rb +++ b/spec/models/ci/commit_spec.rb @@ -21,15 +21,10 @@ describe Ci::Commit do let(:project) { FactoryGirl.create :ci_project } let(:gl_project) { FactoryGirl.create :empty_project, gitlab_ci_project: project } let(:commit) { FactoryGirl.create :ci_commit, gl_project: gl_project } - let(:commit_with_project) { FactoryGirl.create :ci_commit, gl_project: gl_project } - let(:config_processor) { Ci::GitlabCiYamlProcessor.new(gitlab_ci_yaml) } it { is_expected.to belong_to(:gl_project) } it { is_expected.to have_many(:builds) } - it { is_expected.to validate_presence_of :before_sha } it { is_expected.to validate_presence_of :sha } - it { is_expected.to validate_presence_of :ref } - it { is_expected.to validate_presence_of :push_data } it { is_expected.to respond_to :git_author_name } it { is_expected.to respond_to :git_author_email } @@ -59,53 +54,6 @@ describe Ci::Commit do end end - describe :project_recipients do - - context 'always sending notification' do - it 'should return commit_pusher_email as only recipient when no additional recipients are given' do - project = FactoryGirl.create :ci_project, - email_add_pusher: true, - email_recipients: '' - gl_project = FactoryGirl.create :empty_project, gitlab_ci_project: project - commit = FactoryGirl.create :ci_commit, gl_project: gl_project - expected = 'commit_pusher_email' - allow(commit).to receive(:push_data) { { user_email: expected } } - expect(commit.project_recipients).to eq([expected]) - end - - it 'should return commit_pusher_email and additional recipients' do - project = FactoryGirl.create :ci_project, - email_add_pusher: true, - email_recipients: 'rec1 rec2' - gl_project = FactoryGirl.create :empty_project, gitlab_ci_project: project - commit = FactoryGirl.create :ci_commit, gl_project: gl_project - expected = 'commit_pusher_email' - allow(commit).to receive(:push_data) { { user_email: expected } } - expect(commit.project_recipients).to eq(['rec1', 'rec2', expected]) - end - - it 'should return recipients' do - project = FactoryGirl.create :ci_project, - email_add_pusher: false, - email_recipients: 'rec1 rec2' - gl_project = FactoryGirl.create :empty_project, gitlab_ci_project: project - commit = FactoryGirl.create :ci_commit, gl_project: gl_project - expect(commit.project_recipients).to eq(['rec1', 'rec2']) - end - - it 'should return unique recipients only' do - project = FactoryGirl.create :ci_project, - email_add_pusher: true, - email_recipients: 'rec1 rec1 rec2' - gl_project = FactoryGirl.create :empty_project, gitlab_ci_project: project - commit = FactoryGirl.create :ci_commit, gl_project: gl_project - expected = 'rec2' - allow(commit).to receive(:push_data) { { user_email: expected } } - expect(commit.project_recipients).to eq(['rec1', 'rec2']) - end - end - end - describe :valid_commit_sha do context 'commit.sha can not start with 00000000' do before do @@ -117,63 +65,95 @@ describe Ci::Commit do end end - describe :compare? do - subject { commit_with_project.compare? } - - context 'if commit.before_sha are not nil' do - it { is_expected.to be_truthy } - end - end - describe :short_sha do - subject { commit.short_before_sha } + subject { commit.short_sha } it 'has 8 items' do expect(subject.size).to eq(8) end - it { expect(commit.before_sha).to start_with(subject) } + it { expect(commit.sha).to start_with(subject) } end - describe :short_sha do - subject { commit.short_sha } + describe :stage do + subject { commit.stage } - it 'has 8 items' do - expect(subject.size).to eq(8) + before do + @second = FactoryGirl.create :ci_build, commit: commit, name: 'deploy', stage: 'deploy', stage_idx: 1, status: :pending + @first = FactoryGirl.create :ci_build, commit: commit, name: 'test', stage: 'test', stage_idx: 0, status: :pending + end + + it 'returns first running stage' do + is_expected.to eq('test') + end + + context 'first build succeeded' do + before do + @first.update_attributes(status: :success) + end + + it 'returns last running stage' do + is_expected.to eq('deploy') + end + end + + context 'all builds succeeded' do + before do + @first.update_attributes(status: :success) + @second.update_attributes(status: :success) + end + + it 'returns nil' do + is_expected.to be_nil + end end - it { expect(commit.sha).to start_with(subject) } end describe :create_next_builds do - before do - allow(commit).to receive(:config_processor).and_return(config_processor) + end + + describe :create_builds do + let(:commit) { FactoryGirl.create :ci_commit, gl_project: gl_project } + + def create_builds(trigger_request = nil) + commit.create_builds('master', false, nil, trigger_request) + end + + def create_next_builds(trigger_request = nil) + commit.create_next_builds('master', false, nil, trigger_request) end - it "creates builds for next type" do - expect(commit.create_builds).to be_truthy + it 'creates builds' do + expect(create_builds).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(2) - expect(commit.create_next_builds(nil)).to be_truthy + expect(create_next_builds).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(4) - expect(commit.create_next_builds(nil)).to be_truthy + expect(create_next_builds).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(5) - expect(commit.create_next_builds(nil)).to be_falsey + expect(create_next_builds).to be_falsey end - end - describe :create_builds do - before do - allow(commit).to receive(:config_processor).and_return(config_processor) - end + context 'for different ref' do + def create_develop_builds + commit.create_builds('develop', false, nil, nil) + end - it 'creates builds' do - expect(commit.create_builds).to be_truthy - commit.builds.reload - expect(commit.builds.size).to eq(2) + it 'creates builds' do + expect(create_builds).to be_truthy + commit.builds.reload + expect(commit.builds.size).to eq(2) + + expect(create_develop_builds).to be_truthy + commit.builds.reload + expect(commit.builds.size).to eq(4) + expect(commit.refs.size).to eq(2) + expect(commit.builds.pluck(:name).uniq.size).to eq(2) + end end context 'for build triggers' do @@ -181,40 +161,39 @@ describe Ci::Commit do let(:trigger_request) { FactoryGirl.create :ci_trigger_request, commit: commit, trigger: trigger } it 'creates builds' do - expect(commit.create_builds(trigger_request)).to be_truthy + expect(create_builds(trigger_request)).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(2) end it 'rebuilds commit' do - expect(commit.create_builds).to be_truthy + expect(create_builds).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(2) - expect(commit.create_builds(trigger_request)).to be_truthy + expect(create_builds(trigger_request)).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(4) end it 'creates next builds' do - expect(commit.create_builds(trigger_request)).to be_truthy + expect(create_builds(trigger_request)).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(2) - expect(commit.create_next_builds(trigger_request)).to be_truthy + expect(create_next_builds(trigger_request)).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(4) end context 'for [ci skip]' do before do - commit.push_data[:commits][0][:message] = 'skip this commit [ci skip]' - commit.save + allow(commit).to receive(:git_commit_message) { 'message [ci skip]' } end it 'rebuilds commit' do expect(commit.status).to eq('skipped') - expect(commit.create_builds(trigger_request)).to be_truthy + expect(create_builds(trigger_request)).to be_truthy commit.builds.reload expect(commit.builds.size).to eq(2) expect(commit.status).to eq('pending') @@ -228,13 +207,13 @@ describe Ci::Commit do it "returns finished_at of latest build" do build = FactoryGirl.create :ci_build, commit: commit, finished_at: Time.now - 60 - build1 = FactoryGirl.create :ci_build, commit: commit, finished_at: Time.now - 120 + FactoryGirl.create :ci_build, commit: commit, finished_at: Time.now - 120 expect(commit.finished_at.to_i).to eq(build.finished_at.to_i) end it "returns nil if there is no finished build" do - build = FactoryGirl.create :ci_not_started_build, commit: commit + FactoryGirl.create :ci_not_started_build, commit: commit expect(commit.finished_at).to be_nil end @@ -270,4 +249,59 @@ describe Ci::Commit do expect(commit.coverage).to be_nil end end + + describe :should_create_next_builds? do + before do + @build1 = FactoryGirl.create :ci_build, commit: commit, name: 'build1', ref: 'master', tag: false, status: :success + @build2 = FactoryGirl.create :ci_build, commit: commit, name: 'build1', ref: 'develop', tag: false, status: :failed + @build3 = FactoryGirl.create :ci_build, commit: commit, name: 'build1', ref: 'master', tag: true, status: :failed + @build4 = FactoryGirl.create :ci_build, commit: commit, name: 'build4', ref: 'master', tag: false, status: :success + end + + context 'for success' do + it 'to create if all succeeded' do + expect(commit.should_create_next_builds?(@build4)).to be_truthy + end + end + + context 'for failed' do + before do + @build4.update_attributes(status: :failed) + end + + it 'to not create' do + expect(commit.should_create_next_builds?(@build4)).to be_falsey + end + + context 'and ignore failures for current' do + before do + @build4.update_attributes(allow_failure: true) + end + + it 'to create' do + expect(commit.should_create_next_builds?(@build4)).to be_truthy + end + end + end + + context 'for running' do + before do + @build4.update_attributes(status: :running) + end + + it 'to not create' do + expect(commit.should_create_next_builds?(@build4)).to be_falsey + end + end + + context 'for retried' do + before do + @build5 = FactoryGirl.create :ci_build, commit: commit, name: 'build4', ref: 'master', tag: false, status: :failed + end + + it 'to not create' do + expect(commit.should_create_next_builds?(@build4)).to be_falsey + end + end + end end |