diff options
Diffstat (limited to 'spec/services/packages/composer/create_package_service_spec.rb')
-rw-r--r-- | spec/services/packages/composer/create_package_service_spec.rb | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/spec/services/packages/composer/create_package_service_spec.rb b/spec/services/packages/composer/create_package_service_spec.rb new file mode 100644 index 00000000000..3f9da31cf6e --- /dev/null +++ b/spec/services/packages/composer/create_package_service_spec.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Packages::Composer::CreatePackageService do + include PackagesManagerApiSpecHelpers + + let_it_be(:package_name) { 'composer-package-name' } + let_it_be(:json) { { name: package_name }.to_json } + let_it_be(:project) { create(:project, :custom_repo, files: { 'composer.json' => json } ) } + let_it_be(:user) { create(:user) } + let(:params) do + { + branch: branch, + tag: tag + } + end + + describe '#execute' do + let(:tag) { nil } + let(:branch) { nil } + + subject { described_class.new(project, user, params).execute } + + let(:created_package) { Packages::Package.composer.last } + + context 'without an existing package' do + context 'with a branch' do + let(:branch) { project.repository.find_branch('master') } + + it 'creates the package' do + expect { subject } + .to change { Packages::Package.composer.count }.by(1) + .and change { Packages::Composer::Metadatum.count }.by(1) + + expect(created_package.name).to eq package_name + expect(created_package.version).to eq 'dev-master' + expect(created_package.composer_metadatum.target_sha).to eq branch.target + expect(created_package.composer_metadatum.composer_json.to_json).to eq json + end + end + + context 'with a tag' do + let(:tag) { project.repository.find_tag('v1.2.3') } + + before do + project.repository.add_tag(user, 'v1.2.3', 'master') + end + + it 'creates the package' do + expect { subject } + .to change { Packages::Package.composer.count }.by(1) + .and change { Packages::Composer::Metadatum.count }.by(1) + + expect(created_package.name).to eq package_name + expect(created_package.version).to eq '1.2.3' + end + end + end + + context 'with an existing package' do + let(:branch) { project.repository.find_branch('master') } + + context 'belonging to the same project' do + before do + described_class.new(project, user, params).execute + end + + it 'does not create a new package' do + expect { subject } + .to change { Packages::Package.composer.count }.by(0) + .and change { Packages::Composer::Metadatum.count }.by(0) + end + end + + context 'belonging to another project' do + let(:other_project) { create(:project) } + let!(:other_package) { create(:composer_package, name: package_name, version: 'dev-master', project: other_project) } + + it 'fails with an error' do + expect { subject } + .to raise_error(/is already taken/) + end + end + + context 'same name but of different type' do + let(:other_project) { create(:project) } + let!(:other_package) { create(:package, name: package_name, version: 'dev-master', project: other_project) } + + it 'creates the package' do + expect { subject } + .to change { Packages::Package.composer.count }.by(1) + .and change { Packages::Composer::Metadatum.count }.by(1) + end + end + end + end +end |