diff options
Diffstat (limited to 'spec/lib/gitlab/pages/deployment_update_spec.rb')
-rw-r--r-- | spec/lib/gitlab/pages/deployment_update_spec.rb | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/spec/lib/gitlab/pages/deployment_update_spec.rb b/spec/lib/gitlab/pages/deployment_update_spec.rb new file mode 100644 index 00000000000..cf109248f36 --- /dev/null +++ b/spec/lib/gitlab/pages/deployment_update_spec.rb @@ -0,0 +1,140 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Pages::DeploymentUpdate do + let_it_be(:project, refind: true) { create(:project, :repository) } + + let_it_be(:old_pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) } + let_it_be(:pipeline) { create(:ci_pipeline, project: project, sha: project.commit('HEAD').sha) } + + let(:build) { create(:ci_build, pipeline: pipeline, ref: 'HEAD') } + let(:invalid_file) { fixture_file_upload('spec/fixtures/dk.png') } + + let(:file) { fixture_file_upload("spec/fixtures/pages.zip") } + let(:empty_file) { fixture_file_upload("spec/fixtures/pages_empty.zip") } + let(:empty_metadata_filename) { "spec/fixtures/pages_empty.zip.meta" } + let(:metadata_filename) { "spec/fixtures/pages.zip.meta" } + let(:metadata) { fixture_file_upload(metadata_filename) if File.exist?(metadata_filename) } + + subject(:pages_deployment_update) { described_class.new(project, build) } + + context 'for new artifacts' do + context 'for a valid job' do + let!(:artifacts_archive) { create(:ci_job_artifact, :correct_checksum, file: file, job: build) } + + before do + create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build) + + build.reload + end + + it 'is valid' do + expect(pages_deployment_update).to be_valid + end + + context 'when missing artifacts metadata' do + before do + expect(build).to receive(:artifacts_metadata?).and_return(false) + end + + it 'is invalid' do + expect(pages_deployment_update).not_to be_valid + expect(pages_deployment_update.errors.full_messages).to include('missing artifacts metadata') + end + end + end + + it 'is invalid for invalid archive' do + create(:ci_job_artifact, :archive, file: invalid_file, job: build) + + expect(pages_deployment_update).not_to be_valid + expect(pages_deployment_update.errors.full_messages).to include('missing artifacts metadata') + end + end + + describe 'maximum pages artifacts size' do + let(:metadata) { spy('metadata') } # rubocop: disable RSpec/VerifiedDoubles + + before do + file = fixture_file_upload('spec/fixtures/pages.zip') + metafile = fixture_file_upload('spec/fixtures/pages.zip.meta') + + create(:ci_job_artifact, :archive, :correct_checksum, file: file, job: build) + create(:ci_job_artifact, :metadata, file: metafile, job: build) + + allow(build).to receive(:artifacts_metadata_entry) + .and_return(metadata) + end + + context 'when maximum pages size is set to zero' do + before do + stub_application_setting(max_pages_size: 0) + end + + context "when size is above the limit" do + before do + allow(metadata).to receive(:total_size).and_return(1.megabyte) + allow(metadata).to receive(:entries).and_return([]) + end + + it 'is valid' do + expect(pages_deployment_update).to be_valid + end + end + end + + context 'when size is limited on the instance level' do + before do + stub_application_setting(max_pages_size: 100) + end + + context "when size is below the limit" do + before do + allow(metadata).to receive(:total_size).and_return(1.megabyte) + allow(metadata).to receive(:entries).and_return([]) + end + + it 'is valid' do + expect(pages_deployment_update).to be_valid + end + end + + context "when size is above the limit" do + before do + allow(metadata).to receive(:total_size).and_return(101.megabyte) + allow(metadata).to receive(:entries).and_return([]) + end + + it 'is invalid' do + expect(pages_deployment_update).not_to be_valid + expect(pages_deployment_update.errors.full_messages) + .to include('artifacts for pages are too large: 105906176') + end + end + end + end + + context 'when retrying the job' do + let!(:older_deploy_job) do + create( + :generic_commit_status, + :failed, + pipeline: pipeline, + ref: build.ref, + stage: 'deploy', + name: 'pages:deploy' + ) + end + + before do + create(:ci_job_artifact, :correct_checksum, file: file, job: build) + create(:ci_job_artifact, file_type: :metadata, file_format: :gzip, file: metadata, job: build) + build.reload + end + + it 'marks older pages:deploy jobs retried' do + expect(pages_deployment_update).to be_valid + end + end +end |