Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/project_spec.rb')
-rw-r--r--spec/models/project_spec.rb217
1 files changed, 206 insertions, 11 deletions
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 8fdda241719..f589589af8f 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -61,7 +61,6 @@ RSpec.describe Project do
it { is_expected.to have_one(:youtrack_service) }
it { is_expected.to have_one(:custom_issue_tracker_service) }
it { is_expected.to have_one(:bugzilla_service) }
- it { is_expected.to have_one(:gitlab_issue_tracker_service) }
it { is_expected.to have_one(:external_wiki_service) }
it { is_expected.to have_one(:confluence_service) }
it { is_expected.to have_one(:project_feature) }
@@ -104,6 +103,7 @@ RSpec.describe Project do
it { is_expected.to have_many(:clusters) }
it { is_expected.to have_many(:management_clusters).class_name('Clusters::Cluster') }
it { is_expected.to have_many(:kubernetes_namespaces) }
+ it { is_expected.to have_many(:cluster_agents).class_name('Clusters::Agent') }
it { is_expected.to have_many(:custom_attributes).class_name('ProjectCustomAttribute') }
it { is_expected.to have_many(:project_badges).class_name('ProjectBadge') }
it { is_expected.to have_many(:lfs_file_locks) }
@@ -122,6 +122,7 @@ RSpec.describe Project do
it { is_expected.to have_many(:reviews).inverse_of(:project) }
it { is_expected.to have_many(:packages).class_name('Packages::Package') }
it { is_expected.to have_many(:package_files).class_name('Packages::PackageFile') }
+ it { is_expected.to have_many(:pipeline_artifacts) }
it_behaves_like 'model with repository' do
let_it_be(:container) { create(:project, :repository, path: 'somewhere') }
@@ -400,6 +401,7 @@ RSpec.describe Project do
create(:project,
pending_delete: true)
end
+
let(:new_project) do
build(:project,
name: project_pending_deletion.name,
@@ -474,6 +476,46 @@ RSpec.describe Project do
end
end
+ describe '#has_packages?' do
+ let(:project) { create(:project, :public) }
+
+ subject { project.has_packages?(package_type) }
+
+ shared_examples 'returning true examples' do
+ let!(:package) { create("#{package_type}_package", project: project) }
+
+ it { is_expected.to be true }
+ end
+
+ shared_examples 'returning false examples' do
+ it { is_expected.to be false }
+ end
+
+ context 'with maven packages' do
+ it_behaves_like 'returning true examples' do
+ let(:package_type) { :maven }
+ end
+ end
+
+ context 'with npm packages' do
+ it_behaves_like 'returning true examples' do
+ let(:package_type) { :npm }
+ end
+ end
+
+ context 'with conan packages' do
+ it_behaves_like 'returning true examples' do
+ let(:package_type) { :conan }
+ end
+ end
+
+ context 'with no package type' do
+ it_behaves_like 'returning false examples' do
+ let(:package_type) { nil }
+ end
+ end
+ end
+
describe '#ci_pipelines' do
let(:project) { create(:project) }
@@ -638,6 +680,12 @@ RSpec.describe Project do
end
end
end
+
+ context 'when argument is a user' do
+ it 'returns full path to the project' do
+ expect(project.to_reference_base(owner)).to eq 'sample-namespace/sample-project'
+ end
+ end
end
describe '#to_human_reference' do
@@ -1042,6 +1090,30 @@ RSpec.describe Project do
end
end
+ describe '#default_owner' do
+ let_it_be(:owner) { create(:user) }
+ let_it_be(:namespace) { create(:namespace, owner: owner) }
+
+ context 'the project does not have a group' do
+ let(:project) { build(:project, namespace: namespace) }
+
+ it 'is the namespace owner' do
+ expect(project.default_owner).to eq(owner)
+ end
+ end
+
+ context 'the project is in a group' do
+ let(:group) { build(:group) }
+ let(:project) { build(:project, group: group, namespace: namespace) }
+
+ it 'is the group owner' do
+ allow(group).to receive(:default_owner).and_return(Object.new)
+
+ expect(project.default_owner).to eq(group.default_owner)
+ end
+ end
+ end
+
describe '#external_wiki' do
let(:project) { create(:project) }
@@ -1408,16 +1480,69 @@ RSpec.describe Project do
end
describe '#service_desk_address' do
- let_it_be(:project) { create(:project, service_desk_enabled: true) }
+ let_it_be(:project, reload: true) { create(:project, service_desk_enabled: true) }
- before do
- allow(Gitlab::ServiceDesk).to receive(:enabled?).and_return(true)
- allow(Gitlab.config.incoming_email).to receive(:enabled).and_return(true)
- allow(Gitlab.config.incoming_email).to receive(:address).and_return("test+%{key}@mail.com")
+ subject { project.service_desk_address }
+
+ shared_examples 'with incoming email address' do
+ context 'when incoming email is enabled' do
+ before do
+ config = double(enabled: true, address: 'test+%{key}@mail.com')
+ allow(::Gitlab.config).to receive(:incoming_email).and_return(config)
+ end
+
+ it 'uses project full path as service desk address key' do
+ expect(project.service_desk_address).to eq("test+#{project.full_path_slug}-#{project.project_id}-issue-@mail.com")
+ end
+ end
+
+ context 'when incoming email is disabled' do
+ before do
+ config = double(enabled: false)
+ allow(::Gitlab.config).to receive(:incoming_email).and_return(config)
+ end
+
+ it 'uses project full path as service desk address key' do
+ expect(project.service_desk_address).to be_nil
+ end
+ end
+ end
+
+ context 'when service_desk_email is disabled' do
+ before do
+ allow(::Gitlab::ServiceDeskEmail).to receive(:enabled?).and_return(false)
+ end
+
+ it_behaves_like 'with incoming email address'
end
- it 'uses project full path as service desk address key' do
- expect(project.service_desk_address).to eq("test+#{project.full_path_slug}-#{project.project_id}-issue-@mail.com")
+ context 'when service_desk_email is enabled' do
+ before do
+ config = double(enabled: true, address: 'foo+%{key}@bar.com')
+ allow(::Gitlab::ServiceDeskEmail).to receive(:config).and_return(config)
+ end
+
+ context 'when service_desk_custom_address flag is enabled' do
+ before do
+ stub_feature_flags(service_desk_custom_address: true)
+ end
+
+ it 'returns custom address when project_key is set' do
+ create(:service_desk_setting, project: project, project_key: 'key1')
+
+ expect(subject).to eq("foo+#{project.full_path_slug}-key1@bar.com")
+ end
+
+ it_behaves_like 'with incoming email address'
+ end
+
+ context 'when service_desk_custom_address flag is disabled' do
+ before do
+ stub_feature_flags(service_desk_custom_address: false)
+ end
+
+ it_behaves_like 'with incoming email address'
+ end
end
end
@@ -1657,9 +1782,9 @@ RSpec.describe Project do
subject { project.pages_deployed? }
- context 'if public folder does exist' do
+ context 'if pages are deployed' do
before do
- allow(Dir).to receive(:exist?).with(project.public_pages_path).and_return(true)
+ project.pages_metadatum.update_column(:deployed, true)
end
it { is_expected.to be_truthy }
@@ -2221,6 +2346,7 @@ RSpec.describe Project do
create(:ci_empty_pipeline, project: project, sha: project.commit.id,
ref: project.default_branch)
end
+
let!(:pipeline_for_second_branch) do
create(:ci_empty_pipeline, project: project, sha: second_branch.target,
ref: second_branch.name)
@@ -3488,6 +3614,7 @@ RSpec.describe Project do
public: '\\1'
MAP
end
+
let(:sha) { project.commit.id }
context 'when there is a route map' do
@@ -4085,7 +4212,6 @@ RSpec.describe Project do
end
it 'removes the pages directory and marks the project as not having pages deployed' do
- expect_any_instance_of(Projects::UpdatePagesConfigurationService).to receive(:execute)
expect_any_instance_of(Gitlab::PagesTransfer).to receive(:rename_project).and_return(true)
expect(PagesWorker).to receive(:perform_in).with(5.minutes, :remove, namespace.full_path, anything)
@@ -5105,6 +5231,7 @@ RSpec.describe Project do
allow_collaboration: true
)
end
+
let!(:merge_request) do
create(
:merge_request,
@@ -5455,6 +5582,32 @@ RSpec.describe Project do
end
end
+ describe '.for_repository_storage' do
+ it 'returns the projects for a given repository storage' do
+ stub_storage_settings('test_second_storage' => {
+ 'path' => TestEnv::SECOND_STORAGE_PATH,
+ 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address
+ })
+ expected_project = create(:project, repository_storage: 'default')
+ create(:project, repository_storage: 'test_second_storage')
+
+ expect(described_class.for_repository_storage('default')).to eq([expected_project])
+ end
+ end
+
+ describe '.excluding_repository_storage' do
+ it 'returns the projects excluding the given repository storage' do
+ stub_storage_settings('test_second_storage' => {
+ 'path' => TestEnv::SECOND_STORAGE_PATH,
+ 'gitaly_address' => Gitlab.config.repositories.storages.default.gitaly_address
+ })
+ expected_project = create(:project, repository_storage: 'test_second_storage')
+ create(:project, repository_storage: 'default')
+
+ expect(described_class.excluding_repository_storage('default')).to eq([expected_project])
+ end
+ end
+
describe '.deployments' do
subject { project.deployments }
@@ -6154,6 +6307,48 @@ RSpec.describe Project do
end
end
+ describe '#has_packages?' do
+ let(:project) { create(:project, :public) }
+
+ subject { project.has_packages?(package_type) }
+
+ shared_examples 'has_package' do
+ context 'package of package_type exists' do
+ let!(:package) { create("#{package_type}_package", project: project) }
+
+ it { is_expected.to be true }
+ end
+
+ context 'package of package_type does not exist' do
+ it { is_expected.to be false }
+ end
+ end
+
+ context 'with maven packages' do
+ it_behaves_like 'has_package' do
+ let(:package_type) { :maven }
+ end
+ end
+
+ context 'with npm packages' do
+ it_behaves_like 'has_package' do
+ let(:package_type) { :npm }
+ end
+ end
+
+ context 'with conan packages' do
+ it_behaves_like 'has_package' do
+ let(:package_type) { :conan }
+ end
+ end
+
+ context 'calling has_package? with nil' do
+ let(:package_type) { nil }
+
+ it { is_expected.to be false }
+ end
+ end
+
describe '#environments_for_scope' do
let_it_be(:project, reload: true) { create(:project) }