summaryrefslogtreecommitdiff
path: root/spec/models/ci/pipeline_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/ci/pipeline_spec.rb')
-rw-r--r--spec/models/ci/pipeline_spec.rb1383
1 files changed, 693 insertions, 690 deletions
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index ee400bec04b..7c7b7bb32b2 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -1,4 +1,4 @@
-require 'spec_helper'
+require "spec_helper"
describe Ci::Pipeline, :mailer do
include ProjectForksHelper
@@ -10,7 +10,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_empty_pipeline, status: :created, project: project)
end
- it_behaves_like 'having unique enum values'
+ it_behaves_like "having unique enum values"
it { is_expected.to belong_to(:project) }
it { is_expected.to belong_to(:user) }
@@ -34,29 +34,29 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to respond_to :short_sha }
it { is_expected.to delegate_method(:full_path).to(:project).with_prefix }
- describe 'associations' do
- it 'has a bidirectional relationship with projects' do
+ describe "associations" do
+ it "has a bidirectional relationship with projects" do
expect(described_class.reflect_on_association(:project).has_inverse?).to eq(:all_pipelines)
expect(Project.reflect_on_association(:all_pipelines).has_inverse?).to eq(:project)
expect(Project.reflect_on_association(:ci_pipelines).has_inverse?).to eq(:project)
end
end
- describe '.processables' do
+ describe ".processables" do
before do
- create(:ci_build, name: 'build', pipeline: pipeline)
- create(:ci_bridge, name: 'bridge', pipeline: pipeline)
- create(:commit_status, name: 'commit status', pipeline: pipeline)
- create(:generic_commit_status, name: 'generic status', pipeline: pipeline)
+ create(:ci_build, name: "build", pipeline: pipeline)
+ create(:ci_bridge, name: "bridge", pipeline: pipeline)
+ create(:commit_status, name: "commit status", pipeline: pipeline)
+ create(:generic_commit_status, name: "generic status", pipeline: pipeline)
end
- it 'has an association with processable CI/CD entities' do
- pipeline.processables.pluck('name').yield_self do |processables|
+ it "has an association with processable CI/CD entities" do
+ pipeline.processables.pluck("name").yield_self do |processables|
expect(processables).to match_array %w[build bridge]
end
end
- it 'makes it possible to append a new processable' do
+ it "makes it possible to append a new processable" do
pipeline.processables << build(:ci_bridge)
pipeline.save!
@@ -65,20 +65,20 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '.sort_by_merge_request_pipelines' do
+ describe ".sort_by_merge_request_pipelines" do
subject { described_class.sort_by_merge_request_pipelines }
- context 'when branch pipelines exist' do
+ context "when branch pipelines exist" do
let!(:branch_pipeline_1) { create(:ci_pipeline, source: :push) }
let!(:branch_pipeline_2) { create(:ci_pipeline, source: :push) }
- it 'returns pipelines order by id' do
+ it "returns pipelines order by id" do
expect(subject).to eq([branch_pipeline_2,
- branch_pipeline_1])
+ branch_pipeline_1,])
end
end
- context 'when merge request pipelines exist' do
+ context "when merge request pipelines exist" do
let!(:merge_request_pipeline_1) do
create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
end
@@ -89,19 +89,19 @@ describe Ci::Pipeline, :mailer do
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'returns pipelines order by id' do
+ it "returns pipelines order by id" do
expect(subject).to eq([merge_request_pipeline_2,
- merge_request_pipeline_1])
+ merge_request_pipeline_1,])
end
end
- context 'when both branch pipeline and merge request pipeline exist' do
+ context "when both branch pipeline and merge request pipeline exist" do
let!(:branch_pipeline_1) { create(:ci_pipeline, source: :push) }
let!(:branch_pipeline_2) { create(:ci_pipeline, source: :push) }
@@ -115,22 +115,22 @@ describe Ci::Pipeline, :mailer do
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'returns merge request pipeline first' do
+ it "returns merge request pipeline first" do
expect(subject).to eq([merge_request_pipeline_2,
merge_request_pipeline_1,
branch_pipeline_2,
- branch_pipeline_1])
+ branch_pipeline_1,])
end
end
end
- describe '.detached_merge_request_pipelines' do
+ describe ".detached_merge_request_pipelines" do
subject { described_class.detached_merge_request_pipelines(merge_request) }
let!(:pipeline) do
@@ -140,20 +140,20 @@ describe Ci::Pipeline, :mailer do
let(:merge_request) { create(:merge_request) }
let(:target_sha) { nil }
- it 'returns detached merge request pipelines' do
+ it "returns detached merge request pipelines" do
is_expected.to eq([pipeline])
end
- context 'when target sha exists' do
+ context "when target sha exists" do
let(:target_sha) { merge_request.target_branch_sha }
- it 'returns empty array' do
+ it "returns empty array" do
is_expected.to be_empty
end
end
end
- describe '#detached_merge_request_pipeline?' do
+ describe "#detached_merge_request_pipeline?" do
subject { pipeline.detached_merge_request_pipeline? }
let!(:pipeline) do
@@ -165,14 +165,14 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to be_truthy }
- context 'when target sha exists' do
+ context "when target sha exists" do
let(:target_sha) { merge_request.target_branch_sha }
it { is_expected.to be_falsy }
end
end
- describe '.merge_request_pipelines' do
+ describe ".merge_request_pipelines" do
subject { described_class.merge_request_pipelines(merge_request) }
let!(:pipeline) do
@@ -182,20 +182,20 @@ describe Ci::Pipeline, :mailer do
let(:merge_request) { create(:merge_request) }
let(:target_sha) { merge_request.target_branch_sha }
- it 'returns merge pipelines' do
+ it "returns merge pipelines" do
is_expected.to eq([pipeline])
end
- context 'when target sha is empty' do
+ context "when target sha is empty" do
let(:target_sha) { nil }
- it 'returns empty array' do
+ it "returns empty array" do
is_expected.to be_empty
end
end
end
- describe '#merge_request_pipeline?' do
+ describe "#merge_request_pipeline?" do
subject { pipeline.merge_request_pipeline? }
let!(:pipeline) do
@@ -207,14 +207,14 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to be_truthy }
- context 'when target sha is empty' do
+ context "when target sha is empty" do
let(:target_sha) { nil }
it { is_expected.to be_falsy }
end
end
- describe '.mergeable_merge_request_pipelines' do
+ describe ".mergeable_merge_request_pipelines" do
subject { described_class.mergeable_merge_request_pipelines(merge_request) }
let!(:pipeline) do
@@ -224,20 +224,20 @@ describe Ci::Pipeline, :mailer do
let(:merge_request) { create(:merge_request) }
let(:target_sha) { merge_request.target_branch_sha }
- it 'returns mergeable merge pipelines' do
+ it "returns mergeable merge pipelines" do
is_expected.to eq([pipeline])
end
- context 'when target sha does not point the head of the target branch' do
+ context "when target sha does not point the head of the target branch" do
let(:target_sha) { merge_request.diff_head_sha }
- it 'returns empty array' do
+ it "returns empty array" do
is_expected.to be_empty
end
end
end
- describe '#mergeable_merge_request_pipeline?' do
+ describe "#mergeable_merge_request_pipeline?" do
subject { pipeline.mergeable_merge_request_pipeline? }
let!(:pipeline) do
@@ -249,63 +249,63 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to be_truthy }
- context 'when target sha does not point the head of the target branch' do
+ context "when target sha does not point the head of the target branch" do
let(:target_sha) { merge_request.diff_head_sha }
it { is_expected.to be_falsy }
end
end
- describe '.merge_request' do
+ describe ".merge_request" do
subject { described_class.merge_request }
- context 'when there is a merge request pipeline' do
+ context "when there is a merge request pipeline" do
let!(:pipeline) { create(:ci_pipeline, source: :merge_request, merge_request: merge_request) }
let(:merge_request) { create(:merge_request) }
- it 'returns merge request pipeline first' do
+ it "returns merge request pipeline first" do
expect(subject).to eq([pipeline])
end
end
- context 'when there are no merge request pipelines' do
+ context "when there are no merge request pipelines" do
let!(:pipeline) { create(:ci_pipeline, source: :push) }
- it 'returns empty array' do
+ it "returns empty array" do
expect(subject).to be_empty
end
end
end
- describe 'Validations for merge request pipelines' do
+ describe "Validations for merge request pipelines" do
let(:pipeline) { build(:ci_pipeline, source: source, merge_request: merge_request) }
- context 'when source is merge request' do
+ context "when source is merge request" do
let(:source) { :merge_request }
- context 'when merge request is specified' do
- let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_project: project, target_branch: 'master') }
+ context "when merge request is specified" do
+ let(:merge_request) { create(:merge_request, source_project: project, source_branch: "feature", target_project: project, target_branch: "master") }
it { expect(pipeline).to be_valid }
end
- context 'when merge request is empty' do
+ context "when merge request is empty" do
let(:merge_request) { nil }
it { expect(pipeline).not_to be_valid }
end
end
- context 'when source is web' do
+ context "when source is web" do
let(:source) { :web }
- context 'when merge request is specified' do
- let(:merge_request) { create(:merge_request, source_project: project, source_branch: 'feature', target_project: project, target_branch: 'master') }
+ context "when merge request is specified" do
+ let(:merge_request) { create(:merge_request, source_project: project, source_branch: "feature", target_project: project, target_branch: "master") }
it { expect(pipeline).not_to be_valid }
end
- context 'when merge request is empty' do
+ context "when merge request is empty" do
let(:merge_request) { nil }
it { expect(pipeline).to be_valid }
@@ -313,18 +313,18 @@ describe Ci::Pipeline, :mailer do
end
end
- describe 'modules' do
- it_behaves_like 'AtomicInternalId', validate_presence: false do
+ describe "modules" do
+ it_behaves_like "AtomicInternalId", validate_presence: false do
let(:internal_id_attribute) { :iid }
let(:instance) { build(:ci_pipeline) }
let(:scope) { :project }
- let(:scope_attrs) { { project: instance.project } }
+ let(:scope_attrs) { {project: instance.project} }
let(:usage) { :ci_pipelines }
end
end
- describe '#source' do
- context 'when creating new pipeline' do
+ describe "#source" do
+ context "when creating new pipeline" do
let(:pipeline) do
build(:ci_empty_pipeline, status: :created, project: project, source: nil)
end
@@ -334,7 +334,7 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when updating existing pipeline' do
+ context "when updating existing pipeline" do
before do
pipeline.update_attribute(:source, nil)
end
@@ -345,55 +345,55 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#block' do
- it 'changes pipeline status to manual' do
+ describe "#block" do
+ it "changes pipeline status to manual" do
expect(pipeline.block).to be true
expect(pipeline.reload).to be_manual
expect(pipeline.reload).to be_blocked
end
end
- describe '#delay' do
+ describe "#delay" do
subject { pipeline.delay }
let(:pipeline) { build(:ci_pipeline, status: :created) }
- it 'changes pipeline status to schedule' do
+ it "changes pipeline status to schedule" do
subject
expect(pipeline).to be_scheduled
end
end
- describe '#valid_commit_sha' do
- context 'commit.sha can not start with 00000000' do
+ describe "#valid_commit_sha" do
+ context "commit.sha can not start with 00000000" do
before do
- pipeline.sha = '0' * 40
+ pipeline.sha = "0" * 40
pipeline.valid_commit_sha
end
- it('commit errors should not be empty') { expect(pipeline.errors).not_to be_empty }
+ it("commit errors should not be empty") { expect(pipeline.errors).not_to be_empty }
end
end
- describe '#short_sha' do
+ describe "#short_sha" do
subject { pipeline.short_sha }
- it 'has 8 items' do
+ it "has 8 items" do
expect(subject.size).to eq(8)
end
it { expect(pipeline.sha).to start_with(subject) }
end
- describe '#retried' do
+ describe "#retried" do
subject { pipeline.retried }
before do
- @build1 = create(:ci_build, pipeline: pipeline, name: 'deploy', retried: true)
- @build2 = create(:ci_build, pipeline: pipeline, name: 'deploy')
+ @build1 = create(:ci_build, pipeline: pipeline, name: "deploy", retried: true)
+ @build2 = create(:ci_build, pipeline: pipeline, name: "deploy")
end
- it 'returns old builds' do
+ it "returns old builds" do
is_expected.to contain_exactly(@build1)
end
end
@@ -428,36 +428,36 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#retryable?' do
+ describe "#retryable?" do
subject { pipeline.retryable? }
- context 'no failed builds' do
+ context "no failed builds" do
before do
- create_build('rspec', 'success')
+ create_build("rspec", "success")
end
- it 'is not retryable' do
+ it "is not retryable" do
is_expected.to be_falsey
end
- context 'one canceled job' do
+ context "one canceled job" do
before do
- create_build('rubocop', 'canceled')
+ create_build("rubocop", "canceled")
end
- it 'is retryable' do
+ it "is retryable" do
is_expected.to be_truthy
end
end
end
- context 'with failed builds' do
+ context "with failed builds" do
before do
- create_build('rspec', 'running')
- create_build('rubocop', 'failed')
+ create_build("rspec", "running")
+ create_build("rubocop", "failed")
end
- it 'is retryable' do
+ it "is retryable" do
is_expected.to be_truthy
end
end
@@ -467,21 +467,21 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#persisted_variables' do
- context 'when pipeline is not persisted yet' do
+ describe "#persisted_variables" do
+ context "when pipeline is not persisted yet" do
subject { build(:ci_pipeline).persisted_variables }
- it 'does not contain some variables' do
+ it "does not contain some variables" do
keys = subject.map { |variable| variable[:key] }
- expect(keys).not_to include 'CI_PIPELINE_ID'
+ expect(keys).not_to include "CI_PIPELINE_ID"
end
end
- context 'when pipeline is persisted' do
+ context "when pipeline is persisted" do
subject { build_stubbed(:ci_pipeline).persisted_variables }
- it 'does contains persisted variables' do
+ it "does contains persisted variables" do
keys = subject.map { |variable| variable[:key] }
expect(keys).to eq %w[CI_PIPELINE_ID CI_PIPELINE_URL]
@@ -489,10 +489,10 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#predefined_variables' do
+ describe "#predefined_variables" do
subject { pipeline.predefined_variables }
- it 'includes all predefined variables in a valid order' do
+ it "includes all predefined variables in a valid order" do
keys = subject.map { |variable| variable[:key] }
expect(keys).to eq %w[CI_PIPELINE_IID
@@ -503,336 +503,338 @@ describe Ci::Pipeline, :mailer do
CI_COMMIT_DESCRIPTION]
end
- context 'when source is merge request' do
+ context "when source is merge request" do
let(:pipeline) do
create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'exposes merge request pipeline variables' do
+ it "exposes merge request pipeline variables" do
expect(subject.to_hash)
.to include(
- 'CI_MERGE_REQUEST_ID' => merge_request.id.to_s,
- 'CI_MERGE_REQUEST_IID' => merge_request.iid.to_s,
- 'CI_MERGE_REQUEST_REF_PATH' => merge_request.ref_path.to_s,
- 'CI_MERGE_REQUEST_PROJECT_ID' => merge_request.project.id.to_s,
- 'CI_MERGE_REQUEST_PROJECT_PATH' => merge_request.project.full_path,
- 'CI_MERGE_REQUEST_PROJECT_URL' => merge_request.project.web_url,
- 'CI_MERGE_REQUEST_TARGET_BRANCH_NAME' => merge_request.target_branch.to_s,
- 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' => pipeline.target_sha.to_s,
- 'CI_MERGE_REQUEST_SOURCE_PROJECT_ID' => merge_request.source_project.id.to_s,
- 'CI_MERGE_REQUEST_SOURCE_PROJECT_PATH' => merge_request.source_project.full_path,
- 'CI_MERGE_REQUEST_SOURCE_PROJECT_URL' => merge_request.source_project.web_url,
- 'CI_MERGE_REQUEST_SOURCE_BRANCH_NAME' => merge_request.source_branch.to_s,
- 'CI_MERGE_REQUEST_SOURCE_BRANCH_SHA' => pipeline.source_sha.to_s)
- end
-
- context 'when source project does not exist' do
+ "CI_MERGE_REQUEST_ID" => merge_request.id.to_s,
+ "CI_MERGE_REQUEST_IID" => merge_request.iid.to_s,
+ "CI_MERGE_REQUEST_REF_PATH" => merge_request.ref_path.to_s,
+ "CI_MERGE_REQUEST_PROJECT_ID" => merge_request.project.id.to_s,
+ "CI_MERGE_REQUEST_PROJECT_PATH" => merge_request.project.full_path,
+ "CI_MERGE_REQUEST_PROJECT_URL" => merge_request.project.web_url,
+ "CI_MERGE_REQUEST_TARGET_BRANCH_NAME" => merge_request.target_branch.to_s,
+ "CI_MERGE_REQUEST_TARGET_BRANCH_SHA" => pipeline.target_sha.to_s,
+ "CI_MERGE_REQUEST_SOURCE_PROJECT_ID" => merge_request.source_project.id.to_s,
+ "CI_MERGE_REQUEST_SOURCE_PROJECT_PATH" => merge_request.source_project.full_path,
+ "CI_MERGE_REQUEST_SOURCE_PROJECT_URL" => merge_request.source_project.web_url,
+ "CI_MERGE_REQUEST_SOURCE_BRANCH_NAME" => merge_request.source_branch.to_s,
+ "CI_MERGE_REQUEST_SOURCE_BRANCH_SHA" => pipeline.source_sha.to_s
+ )
+ end
+
+ context "when source project does not exist" do
before do
merge_request.update_column(:source_project_id, nil)
end
- it 'does not expose source project related variables' do
+ it "does not expose source project related variables" do
expect(subject.to_hash.keys).not_to include(
%w[CI_MERGE_REQUEST_SOURCE_PROJECT_ID
CI_MERGE_REQUEST_SOURCE_PROJECT_PATH
CI_MERGE_REQUEST_SOURCE_PROJECT_URL
- CI_MERGE_REQUEST_SOURCE_BRANCH_NAME])
+ CI_MERGE_REQUEST_SOURCE_BRANCH_NAME]
+ )
end
end
end
end
- describe '#protected_ref?' do
+ describe "#protected_ref?" do
before do
pipeline.project = create(:project, :repository)
end
- it 'delegates method to project' do
+ it "delegates method to project" do
expect(pipeline).not_to be_protected_ref
end
end
- describe '#legacy_trigger' do
+ describe "#legacy_trigger" do
let(:trigger_request) { create(:ci_trigger_request) }
before do
pipeline.trigger_requests << trigger_request
end
- it 'returns first trigger request' do
+ it "returns first trigger request" do
expect(pipeline.legacy_trigger).to eq trigger_request
end
end
- describe '#auto_canceled?' do
+ describe "#auto_canceled?" do
subject { pipeline.auto_canceled? }
- context 'when it is canceled' do
+ context "when it is canceled" do
before do
pipeline.cancel
end
- context 'when there is auto_canceled_by' do
+ context "when there is auto_canceled_by" do
before do
pipeline.update(auto_canceled_by: create(:ci_empty_pipeline))
end
- it 'is auto canceled' do
+ it "is auto canceled" do
is_expected.to be_truthy
end
end
- context 'when there is no auto_canceled_by' do
- it 'is not auto canceled' do
+ context "when there is no auto_canceled_by" do
+ it "is not auto canceled" do
is_expected.to be_falsey
end
end
- context 'when it is retried and canceled manually' do
+ context "when it is retried and canceled manually" do
before do
pipeline.enqueue
pipeline.cancel
end
- it 'is not auto canceled' do
+ it "is not auto canceled" do
is_expected.to be_falsey
end
end
end
end
- describe 'pipeline stages' do
- describe '#stage_seeds' do
+ describe "pipeline stages" do
+ describe "#stage_seeds" do
let(:pipeline) { build(:ci_pipeline, config: config) }
- let(:config) { { rspec: { script: 'rake' } } }
+ let(:config) { {rspec: {script: "rake"}} }
- it 'returns preseeded stage seeds object' do
+ it "returns preseeded stage seeds object" do
expect(pipeline.stage_seeds)
.to all(be_a Gitlab::Ci::Pipeline::Seed::Base)
expect(pipeline.stage_seeds.count).to eq 1
end
- context 'when no refs policy is specified' do
+ context "when no refs policy is specified" do
let(:config) do
- { production: { stage: 'deploy', script: 'cap prod' },
- rspec: { stage: 'test', script: 'rspec' },
- spinach: { stage: 'test', script: 'spinach' } }
+ {production: {stage: "deploy", script: "cap prod"},
+ rspec: {stage: "test", script: "rspec"},
+ spinach: {stage: "test", script: "spinach"},}
end
- it 'correctly fabricates a stage seeds object' do
+ it "correctly fabricates a stage seeds object" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 2
- expect(seeds.first.attributes[:name]).to eq 'test'
- expect(seeds.second.attributes[:name]).to eq 'deploy'
- expect(seeds.dig(0, 0, :name)).to eq 'rspec'
- expect(seeds.dig(0, 1, :name)).to eq 'spinach'
- expect(seeds.dig(1, 0, :name)).to eq 'production'
+ expect(seeds.first.attributes[:name]).to eq "test"
+ expect(seeds.second.attributes[:name]).to eq "deploy"
+ expect(seeds.dig(0, 0, :name)).to eq "rspec"
+ expect(seeds.dig(0, 1, :name)).to eq "spinach"
+ expect(seeds.dig(1, 0, :name)).to eq "production"
end
end
- context 'when refs policy is specified' do
+ context "when refs policy is specified" do
let(:pipeline) do
- build(:ci_pipeline, ref: 'feature', tag: true, config: config)
+ build(:ci_pipeline, ref: "feature", tag: true, config: config)
end
let(:config) do
- { production: { stage: 'deploy', script: 'cap prod', only: ['master'] },
- spinach: { stage: 'test', script: 'spinach', only: ['tags'] } }
+ {production: {stage: "deploy", script: "cap prod", only: ["master"]},
+ spinach: {stage: "test", script: "spinach", only: ["tags"]},}
end
- it 'returns stage seeds only assigned to master to master' do
+ it "returns stage seeds only assigned to master to master" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 1
- expect(seeds.first.attributes[:name]).to eq 'test'
- expect(seeds.dig(0, 0, :name)).to eq 'spinach'
+ expect(seeds.first.attributes[:name]).to eq "test"
+ expect(seeds.dig(0, 0, :name)).to eq "spinach"
end
end
- context 'when source policy is specified' do
+ context "when source policy is specified" do
let(:pipeline) { build(:ci_pipeline, source: :schedule, config: config) }
let(:config) do
- { production: { stage: 'deploy', script: 'cap prod', only: ['triggers'] },
- spinach: { stage: 'test', script: 'spinach', only: ['schedules'] } }
+ {production: {stage: "deploy", script: "cap prod", only: ["triggers"]},
+ spinach: {stage: "test", script: "spinach", only: ["schedules"]},}
end
- it 'returns stage seeds only assigned to schedules' do
+ it "returns stage seeds only assigned to schedules" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 1
- expect(seeds.first.attributes[:name]).to eq 'test'
- expect(seeds.dig(0, 0, :name)).to eq 'spinach'
+ expect(seeds.first.attributes[:name]).to eq "test"
+ expect(seeds.dig(0, 0, :name)).to eq "spinach"
end
end
- context 'when kubernetes policy is specified' do
+ context "when kubernetes policy is specified" do
let(:config) do
{
- spinach: { stage: 'test', script: 'spinach' },
+ spinach: {stage: "test", script: "spinach"},
production: {
- stage: 'deploy',
- script: 'cap',
- only: { kubernetes: 'active' }
- }
+ stage: "deploy",
+ script: "cap",
+ only: {kubernetes: "active"},
+ },
}
end
- context 'when kubernetes is active' do
- shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
- it 'returns seeds for kubernetes dependent job' do
+ context "when kubernetes is active" do
+ shared_examples "same behavior between KubernetesService and Platform::Kubernetes" do
+ it "returns seeds for kubernetes dependent job" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 2
- expect(seeds.dig(0, 0, :name)).to eq 'spinach'
- expect(seeds.dig(1, 0, :name)).to eq 'production'
+ expect(seeds.dig(0, 0, :name)).to eq "spinach"
+ expect(seeds.dig(1, 0, :name)).to eq "production"
end
end
- context 'when user configured kubernetes from Integration > Kubernetes' do
+ context "when user configured kubernetes from Integration > Kubernetes" do
let(:project) { create(:kubernetes_project) }
let(:pipeline) { build(:ci_pipeline, project: project, config: config) }
- it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
+ it_behaves_like "same behavior between KubernetesService and Platform::Kubernetes"
end
- context 'when user configured kubernetes from CI/CD > Clusters' do
+ context "when user configured kubernetes from CI/CD > Clusters" do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
let(:pipeline) { build(:ci_pipeline, project: project, config: config) }
- it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
+ it_behaves_like "same behavior between KubernetesService and Platform::Kubernetes"
end
end
- context 'when kubernetes is not active' do
- it 'does not return seeds for kubernetes dependent job' do
+ context "when kubernetes is not active" do
+ it "does not return seeds for kubernetes dependent job" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 1
- expect(seeds.dig(0, 0, :name)).to eq 'spinach'
+ expect(seeds.dig(0, 0, :name)).to eq "spinach"
end
end
end
- context 'when variables policy is specified' do
+ context "when variables policy is specified" do
let(:config) do
- { unit: { script: 'minitest', only: { variables: ['$CI_PIPELINE_SOURCE'] } },
- feature: { script: 'spinach', only: { variables: ['$UNDEFINED'] } } }
+ {unit: {script: "minitest", only: {variables: ["$CI_PIPELINE_SOURCE"]}},
+ feature: {script: "spinach", only: {variables: ["$UNDEFINED"]}},}
end
- it 'returns stage seeds only when variables expression is truthy' do
+ it "returns stage seeds only when variables expression is truthy" do
seeds = pipeline.stage_seeds
expect(seeds.size).to eq 1
- expect(seeds.dig(0, 0, :name)).to eq 'unit'
+ expect(seeds.dig(0, 0, :name)).to eq "unit"
end
end
end
- describe '#seeds_size' do
- context 'when refs policy is specified' do
+ describe "#seeds_size" do
+ context "when refs policy is specified" do
let(:config) do
- { production: { stage: 'deploy', script: 'cap prod', only: ['master'] },
- spinach: { stage: 'test', script: 'spinach', only: ['tags'] } }
+ {production: {stage: "deploy", script: "cap prod", only: ["master"]},
+ spinach: {stage: "test", script: "spinach", only: ["tags"]},}
end
let(:pipeline) do
- build(:ci_pipeline, ref: 'feature', tag: true, config: config)
+ build(:ci_pipeline, ref: "feature", tag: true, config: config)
end
- it 'returns real seeds size' do
+ it "returns real seeds size" do
expect(pipeline.seeds_size).to eq 1
end
end
end
- describe 'legacy stages' do
+ describe "legacy stages" do
before do
create(:commit_status, pipeline: pipeline,
- stage: 'build',
- name: 'linux',
+ stage: "build",
+ name: "linux",
stage_idx: 0,
- status: 'success')
+ status: "success")
create(:commit_status, pipeline: pipeline,
- stage: 'build',
- name: 'mac',
+ stage: "build",
+ name: "mac",
stage_idx: 0,
- status: 'failed')
+ status: "failed")
create(:commit_status, pipeline: pipeline,
- stage: 'deploy',
- name: 'staging',
+ stage: "deploy",
+ name: "staging",
stage_idx: 2,
- status: 'running')
+ status: "running")
create(:commit_status, pipeline: pipeline,
- stage: 'test',
- name: 'rspec',
+ stage: "test",
+ name: "rspec",
stage_idx: 1,
- status: 'success')
+ status: "success")
end
- describe '#legacy_stages' do
+ describe "#legacy_stages" do
subject { pipeline.legacy_stages }
- context 'stages list' do
- it 'returns ordered list of stages' do
+ context "stages list" do
+ it "returns ordered list of stages" do
expect(subject.map(&:name)).to eq(%w[build test deploy])
end
end
- context 'stages with statuses' do
+ context "stages with statuses" do
let(:statuses) do
subject.map { |stage| [stage.name, stage.status] }
end
- it 'returns list of stages with correct statuses' do
- expect(statuses).to eq([%w(build failed),
- %w(test success),
- %w(deploy running)])
+ it "returns list of stages with correct statuses" do
+ expect(statuses).to eq([%w[build failed],
+ %w[test success],
+ %w[deploy running],])
end
- context 'when commit status is retried' do
+ context "when commit status is retried" do
before do
create(:commit_status, pipeline: pipeline,
- stage: 'build',
- name: 'mac',
+ stage: "build",
+ name: "mac",
stage_idx: 0,
- status: 'success')
+ status: "success")
pipeline.process!
end
- it 'ignores the previous state' do
- expect(statuses).to eq([%w(build success),
- %w(test success),
- %w(deploy running)])
+ it "ignores the previous state" do
+ expect(statuses).to eq([%w[build success],
+ %w[test success],
+ %w[deploy running],])
end
end
end
- context 'when there is a stage with warnings' do
+ context "when there is a stage with warnings" do
before do
create(:commit_status, pipeline: pipeline,
- stage: 'deploy',
- name: 'prod:2',
+ stage: "deploy",
+ name: "prod:2",
stage_idx: 2,
- status: 'failed',
+ status: "failed",
allow_failure: true)
end
- it 'populates stage with correct number of warnings' do
+ it "populates stage with correct number of warnings" do
deploy_stage = pipeline.legacy_stages.third
expect(deploy_stage).not_to receive(:statuses)
@@ -841,116 +843,116 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#stages_count' do
- it 'returns a valid number of stages' do
+ describe "#stages_count" do
+ it "returns a valid number of stages" do
expect(pipeline.stages_count).to eq(3)
end
end
- describe '#stages_names' do
- it 'returns a valid names of stages' do
- expect(pipeline.stages_names).to eq(%w(build test deploy))
+ describe "#stages_names" do
+ it "returns a valid names of stages" do
+ expect(pipeline.stages_names).to eq(%w[build test deploy])
end
end
end
- describe '#legacy_stage' do
- subject { pipeline.legacy_stage('test') }
+ describe "#legacy_stage" do
+ subject { pipeline.legacy_stage("test") }
- context 'with status in stage' do
+ context "with status in stage" do
before do
- create(:commit_status, pipeline: pipeline, stage: 'test')
+ create(:commit_status, pipeline: pipeline, stage: "test")
end
it { expect(subject).to be_a Ci::LegacyStage }
- it { expect(subject.name).to eq 'test' }
+ it { expect(subject.name).to eq "test" }
it { expect(subject.statuses).not_to be_empty }
end
- context 'without status in stage' do
+ context "without status in stage" do
before do
- create(:commit_status, pipeline: pipeline, stage: 'build')
+ create(:commit_status, pipeline: pipeline, stage: "build")
end
- it 'return stage object' do
+ it "return stage object" do
is_expected.to be_nil
end
end
end
- describe '#stages' do
+ describe "#stages" do
before do
create(:ci_stage_entity, project: project,
pipeline: pipeline,
- name: 'build')
+ name: "build")
end
- it 'returns persisted stages' do
+ it "returns persisted stages" do
expect(pipeline.stages).not_to be_empty
expect(pipeline.stages).to all(be_persisted)
end
end
- describe '#ordered_stages' do
+ describe "#ordered_stages" do
before do
create(:ci_stage_entity, project: project,
pipeline: pipeline,
position: 4,
- name: 'deploy')
+ name: "deploy")
create(:ci_build, project: project,
pipeline: pipeline,
- stage: 'test',
+ stage: "test",
stage_idx: 3,
- name: 'test')
+ name: "test")
create(:ci_build, project: project,
pipeline: pipeline,
- stage: 'build',
+ stage: "build",
stage_idx: 2,
- name: 'build')
+ name: "build")
create(:ci_stage_entity, project: project,
pipeline: pipeline,
position: 1,
- name: 'sanity')
+ name: "sanity")
create(:ci_stage_entity, project: project,
pipeline: pipeline,
position: 5,
- name: 'cleanup')
+ name: "cleanup")
end
subject { pipeline.ordered_stages }
- context 'when using legacy stages' do
+ context "when using legacy stages" do
before do
stub_feature_flags(ci_pipeline_persisted_stages: false)
end
- it 'returns legacy stages in valid order' do
+ it "returns legacy stages in valid order" do
expect(subject.map(&:name)).to eq %w[build test]
end
end
- context 'when using persisted stages' do
+ context "when using persisted stages" do
before do
stub_feature_flags(ci_pipeline_persisted_stages: true)
end
- context 'when pipelines is not complete' do
- it 'still returns legacy stages' do
+ context "when pipelines is not complete" do
+ it "still returns legacy stages" do
expect(subject).to all(be_a Ci::LegacyStage)
expect(subject.map(&:name)).to eq %w[build test]
end
end
- context 'when pipeline is complete' do
+ context "when pipeline is complete" do
before do
pipeline.succeed!
end
- it 'returns stages in valid order' do
+ it "returns stages in valid order" do
expect(subject).to all(be_a Ci::Stage)
expect(subject.map(&:name))
.to eq %w[sanity build test deploy cleanup]
@@ -960,14 +962,14 @@ describe Ci::Pipeline, :mailer do
end
end
- describe 'state machine' do
+ describe "state machine" do
let(:current) { Time.now.change(usec: 0) }
- let(:build) { create_build('build1', queued_at: 0) }
- let(:build_b) { create_build('build2', queued_at: 0) }
- let(:build_c) { create_build('build3', queued_at: 0) }
+ let(:build) { create_build("build1", queued_at: 0) }
+ let(:build_b) { create_build("build2", queued_at: 0) }
+ let(:build_c) { create_build("build3", queued_at: 0) }
- describe '#duration' do
- context 'when multiple builds are finished' do
+ describe "#duration" do
+ context "when multiple builds are finished" do
before do
travel_to(current + 30) do
build.run!
@@ -985,16 +987,16 @@ describe Ci::Pipeline, :mailer do
end
end
- it 'matches sum of builds duration' do
+ it "matches sum of builds duration" do
pipeline.reload
expect(pipeline.duration).to eq(40)
end
end
- context 'when pipeline becomes blocked' do
- let!(:build) { create_build('build:1') }
- let!(:action) { create_build('manual:action', :manual) }
+ context "when pipeline becomes blocked" do
+ let!(:build) { create_build("build:1") }
+ let!(:action) { create_build("manual:action", :manual) }
before do
travel_to(current + 1.minute) do
@@ -1006,7 +1008,7 @@ describe Ci::Pipeline, :mailer do
end
end
- it 'recalculates pipeline duration' do
+ it "recalculates pipeline duration" do
pipeline.reload
expect(pipeline).to be_manual
@@ -1015,58 +1017,58 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#started_at' do
- it 'updates on transitioning to running' do
+ describe "#started_at" do
+ it "updates on transitioning to running" do
build.run
expect(pipeline.reload.started_at).not_to be_nil
end
- it 'does not update on transitioning to success' do
+ it "does not update on transitioning to success" do
build.success
expect(pipeline.reload.started_at).to be_nil
end
end
- describe '#finished_at' do
- it 'updates on transitioning to success' do
+ describe "#finished_at" do
+ it "updates on transitioning to success" do
build.success
expect(pipeline.reload.finished_at).not_to be_nil
end
- it 'does not update on transitioning to running' do
+ it "does not update on transitioning to running" do
build.run
expect(pipeline.reload.finished_at).to be_nil
end
end
- describe 'merge request metrics' do
+ describe "merge request metrics" do
let(:project) { create(:project, :repository) }
- let(:pipeline) { FactoryBot.create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: project.repository.commit('master').id) }
+ let(:pipeline) { FactoryBot.create(:ci_empty_pipeline, status: "created", project: project, ref: "master", sha: project.repository.commit("master").id) }
let!(:merge_request) { create(:merge_request, source_project: project, source_branch: pipeline.ref) }
before do
expect(PipelineMetricsWorker).to receive(:perform_async).with(pipeline.id)
end
- context 'when transitioning to running' do
- it 'schedules metrics workers' do
+ context "when transitioning to running" do
+ it "schedules metrics workers" do
pipeline.run
end
end
- context 'when transitioning to success' do
- it 'schedules metrics workers' do
+ context "when transitioning to success" do
+ it "schedules metrics workers" do
pipeline.succeed
end
end
end
- describe 'pipeline caching' do
- it 'performs ExpirePipelinesCacheWorker' do
+ describe "pipeline caching" do
+ it "performs ExpirePipelinesCacheWorker" do
expect(ExpirePipelineCacheWorker).to receive(:perform_async).with(pipeline.id)
pipeline.cancel
@@ -1075,107 +1077,107 @@ describe Ci::Pipeline, :mailer do
def create_build(name, *traits, queued_at: current, started_from: 0, **opts)
create(:ci_build, *traits,
- name: name,
- pipeline: pipeline,
- queued_at: queued_at,
- started_at: queued_at + started_from,
- **opts)
+ name: name,
+ pipeline: pipeline,
+ queued_at: queued_at,
+ started_at: queued_at + started_from,
+ **opts)
end
end
- describe '#branch?' do
+ describe "#branch?" do
subject { pipeline.branch? }
- context 'when ref is not a tag' do
+ context "when ref is not a tag" do
before do
pipeline.tag = false
end
- it 'return true' do
+ it "return true" do
is_expected.to be_truthy
end
- context 'when source is merge request' do
+ context "when source is merge request" do
let(:pipeline) do
create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'returns false' do
+ it "returns false" do
is_expected.to be_falsey
end
end
end
- context 'when ref is a tag' do
+ context "when ref is a tag" do
before do
pipeline.tag = true
end
- it 'return false' do
+ it "return false" do
is_expected.to be_falsey
end
end
end
- describe '#git_ref' do
+ describe "#git_ref" do
subject { pipeline.send(:git_ref) }
- context 'when ref is branch' do
+ context "when ref is branch" do
let(:pipeline) { create(:ci_pipeline, tag: false) }
- it 'returns branch ref' do
+ it "returns branch ref" do
is_expected.to eq(Gitlab::Git::BRANCH_REF_PREFIX + pipeline.ref.to_s)
end
end
- context 'when ref is tag' do
+ context "when ref is tag" do
let(:pipeline) { create(:ci_pipeline, tag: true) }
- it 'returns branch ref' do
+ it "returns branch ref" do
is_expected.to eq(Gitlab::Git::TAG_REF_PREFIX + pipeline.ref.to_s)
end
end
- context 'when ref is merge request' do
+ context "when ref is merge request" do
let(:pipeline) do
create(:ci_pipeline,
- source: :merge_request,
- merge_request: merge_request)
+ source: :merge_request,
+ merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'returns branch ref' do
+ it "returns branch ref" do
is_expected.to eq(Gitlab::Git::BRANCH_REF_PREFIX + pipeline.ref.to_s)
end
end
end
- describe 'ref_exists?' do
- context 'when repository exists' do
+ describe "ref_exists?" do
+ context "when repository exists" do
using RSpec::Parameterized::TableSyntax
let(:project) { create(:project, :repository) }
where(:tag, :ref, :result) do
- false | 'master' | true
- false | 'non-existent-branch' | false
- true | 'v1.1.0' | true
- true | 'non-existent-tag' | false
+ false | "master" | true
+ false | "non-existent-branch" | false
+ true | "v1.1.0" | true
+ true | "non-existent-tag" | false
end
with_them do
@@ -1189,223 +1191,224 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when repository does not exist' do
+ context "when repository does not exist" do
let(:pipeline) do
- create(:ci_empty_pipeline, project: project, ref: 'master')
+ create(:ci_empty_pipeline, project: project, ref: "master")
end
- it 'always returns false' do
+ it "always returns false" do
expect(pipeline.ref_exists?).to eq false
end
end
end
- context 'with non-empty project' do
+ context "with non-empty project" do
let(:project) { create(:project, :repository) }
let(:pipeline) do
create(:ci_pipeline,
- project: project,
- ref: project.default_branch,
- sha: project.commit.sha)
+ project: project,
+ ref: project.default_branch,
+ sha: project.commit.sha)
end
- describe '#latest?' do
- context 'with latest sha' do
- it 'returns true' do
+ describe "#latest?" do
+ context "with latest sha" do
+ it "returns true" do
expect(pipeline).to be_latest
end
end
- context 'with not latest sha' do
+ context "with not latest sha" do
before do
pipeline.update(
- sha: project.commit("#{project.default_branch}~1").sha)
+ sha: project.commit("#{project.default_branch}~1").sha
+ )
end
- it 'returns false' do
+ it "returns false" do
expect(pipeline).not_to be_latest
end
end
end
end
- describe '#manual_actions' do
+ describe "#manual_actions" do
subject { pipeline.manual_actions }
- it 'when none defined' do
+ it "when none defined" do
is_expected.to be_empty
end
- context 'when action defined' do
- let!(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') }
+ context "when action defined" do
+ let!(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: "deploy") }
- it 'returns one action' do
+ it "returns one action" do
is_expected.to contain_exactly(manual)
end
- context 'there are multiple of the same name' do
- let!(:manual2) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') }
+ context "there are multiple of the same name" do
+ let!(:manual2) { create(:ci_build, :manual, pipeline: pipeline, name: "deploy") }
before do
manual.update(retried: true)
end
- it 'returns latest one' do
+ it "returns latest one" do
is_expected.to contain_exactly(manual2)
end
end
end
end
- describe '#branch_updated?' do
- context 'when pipeline has before SHA' do
+ describe "#branch_updated?" do
+ context "when pipeline has before SHA" do
before do
- pipeline.update_column(:before_sha, 'a1b2c3d4')
+ pipeline.update_column(:before_sha, "a1b2c3d4")
end
- it 'runs on a branch update push' do
+ it "runs on a branch update push" do
expect(pipeline.before_sha).not_to be Gitlab::Git::BLANK_SHA
expect(pipeline.branch_updated?).to be true
end
end
- context 'when pipeline does not have before SHA' do
+ context "when pipeline does not have before SHA" do
before do
pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
end
- it 'does not run on a branch updating push' do
+ it "does not run on a branch updating push" do
expect(pipeline.branch_updated?).to be false
end
end
end
- describe '#modified_paths' do
- context 'when old and new revisions are set' do
+ describe "#modified_paths" do
+ context "when old and new revisions are set" do
let(:project) { create(:project, :repository) }
before do
- pipeline.update(before_sha: '1234abcd', sha: '2345bcde')
+ pipeline.update(before_sha: "1234abcd", sha: "2345bcde")
end
- it 'fetches stats for changes between commits' do
+ it "fetches stats for changes between commits" do
expect(project.repository)
- .to receive(:diff_stats).with('1234abcd', '2345bcde')
+ .to receive(:diff_stats).with("1234abcd", "2345bcde")
.and_call_original
pipeline.modified_paths
end
end
- context 'when either old or new revision is missing' do
+ context "when either old or new revision is missing" do
before do
pipeline.update_column(:before_sha, Gitlab::Git::BLANK_SHA)
end
- it 'returns nil' do
+ it "returns nil" do
expect(pipeline.modified_paths).to be_nil
end
end
- context 'when source is merge request' do
+ context "when source is merge request" do
let(:pipeline) do
create(:ci_pipeline, source: :merge_request, merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request,
- source_project: project,
- source_branch: 'feature',
- target_project: project,
- target_branch: 'master')
+ source_project: project,
+ source_branch: "feature",
+ target_project: project,
+ target_branch: "master")
end
- it 'returns merge request modified paths' do
+ it "returns merge request modified paths" do
expect(pipeline.modified_paths).to match(merge_request.modified_paths)
end
end
end
- describe '#has_kubernetes_active?' do
- context 'when kubernetes is active' do
- shared_examples 'same behavior between KubernetesService and Platform::Kubernetes' do
- it 'returns true' do
+ describe "#has_kubernetes_active?" do
+ context "when kubernetes is active" do
+ shared_examples "same behavior between KubernetesService and Platform::Kubernetes" do
+ it "returns true" do
expect(pipeline).to have_kubernetes_active
end
end
- context 'when user configured kubernetes from Integration > Kubernetes' do
+ context "when user configured kubernetes from Integration > Kubernetes" do
let(:project) { create(:kubernetes_project) }
- it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
+ it_behaves_like "same behavior between KubernetesService and Platform::Kubernetes"
end
- context 'when user configured kubernetes from CI/CD > Clusters' do
+ context "when user configured kubernetes from CI/CD > Clusters" do
let!(:cluster) { create(:cluster, :project, :provided_by_gcp) }
let(:project) { cluster.project }
- it_behaves_like 'same behavior between KubernetesService and Platform::Kubernetes'
+ it_behaves_like "same behavior between KubernetesService and Platform::Kubernetes"
end
end
- context 'when kubernetes is not active' do
- it 'returns false' do
+ context "when kubernetes is not active" do
+ it "returns false" do
expect(pipeline).not_to have_kubernetes_active
end
end
end
- describe '#has_warnings?' do
+ describe "#has_warnings?" do
subject { pipeline.has_warnings? }
- context 'build which is allowed to fail fails' do
+ context "build which is allowed to fail fails" do
before do
- create :ci_build, :success, pipeline: pipeline, name: 'rspec'
- create :ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop'
+ create :ci_build, :success, pipeline: pipeline, name: "rspec"
+ create :ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: "rubocop"
end
- it 'returns true' do
+ it "returns true" do
is_expected.to be_truthy
end
end
- context 'build which is allowed to fail succeeds' do
+ context "build which is allowed to fail succeeds" do
before do
- create :ci_build, :success, pipeline: pipeline, name: 'rspec'
- create :ci_build, :allowed_to_fail, :success, pipeline: pipeline, name: 'rubocop'
+ create :ci_build, :success, pipeline: pipeline, name: "rspec"
+ create :ci_build, :allowed_to_fail, :success, pipeline: pipeline, name: "rubocop"
end
- it 'returns false' do
+ it "returns false" do
is_expected.to be_falsey
end
end
- context 'build is retried and succeeds' do
+ context "build is retried and succeeds" do
before do
- create :ci_build, :success, pipeline: pipeline, name: 'rubocop'
- create :ci_build, :failed, pipeline: pipeline, name: 'rspec'
- create :ci_build, :success, pipeline: pipeline, name: 'rspec'
+ create :ci_build, :success, pipeline: pipeline, name: "rubocop"
+ create :ci_build, :failed, pipeline: pipeline, name: "rspec"
+ create :ci_build, :success, pipeline: pipeline, name: "rspec"
end
- it 'returns false' do
+ it "returns false" do
is_expected.to be_falsey
end
end
end
- describe '#number_of_warnings' do
- it 'returns the number of warnings' do
- create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop')
+ describe "#number_of_warnings" do
+ it "returns the number of warnings" do
+ create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: "rubocop")
expect(pipeline.number_of_warnings).to eq(1)
end
- it 'supports eager loading of the number of warnings' do
+ it "supports eager loading of the number of warnings" do
pipeline2 = create(:ci_empty_pipeline, status: :created, project: project)
- create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: 'rubocop')
- create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline2, name: 'rubocop')
+ create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline, name: "rubocop")
+ create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline2, name: "rubocop")
pipelines = project.ci_pipelines.to_a
@@ -1421,12 +1424,12 @@ describe Ci::Pipeline, :mailer do
end
end
- shared_context 'with some outdated pipelines' do
+ shared_context "with some outdated pipelines" do
before do
- create_pipeline(:canceled, 'ref', 'A', project)
- create_pipeline(:success, 'ref', 'A', project)
- create_pipeline(:failed, 'ref', 'B', project)
- create_pipeline(:skipped, 'feature', 'C', project)
+ create_pipeline(:canceled, "ref", "A", project)
+ create_pipeline(:success, "ref", "A", project)
+ create_pipeline(:failed, "ref", "B", project)
+ create_pipeline(:skipped, "feature", "C", project)
end
def create_pipeline(status, ref, sha, project)
@@ -1440,75 +1443,75 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '.newest_first' do
- include_context 'with some outdated pipelines'
+ describe ".newest_first" do
+ include_context "with some outdated pipelines"
- it 'returns the pipelines from new to old' do
+ it "returns the pipelines from new to old" do
expect(described_class.newest_first.pluck(:status))
.to eq(%w[skipped failed success canceled])
end
- it 'searches limited backlog' do
+ it "searches limited backlog" do
expect(described_class.newest_first(limit: 1).pluck(:status))
.to eq(%w[skipped])
end
end
- describe '.latest_status' do
- include_context 'with some outdated pipelines'
+ describe ".latest_status" do
+ include_context "with some outdated pipelines"
- context 'when no ref is specified' do
- it 'returns the status of the latest pipeline' do
- expect(described_class.latest_status).to eq('skipped')
+ context "when no ref is specified" do
+ it "returns the status of the latest pipeline" do
+ expect(described_class.latest_status).to eq("skipped")
end
end
- context 'when ref is specified' do
- it 'returns the status of the latest pipeline for the given ref' do
- expect(described_class.latest_status('ref')).to eq('failed')
+ context "when ref is specified" do
+ it "returns the status of the latest pipeline for the given ref" do
+ expect(described_class.latest_status("ref")).to eq("failed")
end
end
end
- describe '.latest_successful_for' do
- include_context 'with some outdated pipelines'
+ describe ".latest_successful_for" do
+ include_context "with some outdated pipelines"
let!(:latest_successful_pipeline) do
- create_pipeline(:success, 'ref', 'D', project)
+ create_pipeline(:success, "ref", "D", project)
end
- it 'returns the latest successful pipeline' do
- expect(described_class.latest_successful_for('ref'))
+ it "returns the latest successful pipeline" do
+ expect(described_class.latest_successful_for("ref"))
.to eq(latest_successful_pipeline)
end
end
- describe '.latest_successful_for_refs' do
- include_context 'with some outdated pipelines'
+ describe ".latest_successful_for_refs" do
+ include_context "with some outdated pipelines"
let!(:latest_successful_pipeline1) do
- create_pipeline(:success, 'ref1', 'D', project)
+ create_pipeline(:success, "ref1", "D", project)
end
let!(:latest_successful_pipeline2) do
- create_pipeline(:success, 'ref2', 'D', project)
+ create_pipeline(:success, "ref2", "D", project)
end
- it 'returns the latest successful pipeline for both refs' do
- refs = %w(ref1 ref2 ref3)
+ it "returns the latest successful pipeline for both refs" do
+ refs = %w[ref1 ref2 ref3]
- expect(described_class.latest_successful_for_refs(refs)).to eq({ 'ref1' => latest_successful_pipeline1, 'ref2' => latest_successful_pipeline2 })
+ expect(described_class.latest_successful_for_refs(refs)).to eq({"ref1" => latest_successful_pipeline1, "ref2" => latest_successful_pipeline2})
end
end
- describe '.latest_status_per_commit' do
+ describe ".latest_status_per_commit" do
let(:project) { create(:project) }
before do
pairs = [
%w[success ref1 123],
%w[manual master 123],
- %w[failed ref 456]
+ %w[failed ref 456],
]
pairs.each do |(status, ref, sha)|
@@ -1522,115 +1525,115 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'without a ref' do
- it 'returns a Hash containing the latest status per commit for all refs' do
+ context "without a ref" do
+ it "returns a Hash containing the latest status per commit for all refs" do
expect(described_class.latest_status_per_commit(%w[123 456]))
- .to eq({ '123' => 'manual', '456' => 'failed' })
+ .to eq({"123" => "manual", "456" => "failed"})
end
- it 'only includes the status of the given commit SHAs' do
+ it "only includes the status of the given commit SHAs" do
expect(described_class.latest_status_per_commit(%w[123]))
- .to eq({ '123' => 'manual' })
+ .to eq({"123" => "manual"})
end
- context 'when there are two pipelines for a ref and SHA' do
- it 'returns the status of the latest pipeline' do
+ context "when there are two pipelines for a ref and SHA" do
+ it "returns the status of the latest pipeline" do
create(
:ci_empty_pipeline,
- status: 'failed',
- ref: 'master',
- sha: '123',
+ status: "failed",
+ ref: "master",
+ sha: "123",
project: project
)
expect(described_class.latest_status_per_commit(%w[123]))
- .to eq({ '123' => 'failed' })
+ .to eq({"123" => "failed"})
end
end
end
- context 'with a ref' do
- it 'only includes the pipelines for the given ref' do
- expect(described_class.latest_status_per_commit(%w[123 456], 'master'))
- .to eq({ '123' => 'manual' })
+ context "with a ref" do
+ it "only includes the pipelines for the given ref" do
+ expect(described_class.latest_status_per_commit(%w[123 456], "master"))
+ .to eq({"123" => "manual"})
end
end
end
- describe '.latest_successful_ids_per_project' do
+ describe ".latest_successful_ids_per_project" do
let(:projects) { create_list(:project, 2) }
let!(:pipeline1) { create(:ci_pipeline, :success, project: projects[0]) }
let!(:pipeline2) { create(:ci_pipeline, :success, project: projects[0]) }
let!(:pipeline3) { create(:ci_pipeline, :failed, project: projects[0]) }
let!(:pipeline4) { create(:ci_pipeline, :success, project: projects[1]) }
- it 'returns expected pipeline ids' do
+ it "returns expected pipeline ids" do
expect(described_class.latest_successful_ids_per_project)
.to contain_exactly(pipeline2, pipeline4)
end
end
- describe '.internal_sources' do
+ describe ".internal_sources" do
subject { described_class.internal_sources }
it { is_expected.to be_an(Array) }
end
- describe '#status' do
+ describe "#status" do
let(:build) do
- create(:ci_build, :created, pipeline: pipeline, name: 'test')
+ create(:ci_build, :created, pipeline: pipeline, name: "test")
end
subject { pipeline.reload.status }
- context 'on queuing' do
+ context "on queuing" do
before do
build.enqueue
end
- it { is_expected.to eq('pending') }
+ it { is_expected.to eq("pending") }
end
- context 'on run' do
+ context "on run" do
before do
build.enqueue
build.run
end
- it { is_expected.to eq('running') }
+ it { is_expected.to eq("running") }
end
- context 'on drop' do
+ context "on drop" do
before do
build.drop
end
- it { is_expected.to eq('failed') }
+ it { is_expected.to eq("failed") }
end
- context 'on success' do
+ context "on success" do
before do
build.success
end
- it { is_expected.to eq('success') }
+ it { is_expected.to eq("success") }
end
- context 'on cancel' do
+ context "on cancel" do
before do
build.cancel
end
- context 'when build is pending' do
+ context "when build is pending" do
let(:build) do
create(:ci_build, :pending, pipeline: pipeline)
end
- it { is_expected.to eq('canceled') }
+ it { is_expected.to eq("canceled") }
end
end
- context 'on failure and build retry' do
+ context "on failure and build retry" do
before do
stub_not_protect_default_branch
@@ -1644,11 +1647,11 @@ describe Ci::Pipeline, :mailer do
# Instead of: created > failed > pending
# Since the pipeline already run, so it should not be pending anymore
- it { is_expected.to eq('running') }
+ it { is_expected.to eq("running") }
end
end
- describe '#ci_yaml_file_path' do
+ describe "#ci_yaml_file_path" do
subject { pipeline.ci_yaml_file_path }
%i[unknown_source repository_source].each do |source|
@@ -1657,74 +1660,74 @@ describe Ci::Pipeline, :mailer do
pipeline.config_source = described_class.config_sources.fetch(source)
end
- it 'returns the path from project' do
- allow(pipeline.project).to receive(:ci_config_path) { 'custom/path' }
+ it "returns the path from project" do
+ allow(pipeline.project).to receive(:ci_config_path) { "custom/path" }
- is_expected.to eq('custom/path')
+ is_expected.to eq("custom/path")
end
- it 'returns default when custom path is nil' do
+ it "returns default when custom path is nil" do
allow(pipeline.project).to receive(:ci_config_path) { nil }
- is_expected.to eq('.gitlab-ci.yml')
+ is_expected.to eq(".gitlab-ci.yml")
end
- it 'returns default when custom path is empty' do
- allow(pipeline.project).to receive(:ci_config_path) { '' }
+ it "returns default when custom path is empty" do
+ allow(pipeline.project).to receive(:ci_config_path) { "" }
- is_expected.to eq('.gitlab-ci.yml')
+ is_expected.to eq(".gitlab-ci.yml")
end
end
end
- context 'when pipeline is for auto-devops' do
+ context "when pipeline is for auto-devops" do
before do
- pipeline.config_source = 'auto_devops_source'
+ pipeline.config_source = "auto_devops_source"
end
- it 'does not return config file' do
+ it "does not return config file" do
is_expected.to be_nil
end
end
end
- describe '#set_config_source' do
- context 'when pipelines does not contain needed data and auto devops is disabled' do
+ describe "#set_config_source" do
+ context "when pipelines does not contain needed data and auto devops is disabled" do
before do
stub_application_setting(auto_devops_enabled: false)
end
- it 'defines source to be unknown' do
+ it "defines source to be unknown" do
pipeline.set_config_source
expect(pipeline).to be_unknown_source
end
end
- context 'when pipeline contains all needed data' do
+ context "when pipeline contains all needed data" do
let(:pipeline) do
create(:ci_pipeline, project: project,
- sha: '1234',
- ref: 'master',
+ sha: "1234",
+ ref: "master",
source: :push)
end
- context 'when the repository has a config file' do
+ context "when the repository has a config file" do
before do
allow(project.repository).to receive(:gitlab_ci_yml_for)
- .and_return('config')
+ .and_return("config")
end
- it 'defines source to be from repository' do
+ it "defines source to be from repository" do
pipeline.set_config_source
expect(pipeline).to be_repository_source
end
- context 'when loading an object' do
+ context "when loading an object" do
let(:new_pipeline) { Ci::Pipeline.find(pipeline.id) }
- it 'does not redefine the source' do
+ it "does not redefine the source" do
# force to overwrite the source
pipeline.unknown_source!
@@ -1733,15 +1736,15 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when the repository does not have a config file' do
- let(:implied_yml) { Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps').content }
+ context "when the repository does not have a config file" do
+ let(:implied_yml) { Gitlab::Template::GitlabCiYmlTemplate.find("Auto-DevOps").content }
- context 'auto devops enabled' do
+ context "auto devops enabled" do
before do
- allow(project).to receive(:ci_config_path) { 'custom' }
+ allow(project).to receive(:ci_config_path) { "custom" }
end
- it 'defines source to be auto devops' do
+ it "defines source to be auto devops" do
pipeline.set_config_source
expect(pipeline).to be_auto_devops_source
@@ -1751,38 +1754,38 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#ci_yaml_file' do
- let(:implied_yml) { Gitlab::Template::GitlabCiYmlTemplate.find('Auto-DevOps').content }
+ describe "#ci_yaml_file" do
+ let(:implied_yml) { Gitlab::Template::GitlabCiYmlTemplate.find("Auto-DevOps").content }
- context 'the source is unknown' do
+ context "the source is unknown" do
before do
pipeline.unknown_source!
end
- it 'returns the configuration if found' do
+ it "returns the configuration if found" do
allow(pipeline.project.repository).to receive(:gitlab_ci_yml_for)
- .and_return('config')
+ .and_return("config")
expect(pipeline.ci_yaml_file).to be_a(String)
expect(pipeline.ci_yaml_file).not_to eq(implied_yml)
expect(pipeline.yaml_errors).to be_nil
end
- it 'sets yaml errors if not found' do
+ it "sets yaml errors if not found" do
expect(pipeline.ci_yaml_file).to be_nil
expect(pipeline.yaml_errors)
- .to start_with('Failed to load CI/CD config file')
+ .to start_with("Failed to load CI/CD config file")
end
end
- context 'the source is the repository' do
+ context "the source is the repository" do
before do
pipeline.repository_source!
end
- it 'returns the configuration if found' do
+ it "returns the configuration if found" do
allow(pipeline.project.repository).to receive(:gitlab_ci_yml_for)
- .and_return('config')
+ .and_return("config")
expect(pipeline.ci_yaml_file).to be_a(String)
expect(pipeline.ci_yaml_file).not_to eq(implied_yml)
@@ -1790,157 +1793,157 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when the source is auto_devops_source' do
+ context "when the source is auto_devops_source" do
before do
stub_application_setting(auto_devops_enabled: true)
pipeline.auto_devops_source!
end
- it 'finds the implied config' do
+ it "finds the implied config" do
expect(pipeline.ci_yaml_file).to eq(implied_yml)
expect(pipeline.yaml_errors).to be_nil
end
end
end
- describe '#update_status' do
- context 'when pipeline is empty' do
- it 'updates does not change pipeline status' do
+ describe "#update_status" do
+ context "when pipeline is empty" do
+ it "updates does not change pipeline status" do
expect(pipeline.statuses.latest.status).to be_nil
expect { pipeline.update_status }
- .to change { pipeline.reload.status }.to 'skipped'
+ .to change { pipeline.reload.status }.to "skipped"
end
end
- context 'when updating status to pending' do
+ context "when updating status to pending" do
before do
allow(pipeline)
.to receive_message_chain(:statuses, :latest, :status)
.and_return(:running)
end
- it 'updates pipeline status to running' do
+ it "updates pipeline status to running" do
expect { pipeline.update_status }
- .to change { pipeline.reload.status }.to 'running'
+ .to change { pipeline.reload.status }.to "running"
end
end
- context 'when updating status to scheduled' do
+ context "when updating status to scheduled" do
before do
allow(pipeline)
.to receive_message_chain(:statuses, :latest, :status)
.and_return(:scheduled)
end
- it 'updates pipeline status to scheduled' do
+ it "updates pipeline status to scheduled" do
expect { pipeline.update_status }
- .to change { pipeline.reload.status }.to 'scheduled'
+ .to change { pipeline.reload.status }.to "scheduled"
end
end
- context 'when statuses status was not recognized' do
+ context "when statuses status was not recognized" do
before do
allow(pipeline)
.to receive(:latest_builds_status)
.and_return(:unknown)
end
- it 'raises an exception' do
+ it "raises an exception" do
expect { pipeline.update_status }
.to raise_error(HasStatus::UnknownStatusError)
end
end
end
- describe '#detailed_status' do
+ describe "#detailed_status" do
subject { pipeline.detailed_status(user) }
- context 'when pipeline is created' do
+ context "when pipeline is created" do
let(:pipeline) { create(:ci_pipeline, status: :created) }
- it 'returns detailed status for created pipeline' do
- expect(subject.text).to eq 'created'
+ it "returns detailed status for created pipeline" do
+ expect(subject.text).to eq "created"
end
end
- context 'when pipeline is pending' do
+ context "when pipeline is pending" do
let(:pipeline) { create(:ci_pipeline, status: :pending) }
- it 'returns detailed status for pending pipeline' do
- expect(subject.text).to eq 'pending'
+ it "returns detailed status for pending pipeline" do
+ expect(subject.text).to eq "pending"
end
end
- context 'when pipeline is running' do
+ context "when pipeline is running" do
let(:pipeline) { create(:ci_pipeline, status: :running) }
- it 'returns detailed status for running pipeline' do
- expect(subject.text).to eq 'running'
+ it "returns detailed status for running pipeline" do
+ expect(subject.text).to eq "running"
end
end
- context 'when pipeline is successful' do
+ context "when pipeline is successful" do
let(:pipeline) { create(:ci_pipeline, status: :success) }
- it 'returns detailed status for successful pipeline' do
- expect(subject.text).to eq 'passed'
+ it "returns detailed status for successful pipeline" do
+ expect(subject.text).to eq "passed"
end
end
- context 'when pipeline is failed' do
+ context "when pipeline is failed" do
let(:pipeline) { create(:ci_pipeline, status: :failed) }
- it 'returns detailed status for failed pipeline' do
- expect(subject.text).to eq 'failed'
+ it "returns detailed status for failed pipeline" do
+ expect(subject.text).to eq "failed"
end
end
- context 'when pipeline is canceled' do
+ context "when pipeline is canceled" do
let(:pipeline) { create(:ci_pipeline, status: :canceled) }
- it 'returns detailed status for canceled pipeline' do
- expect(subject.text).to eq 'canceled'
+ it "returns detailed status for canceled pipeline" do
+ expect(subject.text).to eq "canceled"
end
end
- context 'when pipeline is skipped' do
+ context "when pipeline is skipped" do
let(:pipeline) { create(:ci_pipeline, status: :skipped) }
- it 'returns detailed status for skipped pipeline' do
- expect(subject.text).to eq 'skipped'
+ it "returns detailed status for skipped pipeline" do
+ expect(subject.text).to eq "skipped"
end
end
- context 'when pipeline is blocked' do
+ context "when pipeline is blocked" do
let(:pipeline) { create(:ci_pipeline, status: :manual) }
- it 'returns detailed status for blocked pipeline' do
- expect(subject.text).to eq 'blocked'
+ it "returns detailed status for blocked pipeline" do
+ expect(subject.text).to eq "blocked"
end
end
- context 'when pipeline is successful but with warnings' do
+ context "when pipeline is successful but with warnings" do
let(:pipeline) { create(:ci_pipeline, status: :success) }
before do
create(:ci_build, :allowed_to_fail, :failed, pipeline: pipeline)
end
- it 'retruns detailed status for successful pipeline with warnings' do
- expect(subject.label).to eq 'passed with warnings'
+ it "retruns detailed status for successful pipeline with warnings" do
+ expect(subject.label).to eq "passed with warnings"
end
end
end
- describe '#cancelable?' do
+ describe "#cancelable?" do
%i[created running pending].each do |status0|
context "when there is a build #{status0}" do
before do
create(:ci_build, status0, pipeline: pipeline)
end
- it 'is cancelable' do
+ it "is cancelable" do
expect(pipeline.cancelable?).to be_truthy
end
end
@@ -1950,7 +1953,7 @@ describe Ci::Pipeline, :mailer do
create(:generic_commit_status, status0, pipeline: pipeline)
end
- it 'is cancelable' do
+ it "is cancelable" do
expect(pipeline.cancelable?).to be_truthy
end
end
@@ -1962,7 +1965,7 @@ describe Ci::Pipeline, :mailer do
create(:generic_commit_status, status1, pipeline: pipeline)
end
- it 'is cancelable' do
+ it "is cancelable" do
expect(pipeline.cancelable?).to be_truthy
end
end
@@ -1973,7 +1976,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_build, status1, pipeline: pipeline)
end
- it 'is cancelable' do
+ it "is cancelable" do
expect(pipeline.cancelable?).to be_truthy
end
end
@@ -1984,7 +1987,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_build, status1, pipeline: pipeline)
end
- it 'is cancelable' do
+ it "is cancelable" do
expect(pipeline.cancelable?).to be_truthy
end
end
@@ -1997,7 +2000,7 @@ describe Ci::Pipeline, :mailer do
create(:ci_build, status, pipeline: pipeline)
end
- it 'is not cancelable' do
+ it "is not cancelable" do
expect(pipeline.cancelable?).to be_falsey
end
end
@@ -2007,27 +2010,27 @@ describe Ci::Pipeline, :mailer do
create(:generic_commit_status, status, pipeline: pipeline)
end
- it 'is not cancelable' do
+ it "is not cancelable" do
expect(pipeline.cancelable?).to be_falsey
end
end
end
- context 'when there is a manual action present in the pipeline' do
+ context "when there is a manual action present in the pipeline" do
before do
create(:ci_build, :manual, pipeline: pipeline)
end
- it 'is not cancelable' do
+ it "is not cancelable" do
expect(pipeline).not_to be_cancelable
end
end
end
- describe '#cancel_running' do
+ describe "#cancel_running" do
let(:latest_status) { pipeline.statuses.pluck(:status) }
- context 'when there is a running external job and a regular job' do
+ context "when there is a running external job and a regular job" do
before do
create(:ci_build, :running, pipeline: pipeline)
create(:generic_commit_status, :running, pipeline: pipeline)
@@ -2035,12 +2038,12 @@ describe Ci::Pipeline, :mailer do
pipeline.cancel_running
end
- it 'cancels both jobs' do
- expect(latest_status).to contain_exactly('canceled', 'canceled')
+ it "cancels both jobs" do
+ expect(latest_status).to contain_exactly("canceled", "canceled")
end
end
- context 'when jobs are in different stages' do
+ context "when jobs are in different stages" do
before do
create(:ci_build, :running, stage_idx: 0, pipeline: pipeline)
create(:ci_build, :running, stage_idx: 1, pipeline: pipeline)
@@ -2048,12 +2051,12 @@ describe Ci::Pipeline, :mailer do
pipeline.cancel_running
end
- it 'cancels both jobs' do
- expect(latest_status).to contain_exactly('canceled', 'canceled')
+ it "cancels both jobs" do
+ expect(latest_status).to contain_exactly("canceled", "canceled")
end
end
- context 'when there are created builds present in the pipeline' do
+ context "when there are created builds present in the pipeline" do
before do
create(:ci_build, :running, stage_idx: 0, pipeline: pipeline)
create(:ci_build, :created, stage_idx: 1, pipeline: pipeline)
@@ -2061,13 +2064,13 @@ describe Ci::Pipeline, :mailer do
pipeline.cancel_running
end
- it 'cancels created builds' do
- expect(latest_status).to eq %w(canceled canceled)
+ it "cancels created builds" do
+ expect(latest_status).to eq %w[canceled canceled]
end
end
end
- describe '#retry_failed' do
+ describe "#retry_failed" do
let(:latest_status) { pipeline.statuses.latest.pluck(:status) }
before do
@@ -2076,49 +2079,49 @@ describe Ci::Pipeline, :mailer do
project.add_developer(user)
end
- context 'when there is a failed build and failed external status' do
+ context "when there is a failed build and failed external status" do
before do
- create(:ci_build, :failed, name: 'build', pipeline: pipeline)
- create(:generic_commit_status, :failed, name: 'jenkins', pipeline: pipeline)
+ create(:ci_build, :failed, name: "build", pipeline: pipeline)
+ create(:generic_commit_status, :failed, name: "jenkins", pipeline: pipeline)
pipeline.retry_failed(user)
end
- it 'retries only build' do
- expect(latest_status).to contain_exactly('pending', 'failed')
+ it "retries only build" do
+ expect(latest_status).to contain_exactly("pending", "failed")
end
end
- context 'when builds are in different stages' do
+ context "when builds are in different stages" do
before do
- create(:ci_build, :failed, name: 'build', stage_idx: 0, pipeline: pipeline)
- create(:ci_build, :failed, name: 'jenkins', stage_idx: 1, pipeline: pipeline)
+ create(:ci_build, :failed, name: "build", stage_idx: 0, pipeline: pipeline)
+ create(:ci_build, :failed, name: "jenkins", stage_idx: 1, pipeline: pipeline)
pipeline.retry_failed(user)
end
- it 'retries both builds' do
- expect(latest_status).to contain_exactly('pending', 'created')
+ it "retries both builds" do
+ expect(latest_status).to contain_exactly("pending", "created")
end
end
- context 'when there are canceled and failed' do
+ context "when there are canceled and failed" do
before do
- create(:ci_build, :failed, name: 'build', stage_idx: 0, pipeline: pipeline)
- create(:ci_build, :canceled, name: 'jenkins', stage_idx: 1, pipeline: pipeline)
+ create(:ci_build, :failed, name: "build", stage_idx: 0, pipeline: pipeline)
+ create(:ci_build, :canceled, name: "jenkins", stage_idx: 1, pipeline: pipeline)
pipeline.retry_failed(user)
end
- it 'retries both builds' do
- expect(latest_status).to contain_exactly('pending', 'created')
+ it "retries both builds" do
+ expect(latest_status).to contain_exactly("pending", "created")
end
end
end
- describe '#execute_hooks' do
- let!(:build_a) { create_build('a', 0) }
- let!(:build_b) { create_build('b', 0) }
+ describe "#execute_hooks" do
+ let!(:build_a) { create_build("a", 0) }
+ let!(:build_b) { create_build("b", 0) }
let!(:hook) do
create(:project_hook, project: project, pipeline_events: enabled)
@@ -2128,26 +2131,26 @@ describe Ci::Pipeline, :mailer do
WebHookWorker.drain
end
- context 'with pipeline hooks enabled' do
+ context "with pipeline hooks enabled" do
let(:enabled) { true }
before do
WebMock.stub_request(:post, hook.url)
end
- context 'with multiple builds' do
- context 'when build is queued' do
+ context "with multiple builds" do
+ context "when build is queued" do
before do
build_a.enqueue
build_b.enqueue
end
- it 'receives a pending event once' do
- expect(WebMock).to have_requested_pipeline_hook('pending').once
+ it "receives a pending event once" do
+ expect(WebMock).to have_requested_pipeline_hook("pending").once
end
end
- context 'when build is run' do
+ context "when build is run" do
before do
build_a.enqueue
build_a.run
@@ -2155,12 +2158,12 @@ describe Ci::Pipeline, :mailer do
build_b.run
end
- it 'receives a running event once' do
- expect(WebMock).to have_requested_pipeline_hook('running').once
+ it "receives a running event once" do
+ expect(WebMock).to have_requested_pipeline_hook("running").once
end
end
- context 'when all builds succeed' do
+ context "when all builds succeed" do
before do
build_a.success
@@ -2168,34 +2171,34 @@ describe Ci::Pipeline, :mailer do
build_b.reload.success
end
- it 'receives a success event once' do
- expect(WebMock).to have_requested_pipeline_hook('success').once
+ it "receives a success event once" do
+ expect(WebMock).to have_requested_pipeline_hook("success").once
end
end
- context 'when stage one failed' do
- let!(:build_b) { create_build('b', 1) }
+ context "when stage one failed" do
+ let!(:build_b) { create_build("b", 1) }
before do
build_a.drop
end
- it 'receives a failed event once' do
- expect(WebMock).to have_requested_pipeline_hook('failed').once
+ it "receives a failed event once" do
+ expect(WebMock).to have_requested_pipeline_hook("failed").once
end
end
def have_requested_pipeline_hook(status)
have_requested(:post, hook.url).with do |req|
json_body = JSON.parse(req.body)
- json_body['object_attributes']['status'] == status &&
- json_body['builds'].length == 2
+ json_body["object_attributes"]["status"] == status &&
+ json_body["builds"].length == 2
end
end
end
end
- context 'with pipeline hooks disabled' do
+ context "with pipeline hooks disabled" do
let(:enabled) { false }
before do
@@ -2203,40 +2206,40 @@ describe Ci::Pipeline, :mailer do
build_b.enqueue
end
- it 'did not execute pipeline_hook after touched' do
+ it "did not execute pipeline_hook after touched" do
expect(WebMock).not_to have_requested(:post, hook.url)
end
end
def create_build(name, stage_idx)
create(:ci_build,
- :created,
- pipeline: pipeline,
- name: name,
- stage_idx: stage_idx)
+ :created,
+ pipeline: pipeline,
+ name: name,
+ stage_idx: stage_idx)
end
end
describe "#merge_requests" do
let(:project) { create(:project) }
- let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: project, ref: 'master', sha: 'a288a022a53a5a944fae87bcec6efc87b7061808') }
+ let(:pipeline) { create(:ci_empty_pipeline, status: "created", project: project, ref: "master", sha: "a288a022a53a5a944fae87bcec6efc87b7061808") }
it "returns merge requests whose `diff_head_sha` matches the pipeline's SHA" do
- allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { 'a288a022a53a5a944fae87bcec6efc87b7061808' }
+ allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { "a288a022a53a5a944fae87bcec6efc87b7061808" }
merge_request = create(:merge_request, source_project: project, head_pipeline: pipeline, source_branch: pipeline.ref)
expect(pipeline.merge_requests).to eq([merge_request])
end
it "doesn't return merge requests whose source branch doesn't match the pipeline's ref" do
- create(:merge_request, source_project: project, source_branch: 'feature', target_branch: 'master')
+ create(:merge_request, source_project: project, source_branch: "feature", target_branch: "master")
expect(pipeline.merge_requests).to be_empty
end
it "doesn't return merge requests whose `diff_head_sha` doesn't match the pipeline's SHA" do
create(:merge_request, source_project: project, source_branch: pipeline.ref)
- allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { '97de212e80737a608d939f648d959671fb0a0142b' }
+ allow_any_instance_of(MergeRequest).to receive(:diff_head_sha) { "97de212e80737a608d939f648d959671fb0a0142b" }
expect(pipeline.merge_requests).to be_empty
end
@@ -2245,8 +2248,8 @@ describe Ci::Pipeline, :mailer do
describe "#all_merge_requests" do
let(:project) { create(:project) }
- shared_examples 'a method that returns all merge requests for a given pipeline' do
- let(:pipeline) { create(:ci_empty_pipeline, status: 'created', project: pipeline_project, ref: 'master') }
+ shared_examples "a method that returns all merge requests for a given pipeline" do
+ let(:pipeline) { create(:ci_empty_pipeline, status: "created", project: pipeline_project, ref: "master") }
it "returns all merge requests having the same source branch" do
merge_request = create(:merge_request, source_project: pipeline_project, target_project: project, source_branch: pipeline.ref)
@@ -2255,133 +2258,133 @@ describe Ci::Pipeline, :mailer do
end
it "doesn't return merge requests having a different source branch" do
- create(:merge_request, source_project: pipeline_project, target_project: project, source_branch: 'feature', target_branch: 'master')
+ create(:merge_request, source_project: pipeline_project, target_project: project, source_branch: "feature", target_branch: "master")
expect(pipeline.all_merge_requests).to be_empty
end
- context 'when there is a merge request pipeline' do
- let(:source_branch) { 'feature' }
- let(:target_branch) { 'master' }
+ context "when there is a merge request pipeline" do
+ let(:source_branch) { "feature" }
+ let(:target_branch) { "master" }
let!(:pipeline) do
create(:ci_pipeline,
- source: :merge_request,
- project: pipeline_project,
- ref: source_branch,
- merge_request: merge_request)
+ source: :merge_request,
+ project: pipeline_project,
+ ref: source_branch,
+ merge_request: merge_request)
end
let(:merge_request) do
create(:merge_request,
- source_project: pipeline_project,
- source_branch: source_branch,
- target_project: project,
- target_branch: target_branch)
+ source_project: pipeline_project,
+ source_branch: source_branch,
+ target_project: project,
+ target_branch: target_branch)
end
- it 'returns an associated merge request' do
+ it "returns an associated merge request" do
expect(pipeline.all_merge_requests).to eq([merge_request])
end
- context 'when there is another merge request pipeline that targets a different branch' do
- let(:target_branch_2) { 'merge-test' }
+ context "when there is another merge request pipeline that targets a different branch" do
+ let(:target_branch_2) { "merge-test" }
let!(:pipeline_2) do
create(:ci_pipeline,
- source: :merge_request,
- project: pipeline_project,
- ref: source_branch,
- merge_request: merge_request_2)
+ source: :merge_request,
+ project: pipeline_project,
+ ref: source_branch,
+ merge_request: merge_request_2)
end
let(:merge_request_2) do
create(:merge_request,
- source_project: pipeline_project,
- source_branch: source_branch,
- target_project: project,
- target_branch: target_branch_2)
+ source_project: pipeline_project,
+ source_branch: source_branch,
+ target_project: project,
+ target_branch: target_branch_2)
end
- it 'does not return an associated merge request' do
+ it "does not return an associated merge request" do
expect(pipeline.all_merge_requests).not_to include(merge_request_2)
end
end
end
end
- it_behaves_like 'a method that returns all merge requests for a given pipeline' do
+ it_behaves_like "a method that returns all merge requests for a given pipeline" do
let(:pipeline_project) { project }
end
- context 'for a fork' do
+ context "for a fork" do
let(:fork) { fork_project(project) }
- it_behaves_like 'a method that returns all merge requests for a given pipeline' do
+ it_behaves_like "a method that returns all merge requests for a given pipeline" do
let(:pipeline_project) { fork }
end
end
end
- describe '#stuck?' do
+ describe "#stuck?" do
before do
create(:ci_build, :pending, pipeline: pipeline)
end
- context 'when pipeline is stuck' do
- it 'is stuck' do
+ context "when pipeline is stuck" do
+ it "is stuck" do
expect(pipeline).to be_stuck
end
end
- context 'when pipeline is not stuck' do
+ context "when pipeline is not stuck" do
before do
create(:ci_runner, :instance, :online)
end
- it 'is not stuck' do
+ it "is not stuck" do
expect(pipeline).not_to be_stuck
end
end
end
- describe '#has_yaml_errors?' do
- context 'when pipeline has errors' do
+ describe "#has_yaml_errors?" do
+ context "when pipeline has errors" do
let(:pipeline) do
- create(:ci_pipeline, config: { rspec: nil })
+ create(:ci_pipeline, config: {rspec: nil})
end
- it 'contains yaml errors' do
+ it "contains yaml errors" do
expect(pipeline).to have_yaml_errors
end
end
- context 'when pipeline does not have errors' do
+ context "when pipeline does not have errors" do
let(:pipeline) do
- create(:ci_pipeline, config: { rspec: { script: 'rake test' } })
+ create(:ci_pipeline, config: {rspec: {script: "rake test"}})
end
- it 'does not contain yaml errors' do
+ it "does not contain yaml errors" do
expect(pipeline).not_to have_yaml_errors
end
end
end
- describe 'notifications when pipeline success or failed' do
+ describe "notifications when pipeline success or failed" do
let(:project) { create(:project, :repository) }
let(:pipeline) do
create(:ci_pipeline,
- project: project,
- sha: project.commit('master').sha,
- user: create(:user))
+ project: project,
+ sha: project.commit("master").sha,
+ user: create(:user))
end
before do
project.add_developer(pipeline.user)
pipeline.user.global_notification_setting
- .update(level: 'custom', failed_pipeline: true, success_pipeline: true)
+ .update(level: "custom", failed_pipeline: true, success_pipeline: true)
perform_enqueued_jobs do
pipeline.enqueue
@@ -2389,29 +2392,29 @@ describe Ci::Pipeline, :mailer do
end
end
- shared_examples 'sending a notification' do
- it 'sends an email' do
+ shared_examples "sending a notification" do
+ it "sends an email" do
should_only_email(pipeline.user, kind: :bcc)
end
end
- shared_examples 'not sending any notification' do
- it 'does not send any email' do
+ shared_examples "not sending any notification" do
+ it "does not send any email" do
should_not_email_anyone
end
end
- context 'with success pipeline' do
+ context "with success pipeline" do
before do
perform_enqueued_jobs do
pipeline.succeed
end
end
- it_behaves_like 'sending a notification'
+ it_behaves_like "sending a notification"
end
- context 'with failed pipeline' do
+ context "with failed pipeline" do
before do
perform_enqueued_jobs do
create(:ci_build, :failed, pipeline: pipeline)
@@ -2421,46 +2424,46 @@ describe Ci::Pipeline, :mailer do
end
end
- it_behaves_like 'sending a notification'
+ it_behaves_like "sending a notification"
end
- context 'with skipped pipeline' do
+ context "with skipped pipeline" do
before do
perform_enqueued_jobs do
pipeline.skip
end
end
- it_behaves_like 'not sending any notification'
+ it_behaves_like "not sending any notification"
end
- context 'with cancelled pipeline' do
+ context "with cancelled pipeline" do
before do
perform_enqueued_jobs do
pipeline.cancel
end
end
- it_behaves_like 'not sending any notification'
+ it_behaves_like "not sending any notification"
end
end
- describe '#latest_builds_with_artifacts' do
+ describe "#latest_builds_with_artifacts" do
let!(:pipeline) { create(:ci_pipeline, :success) }
let!(:build) do
create(:ci_build, :success, :artifacts, pipeline: pipeline)
end
- it 'returns an Array' do
+ it "returns an Array" do
expect(pipeline.latest_builds_with_artifacts).to be_an_instance_of(Array)
end
- it 'returns the latest builds' do
+ it "returns the latest builds" do
expect(pipeline.latest_builds_with_artifacts).to eq([build])
end
- it 'memoizes the returned relation' do
+ it "memoizes the returned relation" do
query_count = ActiveRecord::QueryRecorder
.new { 2.times { pipeline.latest_builds_with_artifacts.to_a } }
.count
@@ -2469,28 +2472,28 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#has_test_reports?' do
+ describe "#has_test_reports?" do
subject { pipeline.has_test_reports? }
- context 'when pipeline has builds with test reports' do
+ context "when pipeline has builds with test reports" do
before do
create(:ci_build, :test_reports, pipeline: pipeline, project: project)
end
- context 'when pipeline status is running' do
+ context "when pipeline status is running" do
let(:pipeline) { create(:ci_pipeline, :running, project: project) }
it { is_expected.to be_falsey }
end
- context 'when pipeline status is success' do
+ context "when pipeline status is success" do
let(:pipeline) { create(:ci_pipeline, :success, project: project) }
it { is_expected.to be_truthy }
end
end
- context 'when pipeline does not have builds with test reports' do
+ context "when pipeline does not have builds with test reports" do
before do
create(:ci_build, :artifacts, pipeline: pipeline, project: project)
end
@@ -2500,7 +2503,7 @@ describe Ci::Pipeline, :mailer do
it { is_expected.to be_falsey }
end
- context 'when retried build has test reports' do
+ context "when retried build has test reports" do
before do
create(:ci_build, :retried, :test_reports, pipeline: pipeline, project: project)
end
@@ -2511,29 +2514,29 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#test_reports' do
+ describe "#test_reports" do
subject { pipeline.test_reports }
- context 'when pipeline has multiple builds with test reports' do
- let!(:build_rspec) { create(:ci_build, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_java) { create(:ci_build, :success, name: 'java', pipeline: pipeline, project: project) }
+ context "when pipeline has multiple builds with test reports" do
+ let!(:build_rspec) { create(:ci_build, :success, name: "rspec", pipeline: pipeline, project: project) }
+ let!(:build_java) { create(:ci_build, :success, name: "java", pipeline: pipeline, project: project) }
before do
create(:ci_job_artifact, :junit, job: build_rspec, project: project)
create(:ci_job_artifact, :junit_with_ant, job: build_java, project: project)
end
- it 'returns test reports with collected data' do
+ it "returns test reports with collected data" do
expect(subject.total_count).to be(7)
expect(subject.success_count).to be(5)
expect(subject.failed_count).to be(2)
end
- context 'when builds are retried' do
- let!(:build_rspec) { create(:ci_build, :retried, :success, name: 'rspec', pipeline: pipeline, project: project) }
- let!(:build_java) { create(:ci_build, :retried, :success, name: 'java', pipeline: pipeline, project: project) }
+ context "when builds are retried" do
+ let!(:build_rspec) { create(:ci_build, :retried, :success, name: "rspec", pipeline: pipeline, project: project) }
+ let!(:build_java) { create(:ci_build, :retried, :success, name: "java", pipeline: pipeline, project: project) }
- it 'does not take retried builds into account' do
+ it "does not take retried builds into account" do
expect(subject.total_count).to be(0)
expect(subject.success_count).to be(0)
expect(subject.failed_count).to be(0)
@@ -2541,41 +2544,41 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when pipeline does not have any builds with test reports' do
- it 'returns empty test reports' do
+ context "when pipeline does not have any builds with test reports" do
+ it "returns empty test reports" do
expect(subject.total_count).to be(0)
end
end
end
- describe '#total_size' do
+ describe "#total_size" do
let!(:build_job1) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:build_job2) { create(:ci_build, pipeline: pipeline, stage_idx: 0) }
let!(:test_job_failed_and_retried) { create(:ci_build, :failed, :retried, pipeline: pipeline, stage_idx: 1) }
let!(:second_test_job) { create(:ci_build, pipeline: pipeline, stage_idx: 1) }
let!(:deploy_job) { create(:ci_build, pipeline: pipeline, stage_idx: 2) }
- it 'returns all jobs (including failed and retried)' do
+ it "returns all jobs (including failed and retried)" do
expect(pipeline.total_size).to eq(5)
end
end
- describe '#status' do
- context 'when transitioning to failed' do
- context 'when pipeline has autodevops as source' do
+ describe "#status" do
+ context "when transitioning to failed" do
+ context "when pipeline has autodevops as source" do
let(:pipeline) { create(:ci_pipeline, :running, :auto_devops_source) }
- it 'calls autodevops disable service' do
+ it "calls autodevops disable service" do
expect(AutoDevops::DisableWorker).to receive(:perform_async).with(pipeline.id)
pipeline.drop
end
end
- context 'when pipeline has other source' do
+ context "when pipeline has other source" do
let(:pipeline) { create(:ci_pipeline, :running, :repository_source) }
- it 'does not call auto devops disable service' do
+ it "does not call auto devops disable service" do
expect(AutoDevops::DisableWorker).not_to receive(:perform_async)
pipeline.drop
@@ -2584,8 +2587,8 @@ describe Ci::Pipeline, :mailer do
end
end
- describe '#default_branch?' do
- let(:default_branch) { 'master'}
+ describe "#default_branch?" do
+ let(:default_branch) { "master"}
subject { pipeline.default_branch? }
@@ -2593,7 +2596,7 @@ describe Ci::Pipeline, :mailer do
allow(project).to receive(:default_branch).and_return(default_branch)
end
- context 'when pipeline ref is the default branch of the project' do
+ context "when pipeline ref is the default branch of the project" do
let(:pipeline) do
build(:ci_empty_pipeline, status: :created, project: project, ref: default_branch)
end
@@ -2603,9 +2606,9 @@ describe Ci::Pipeline, :mailer do
end
end
- context 'when pipeline ref is not the default branch of the project' do
+ context "when pipeline ref is not the default branch of the project" do
let(:pipeline) do
- build(:ci_empty_pipeline, status: :created, project: project, ref: 'another_branch')
+ build(:ci_empty_pipeline, status: :created, project: project, ref: "another_branch")
end
it "returns false" do