105 lines
3.4 KiB
Ruby
105 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Packages::Generic::FindOrCreatePackageService do
|
|
let_it_be(:project) { create(:project) }
|
|
let_it_be(:user) { create(:user) }
|
|
let_it_be(:ci_build) { create(:ci_build, :running, user: user) }
|
|
|
|
let(:params) do
|
|
{
|
|
name: 'mypackage',
|
|
version: '0.0.1'
|
|
}
|
|
end
|
|
|
|
describe '#execute' do
|
|
context 'when packages does not exist yet' do
|
|
it 'creates package' do
|
|
service = described_class.new(project, user, params)
|
|
|
|
expect { service.execute }.to change { project.packages.generic.count }.by(1)
|
|
|
|
package = project.packages.generic.last
|
|
|
|
aggregate_failures do
|
|
expect(package.creator).to eq(user)
|
|
expect(package.name).to eq('mypackage')
|
|
expect(package.version).to eq('0.0.1')
|
|
expect(package.original_build_info).to be_nil
|
|
end
|
|
end
|
|
|
|
it 'creates package and package build info when build is provided' do
|
|
service = described_class.new(project, user, params.merge(build: ci_build))
|
|
|
|
expect { service.execute }.to change { project.packages.generic.count }.by(1)
|
|
|
|
package = project.packages.generic.last
|
|
|
|
aggregate_failures do
|
|
expect(package.creator).to eq(user)
|
|
expect(package.name).to eq('mypackage')
|
|
expect(package.version).to eq('0.0.1')
|
|
expect(package.original_build_info.pipeline).to eq(ci_build.pipeline)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when packages already exists' do
|
|
let!(:package) { project.packages.generic.create!(params) }
|
|
|
|
context 'when package was created manually' do
|
|
it 'finds the package and does not create package build info even if build is provided' do
|
|
service = described_class.new(project, user, params.merge(build: ci_build))
|
|
|
|
expect do
|
|
found_package = service.execute
|
|
|
|
expect(found_package).to eq(package)
|
|
end.not_to change { project.packages.generic.count }
|
|
|
|
expect(package.reload.original_build_info).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'when package was created by pipeline' do
|
|
let(:pipeline) { create(:ci_pipeline, project: project) }
|
|
|
|
before do
|
|
package.build_infos.create!(pipeline: pipeline)
|
|
end
|
|
|
|
it 'finds the package and does not change package build info even if build is provided' do
|
|
service = described_class.new(project, user, params.merge(build: ci_build))
|
|
|
|
expect do
|
|
found_package = service.execute
|
|
|
|
expect(found_package).to eq(package)
|
|
end.not_to change { project.packages.generic.count }
|
|
|
|
expect(package.reload.original_build_info.pipeline).to eq(pipeline)
|
|
end
|
|
end
|
|
|
|
context 'when a pending_destruction package exists', :aggregate_failures do
|
|
let!(:package) { project.packages.generic.create!(params.merge(status: :pending_destruction)) }
|
|
|
|
it 'creates a new package' do
|
|
service = described_class.new(project, user, params)
|
|
|
|
expect { service.execute }.to change { project.packages.generic.count }.by(1)
|
|
|
|
package = project.packages.generic.last
|
|
|
|
expect(package.creator).to eq(user)
|
|
expect(package.name).to eq('mypackage')
|
|
expect(package.version).to eq('0.0.1')
|
|
expect(package.original_build_info).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|