diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-04 00:07:52 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-03-04 00:07:52 +0000 |
commit | 4fe93274dec62ff7361a67be88e320131d66b788 (patch) | |
tree | 98ae79e3101ffd6569fc48bb4c7ad8808540ceb8 /spec/lib/gitlab/ci/pipeline | |
parent | bbaf2bb0438b1c71020d9d216feb528add225a7f (diff) | |
download | gitlab-ce-4fe93274dec62ff7361a67be88e320131d66b788.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/lib/gitlab/ci/pipeline')
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/build_spec.rb | 88 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb | 11 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb | 59 |
3 files changed, 140 insertions, 18 deletions
diff --git a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb index 1f5fc000832..01f65939da7 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/build_spec.rb @@ -214,24 +214,98 @@ describe Gitlab::Ci::Pipeline::Seed::Build do it { is_expected.to be_a(::Ci::Build) } it { is_expected.to be_valid } - context 'when job has environment name' do - let(:attributes) { { name: 'rspec', ref: 'master', environment: 'production' } } - + shared_examples_for 'deployment job' do it 'returns a job with deployment' do expect(subject.deployment).not_to be_nil expect(subject.deployment.deployable).to eq(subject) - expect(subject.deployment.environment.name).to eq('production') + expect(subject.deployment.environment.name).to eq(expected_environment_name) end + end + + shared_examples_for 'non-deployment job' do + it 'returns a job without deployment' do + expect(subject.deployment).to be_nil + end + end + + shared_examples_for 'ensures environment existence' do + it 'has environment' do + expect(subject).to be_has_environment + expect(subject.environment).to eq(environment_name) + expect(subject.metadata.expanded_environment_name).to eq(expected_environment_name) + expect(Environment.exists?(name: expected_environment_name)).to eq(true) + end + end + + shared_examples_for 'ensures environment inexistence' do + it 'does not have environment' do + expect(subject).not_to be_has_environment + expect(subject.environment).to be_nil + expect(subject.metadata.expanded_environment_name).to be_nil + expect(Environment.exists?(name: expected_environment_name)).to eq(false) + end + end + + context 'when job deploys to production' do + let(:environment_name) { 'production' } + let(:expected_environment_name) { 'production' } + let(:attributes) { { name: 'deploy', ref: 'master', environment: 'production' } } + + it_behaves_like 'deployment job' + it_behaves_like 'ensures environment existence' context 'when the environment name is invalid' do - let(:attributes) { { name: 'rspec', ref: 'master', environment: '!!!' } } + let(:attributes) { { name: 'deploy', ref: 'master', environment: '!!!' } } - it 'returns a job without deployment' do - expect(subject.deployment).to be_nil + it_behaves_like 'non-deployment job' + it_behaves_like 'ensures environment inexistence' + + it 'tracks an exception' do + expect(Gitlab::ErrorTracking).to receive(:track_exception) + .with(an_instance_of(described_class::EnvironmentCreationFailure), + project_id: project.id, + reason: %q{Name can contain only letters, digits, '-', '_', '/', '$', '{', '}', '.', and spaces, but it cannot start or end with '/'}) + .once + + subject end end end + context 'when job starts a review app' do + let(:environment_name) { 'review/$CI_COMMIT_REF_NAME' } + let(:expected_environment_name) { "review/#{pipeline.ref}" } + + let(:attributes) do + { + name: 'deploy', ref: 'master', environment: environment_name, + options: { environment: { name: environment_name } } + } + end + + it_behaves_like 'deployment job' + it_behaves_like 'ensures environment existence' + end + + context 'when job stops a review app' do + let(:environment_name) { 'review/$CI_COMMIT_REF_NAME' } + let(:expected_environment_name) { "review/#{pipeline.ref}" } + + let(:attributes) do + { + name: 'deploy', ref: 'master', environment: environment_name, + options: { environment: { name: environment_name, action: 'stop' } } + } + end + + it 'returns a job without deployment' do + expect(subject.deployment).to be_nil + end + + it_behaves_like 'non-deployment job' + it_behaves_like 'ensures environment existence' + end + context 'when job belongs to a resource group' do let(:attributes) { { name: 'rspec', ref: 'master', resource_group_key: 'iOS' } } diff --git a/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb index c5c91135f60..8d097bdd740 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb @@ -10,7 +10,8 @@ describe Gitlab::Ci::Pipeline::Seed::Deployment do end let(:job) { build(:ci_build, project: project, pipeline: pipeline) } - let(:seed) { described_class.new(job) } + let(:environment) { Gitlab::Ci::Pipeline::Seed::Environment.new(job).to_resource } + let(:seed) { described_class.new(job, environment) } let(:attributes) { {} } before do @@ -82,5 +83,13 @@ describe Gitlab::Ci::Pipeline::Seed::Deployment do is_expected.to be_nil end end + + context 'when job does not have environment attribute' do + let(:attributes) { { name: 'test' } } + + it 'returns nothing' do + is_expected.to be_nil + end + end end end diff --git a/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb b/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb index 71389999c6e..4c0464e5e7c 100644 --- a/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb +++ b/spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb @@ -15,29 +15,68 @@ describe Gitlab::Ci::Pipeline::Seed::Environment do describe '#to_resource' do subject { seed.to_resource } - context 'when job has environment attribute' do - let(:attributes) do - { - environment: 'production', - options: { environment: { name: 'production' } } - } - end - + shared_examples_for 'returning a correct environment' do it 'returns a persisted environment object' do + expect { subject }.to change { Environment.count }.by(1) + expect(subject).to be_a(Environment) expect(subject).to be_persisted expect(subject.project).to eq(project) - expect(subject.name).to eq('production') + expect(subject.name).to eq(expected_environment_name) end context 'when environment has already existed' do - let!(:environment) { create(:environment, project: project, name: 'production') } + let!(:environment) { create(:environment, project: project, name: expected_environment_name) } it 'returns the existing environment object' do + expect { subject }.not_to change { Environment.count } + expect(subject).to be_persisted expect(subject).to eq(environment) end end end + + context 'when job has environment attribute' do + let(:environment_name) { 'production' } + let(:expected_environment_name) { 'production' } + + let(:attributes) do + { + environment: environment_name, + options: { environment: { name: environment_name } } + } + end + + it_behaves_like 'returning a correct environment' + end + + context 'when job starts a review app' do + let(:environment_name) { 'review/$CI_COMMIT_REF_NAME' } + let(:expected_environment_name) { "review/#{job.ref}" } + + let(:attributes) do + { + environment: environment_name, + options: { environment: { name: environment_name } } + } + end + + it_behaves_like 'returning a correct environment' + end + + context 'when job stops a review app' do + let(:environment_name) { 'review/$CI_COMMIT_REF_NAME' } + let(:expected_environment_name) { "review/#{job.ref}" } + + let(:attributes) do + { + environment: environment_name, + options: { environment: { name: environment_name, action: 'stop' } } + } + end + + it_behaves_like 'returning a correct environment' + end end end |