diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 01:45:44 +0000 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/models/project_spec.rb | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) | |
download | gitlab-ce-85dc423f7090da0a52c73eb66faf22ddb20efff9.tar.gz |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'spec/models/project_spec.rb')
-rw-r--r-- | spec/models/project_spec.rb | 526 |
1 files changed, 270 insertions, 256 deletions
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index f589589af8f..fe971832695 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -61,6 +61,7 @@ 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(:ewm_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) } @@ -84,7 +85,6 @@ RSpec.describe Project do it { is_expected.to have_many(:runners) } it { is_expected.to have_many(:variables) } it { is_expected.to have_many(:triggers) } - it { is_expected.to have_many(:pages_domains) } it { is_expected.to have_many(:labels).class_name('ProjectLabel') } it { is_expected.to have_many(:users_star_projects) } it { is_expected.to have_many(:repository_languages) } @@ -124,6 +124,11 @@ RSpec.describe Project do it { is_expected.to have_many(:package_files).class_name('Packages::PackageFile') } it { is_expected.to have_many(:pipeline_artifacts) } + # GitLab Pages + it { is_expected.to have_many(:pages_domains) } + it { is_expected.to have_one(:pages_metadatum) } + it { is_expected.to have_many(:pages_deployments) } + it_behaves_like 'model with repository' do let_it_be(:container) { create(:project, :repository, path: 'somewhere') } let(:stubbed_container) { build_stubbed(:project) } @@ -131,7 +136,7 @@ RSpec.describe Project do end it_behaves_like 'model with wiki' do - let(:container) { create(:project, :wiki_repo) } + let_it_be(:container) { create(:project, :wiki_repo) } let(:container_without_wiki) { create(:project) } end @@ -202,11 +207,11 @@ RSpec.describe Project do end describe '#members & #requesters' do - let(:project) { create(:project, :public) } - let(:requester) { create(:user) } - let(:developer) { create(:user) } + let_it_be(:project) { create(:project, :public) } + let_it_be(:requester) { create(:user) } + let_it_be(:developer) { create(:user) } - before do + before_all do project.request_access(requester) project.add_developer(developer) end @@ -453,9 +458,9 @@ RSpec.describe Project do end describe '#all_pipelines' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } - before do + before_all do create(:ci_pipeline, project: project, ref: 'master', source: :web) create(:ci_pipeline, project: project, ref: 'master', source: :external) end @@ -477,7 +482,7 @@ RSpec.describe Project do end describe '#has_packages?' do - let(:project) { create(:project, :public) } + let_it_be(:project) { create(:project, :public) } subject { project.has_packages?(package_type) } @@ -517,14 +522,15 @@ RSpec.describe Project do end describe '#ci_pipelines' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } - before do + before_all do create(:ci_pipeline, project: project, ref: 'master', source: :web) create(:ci_pipeline, project: project, ref: 'master', source: :external) + create(:ci_pipeline, project: project, ref: 'master', source: :webide) end - it 'has ci pipelines' do + it 'excludes dangling pipelines such as :webide' do expect(project.ci_pipelines.size).to eq(2) end @@ -542,7 +548,7 @@ RSpec.describe Project do describe '#autoclose_referenced_issues' do context 'when DB entry is nil' do - let(:project) { create(:project, autoclose_referenced_issues: nil) } + let(:project) { build(:project, autoclose_referenced_issues: nil) } it 'returns true' do expect(project.autoclose_referenced_issues).to be_truthy @@ -550,7 +556,7 @@ RSpec.describe Project do end context 'when DB entry is true' do - let(:project) { create(:project, autoclose_referenced_issues: true) } + let(:project) { build(:project, autoclose_referenced_issues: true) } it 'returns true' do expect(project.autoclose_referenced_issues).to be_truthy @@ -558,7 +564,7 @@ RSpec.describe Project do end context 'when DB entry is false' do - let(:project) { create(:project, autoclose_referenced_issues: false) } + let(:project) { build(:project, autoclose_referenced_issues: false) } it 'returns false' do expect(project.autoclose_referenced_issues).to be_falsey @@ -768,8 +774,8 @@ RSpec.describe Project do end describe "#new_issuable_address" do - let(:project) { create(:project, path: "somewhere") } - let(:user) { create(:user) } + let_it_be(:project) { create(:project, path: "somewhere") } + let_it_be(:user) { create(:user) } context 'incoming email enabled' do before do @@ -850,11 +856,11 @@ RSpec.describe Project do end describe '#get_issue' do - let(:project) { create(:project) } - let!(:issue) { create(:issue, project: project) } - let(:user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let!(:issue) { create(:issue, project: project) } - before do + before_all do project.add_developer(user) end @@ -926,7 +932,7 @@ RSpec.describe Project do end describe '#issue_exists?' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } it 'is truthy when issue exists' do expect(project).to receive(:get_issue).and_return(double) @@ -1019,7 +1025,7 @@ RSpec.describe Project do end describe '#cache_has_external_issue_tracker' do - let(:project) { create(:project, has_external_issue_tracker: nil) } + let_it_be(:project) { create(:project, has_external_issue_tracker: nil) } it 'stores true if there is any external_issue_tracker' do services = double(:service, external_issue_trackers: [RedmineService.new]) @@ -1049,7 +1055,7 @@ RSpec.describe Project do end describe '#cache_has_external_wiki' do - let(:project) { create(:project, has_external_wiki: nil) } + let_it_be(:project) { create(:project, has_external_wiki: nil) } it 'stores true if there is any external_wikis' do services = double(:service, external_wikis: [ExternalWikiService.new]) @@ -1115,7 +1121,7 @@ RSpec.describe Project do end describe '#external_wiki' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } context 'with an active external wiki' do before do @@ -1268,60 +1274,6 @@ RSpec.describe Project do end end - describe '#pipeline_for' do - let(:project) { create(:project, :repository) } - - shared_examples 'giving the correct pipeline' do - it { is_expected.to eq(pipeline) } - - context 'return latest' do - let!(:pipeline2) { create_pipeline(project) } - - it { is_expected.to eq(pipeline2) } - end - end - - context 'with a matching pipeline' do - let!(:pipeline) { create_pipeline(project) } - - context 'with explicit sha' do - subject { project.pipeline_for('master', pipeline.sha) } - - it_behaves_like 'giving the correct pipeline' - - context 'with supplied id' do - let!(:other_pipeline) { create_pipeline(project) } - - subject { project.pipeline_for('master', pipeline.sha, other_pipeline.id) } - - it { is_expected.to eq(other_pipeline) } - end - end - - context 'with implicit sha' do - subject { project.pipeline_for('master') } - - it_behaves_like 'giving the correct pipeline' - end - end - - context 'when there is no matching pipeline' do - subject { project.pipeline_for('master') } - - it { is_expected.to be_nil } - end - end - - describe '#pipelines_for' do - let(:project) { create(:project, :repository) } - let!(:pipeline) { create_pipeline(project) } - let!(:other_pipeline) { create_pipeline(project) } - - subject { project.pipelines_for(project.default_branch, project.commit.sha) } - - it { is_expected.to contain_exactly(pipeline, other_pipeline) } - end - describe '#builds_enabled' do let(:project) { create(:project) } @@ -1362,6 +1314,36 @@ RSpec.describe Project do end end + describe '.with_active_jira_services' do + it 'returns the correct project' do + active_jira_service = create(:jira_service) + active_service = create(:service, active: true) + + expect(described_class.with_active_jira_services).to include(active_jira_service.project) + expect(described_class.with_active_jira_services).not_to include(active_service.project) + end + end + + describe '.with_jira_dvcs_cloud' do + it 'returns the correct project' do + jira_dvcs_cloud_project = create(:project, :jira_dvcs_cloud) + jira_dvcs_server_project = create(:project, :jira_dvcs_server) + + expect(described_class.with_jira_dvcs_cloud).to include(jira_dvcs_cloud_project) + expect(described_class.with_jira_dvcs_cloud).not_to include(jira_dvcs_server_project) + end + end + + describe '.with_jira_dvcs_server' do + it 'returns the correct project' do + jira_dvcs_server_project = create(:project, :jira_dvcs_server) + jira_dvcs_cloud_project = create(:project, :jira_dvcs_cloud) + + expect(described_class.with_jira_dvcs_server).to include(jira_dvcs_server_project) + expect(described_class.with_jira_dvcs_server).not_to include(jira_dvcs_cloud_project) + end + end + describe '.cached_count', :use_clean_rails_memory_store_caching do let(:group) { create(:group, :public) } let!(:project1) { create(:project, :public, group: group) } @@ -1759,7 +1741,7 @@ RSpec.describe Project do end describe '#visibility_level_allowed?' do - let(:project) { create(:project, :internal) } + let_it_be(:project) { create(:project, :internal) } context 'when checking on non-forked project' do it { expect(project.visibility_level_allowed?(Gitlab::VisibilityLevel::PRIVATE)).to be_truthy } @@ -1768,7 +1750,6 @@ RSpec.describe Project do end context 'when checking on forked project' do - let(:project) { create(:project, :internal) } let(:forked_project) { fork_project(project) } it { expect(forked_project.visibility_level_allowed?(Gitlab::VisibilityLevel::PRIVATE)).to be_truthy } @@ -1953,7 +1934,7 @@ RSpec.describe Project do end describe '.optionally_search' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } it 'searches for projects matching the query if one is given' do relation = described_class.optionally_search(project.name) @@ -2010,7 +1991,7 @@ RSpec.describe Project do end describe '.search_by_title' do - let(:project) { create(:project, name: 'kittens') } + let_it_be(:project) { create(:project, name: 'kittens') } it 'returns projects with a matching name' do expect(described_class.search_by_title(project.name)).to eq([project]) @@ -2026,11 +2007,11 @@ RSpec.describe Project do end context 'when checking projects from groups' do - let(:private_group) { create(:group, visibility_level: 0) } - let(:internal_group) { create(:group, visibility_level: 10) } + let(:private_group) { build(:group, visibility_level: 0) } + let(:internal_group) { build(:group, visibility_level: 10) } - let(:private_project) { create(:project, :private, group: private_group) } - let(:internal_project) { create(:project, :internal, group: internal_group) } + let(:private_project) { build(:project, :private, group: private_group) } + let(:internal_project) { build(:project, :internal, group: internal_group) } context 'when group is private project can not be internal' do it { expect(private_project.visibility_level_allowed?(Gitlab::VisibilityLevel::INTERNAL)).to be_falsey } @@ -2094,7 +2075,7 @@ RSpec.describe Project do end describe '#create_repository' do - let(:project) { create(:project, :repository) } + let_it_be(:project) { build(:project, :repository) } context 'using a regular repository' do it 'creates the repository' do @@ -2120,7 +2101,7 @@ RSpec.describe Project do end describe '#ensure_repository' do - let(:project) { create(:project, :repository) } + let_it_be(:project) { build(:project, :repository) } it 'creates the repository if it not exist' do allow(project).to receive(:repository_exists?).and_return(false) @@ -2174,7 +2155,7 @@ RSpec.describe Project do end describe '#container_registry_url' do - let(:project) { create(:project) } + let_it_be(:project) { build(:project) } subject { project.container_registry_url } @@ -2201,7 +2182,7 @@ RSpec.describe Project do end describe '#has_container_registry_tags?' do - let(:project) { create(:project) } + let(:project) { build(:project) } context 'when container registry is enabled' do before do @@ -2267,7 +2248,7 @@ RSpec.describe Project do describe '#ci_config_path=' do using RSpec::Parameterized::TableSyntax - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } where(:default_ci_config_path, :project_ci_config_path, :expected_ci_config_path) do nil | :notset | :default @@ -2322,8 +2303,8 @@ RSpec.describe Project do end describe '#latest_successful_build_for_ref' do - let(:project) { create(:project, :repository) } - let(:pipeline) { create_pipeline(project) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:pipeline) { create_pipeline(project) } it_behaves_like 'latest successful build for sha or ref' @@ -2338,47 +2319,95 @@ RSpec.describe Project do end end - describe '#latest_pipeline_for_ref' do - let(:project) { create(:project, :repository) } + describe '#latest_pipeline' do + let_it_be(:project) { create(:project, :repository) } let(:second_branch) { project.repository.branches[2] } let!(:pipeline_for_default_branch) do - create(:ci_empty_pipeline, project: project, sha: project.commit.id, - ref: project.default_branch) + create(:ci_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) + create(:ci_pipeline, project: project, sha: second_branch.target, + ref: second_branch.name) end - before do - create(:ci_empty_pipeline, project: project, sha: project.commit.parent.id, - ref: project.default_branch) + let!(:other_pipeline_for_default_branch) do + create(:ci_pipeline, project: project, sha: project.commit.parent.id, + ref: project.default_branch) end context 'default repository branch' do - subject { project.latest_pipeline_for_ref(project.default_branch) } + context 'when explicitly provided' do + subject { project.latest_pipeline(project.default_branch) } + + it { is_expected.to eq(pipeline_for_default_branch) } + end + + context 'when not provided' do + subject { project.latest_pipeline } + + it { is_expected.to eq(pipeline_for_default_branch) } + end + + context 'with provided sha' do + subject { project.latest_pipeline(project.default_branch, project.commit.parent.id) } - it { is_expected.to eq(pipeline_for_default_branch) } + it { is_expected.to eq(other_pipeline_for_default_branch) } + end end context 'provided ref' do - subject { project.latest_pipeline_for_ref(second_branch.name) } + subject { project.latest_pipeline(second_branch.name) } it { is_expected.to eq(pipeline_for_second_branch) } + + context 'with provided sha' do + let!(:latest_pipeline_for_ref) do + create(:ci_pipeline, project: project, sha: pipeline_for_second_branch.sha, + ref: pipeline_for_second_branch.ref) + end + + subject { project.latest_pipeline(second_branch.name, second_branch.target) } + + it { is_expected.to eq(latest_pipeline_for_ref) } + end end context 'bad ref' do - subject { project.latest_pipeline_for_ref(SecureRandom.uuid) } + before do + # ensure we don't skip the filter by ref by mistakenly return this pipeline + create(:ci_pipeline, project: project) + end + + subject { project.latest_pipeline(SecureRandom.uuid) } it { is_expected.to be_nil } end + + context 'on deleted ref' do + let(:branch) { project.repository.branches.last } + + let!(:pipeline_on_deleted_ref) do + create(:ci_pipeline, project: project, sha: branch.target, ref: branch.name) + end + + before do + project.repository.rm_branch(project.owner, branch.name) + end + + subject { project.latest_pipeline(branch.name) } + + it 'always returns nil despite a pipeline exists' do + expect(subject).to be_nil + end + end end describe '#latest_successful_build_for_sha' do - let(:project) { create(:project, :repository) } - let(:pipeline) { create_pipeline(project) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:pipeline) { create_pipeline(project) } it_behaves_like 'latest successful build for sha or ref' @@ -2386,8 +2415,8 @@ RSpec.describe Project do end describe '#latest_successful_build_for_ref!' do - let(:project) { create(:project, :repository) } - let(:pipeline) { create_pipeline(project) } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:pipeline) { create_pipeline(project) } context 'with many builds' do it 'gives the latest builds from latest pipeline' do @@ -2460,7 +2489,7 @@ RSpec.describe Project do end describe '#jira_import_status' do - let(:project) { create(:project, import_type: 'jira') } + let_it_be(:project) { create(:project, import_type: 'jira') } context 'when no jira imports' do it 'returns none' do @@ -2666,7 +2695,7 @@ RSpec.describe Project do end describe '#remote_mirror_available?' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } context 'when remote mirror global setting is enabled' do it 'returns true' do @@ -2707,10 +2736,10 @@ RSpec.describe Project do end describe '#ancestors_upto' do - let(:parent) { create(:group) } - let(:child) { create(:group, parent: parent) } - let(:child2) { create(:group, parent: child) } - let(:project) { create(:project, namespace: child2) } + let_it_be(:parent) { create(:group) } + let_it_be(:child) { create(:group, parent: parent) } + let_it_be(:child2) { create(:group, parent: child) } + let_it_be(:project) { create(:project, namespace: child2) } it 'returns all ancestors when no namespace is given' do expect(project.ancestors_upto).to contain_exactly(child2, child, parent) @@ -2755,7 +2784,7 @@ RSpec.describe Project do end describe '#emails_disabled?' do - let(:project) { create(:project, emails_disabled: false) } + let(:project) { build(:project, emails_disabled: false) } context 'emails disabled in group' do it 'returns true' do @@ -2783,7 +2812,7 @@ RSpec.describe Project do end describe '#lfs_enabled?' do - let(:project) { create(:project) } + let(:project) { build(:project) } shared_examples 'project overrides group' do it 'returns true when enabled in project' do @@ -2845,7 +2874,7 @@ RSpec.describe Project do end describe '#change_head' do - let(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository) } it 'returns error if branch does not exist' do expect(project.change_head('unexisted-branch')).to be false @@ -2876,6 +2905,20 @@ RSpec.describe Project do end end + describe '#lfs_objects_for_repository_types' do + let(:project) { create(:project) } + + it 'returns LFS objects of the specified type only' do + none, design, wiki = *[nil, :design, :wiki].map do |type| + create(:lfs_objects_project, project: project, repository_type: type).lfs_object + end + + expect(project.lfs_objects_for_repository_types(nil)).to contain_exactly(none) + expect(project.lfs_objects_for_repository_types(nil, :wiki)).to contain_exactly(none, wiki) + expect(project.lfs_objects_for_repository_types(:design)).to contain_exactly(design) + end + end + context 'forks' do include ProjectForksHelper @@ -2951,68 +2994,6 @@ RSpec.describe Project do expect(project.forks).to contain_exactly(forked_project) end end - - describe '#lfs_storage_project' do - it 'returns self for non-forks' do - expect(project.lfs_storage_project).to eq project - end - - it 'returns the fork network root for forks' do - second_fork = fork_project(forked_project) - - expect(second_fork.lfs_storage_project).to eq project - end - - it 'returns self when fork_source is nil' do - expect(forked_project).to receive(:fork_source).and_return(nil) - - expect(forked_project.lfs_storage_project).to eq forked_project - end - end - - describe '#all_lfs_objects' do - let(:lfs_object) { create(:lfs_object) } - - context 'when LFS object is only associated to the source' do - before do - project.lfs_objects << lfs_object - end - - it 'returns the lfs object for a project' do - expect(project.all_lfs_objects).to contain_exactly(lfs_object) - end - - it 'returns the lfs object for a fork' do - expect(forked_project.all_lfs_objects).to contain_exactly(lfs_object) - end - end - - context 'when LFS object is only associated to the fork' do - before do - forked_project.lfs_objects << lfs_object - end - - it 'returns nothing' do - expect(project.all_lfs_objects).to be_empty - end - - it 'returns the lfs object for a fork' do - expect(forked_project.all_lfs_objects).to contain_exactly(lfs_object) - end - end - - context 'when LFS object is associated to both source and fork' do - before do - project.lfs_objects << lfs_object - forked_project.lfs_objects << lfs_object - end - - it 'returns the lfs object for the source and fork' do - expect(project.all_lfs_objects).to contain_exactly(lfs_object) - expect(forked_project.all_lfs_objects).to contain_exactly(lfs_object) - end - end - end end describe '#set_repository_read_only!' do @@ -3040,7 +3021,7 @@ RSpec.describe Project do end describe '#pushes_since_gc' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } after do project.reset_pushes_since_gc @@ -3062,7 +3043,7 @@ RSpec.describe Project do end describe '#increment_pushes_since_gc' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } after do project.reset_pushes_since_gc @@ -3076,7 +3057,7 @@ RSpec.describe Project do end describe '#reset_pushes_since_gc' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } after do project.reset_pushes_since_gc @@ -3092,7 +3073,7 @@ RSpec.describe Project do end describe '#deployment_variables' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } let(:environment) { 'production' } let(:namespace) { 'namespace' } @@ -3169,7 +3150,7 @@ RSpec.describe Project do end describe '#default_environment' do - let(:project) { create(:project) } + let(:project) { build(:project) } it 'returns production environment when it exists' do production = create(:environment, name: "production", project: project) @@ -3191,7 +3172,7 @@ RSpec.describe Project do end describe '#ci_variables_for' do - let(:project) { create(:project) } + let_it_be(:project) { create(:project) } let(:environment_scope) { '*' } let!(:ci_variable) do @@ -3346,7 +3327,7 @@ RSpec.describe Project do end describe '#ci_instance_variables_for' do - let(:project) { create(:project) } + let(:project) { build_stubbed(:project) } let!(:instance_variable) do create(:ci_instance_variable, value: 'secret') @@ -5831,32 +5812,57 @@ RSpec.describe Project do end end - context 'pages deployed' do + describe '#mark_pages_as_deployed' do let(:project) { create(:project) } + let(:artifacts_archive) { create(:ci_job_artifact, project: project) } - { - mark_pages_as_deployed: true, - mark_pages_as_not_deployed: false - }.each do |method_name, flag| - describe method_name do - it "creates new record and sets deployed to #{flag} if none exists yet" do - project.pages_metadatum.destroy! - project.reload + it "works when artifacts_archive is missing" do + project.mark_pages_as_deployed - project.send(method_name) + expect(project.pages_metadatum.reload.deployed).to eq(true) + end - expect(project.pages_metadatum.reload.deployed).to eq(flag) - end + it "creates new record and sets deployed to true if none exists yet" do + project.pages_metadatum.destroy! + project.reload - it "updates the existing record and sets deployed to #{flag}" do - pages_metadatum = project.pages_metadatum - pages_metadatum.update!(deployed: !flag) + project.mark_pages_as_deployed(artifacts_archive: artifacts_archive) - expect { project.send(method_name) }.to change { - pages_metadatum.reload.deployed - }.from(!flag).to(flag) - end - end + expect(project.pages_metadatum.reload.deployed).to eq(true) + end + + it "updates the existing record and sets deployed to true and records artifact archive" do + pages_metadatum = project.pages_metadatum + pages_metadatum.update!(deployed: false) + + expect do + project.mark_pages_as_deployed(artifacts_archive: artifacts_archive) + end.to change { pages_metadatum.reload.deployed }.from(false).to(true) + .and change { pages_metadatum.reload.artifacts_archive }.from(nil).to(artifacts_archive) + end + end + + describe '#mark_pages_as_not_deployed' do + let(:project) { create(:project) } + let(:artifacts_archive) { create(:ci_job_artifact, project: project) } + + it "creates new record and sets deployed to false if none exists yet" do + project.pages_metadatum.destroy! + project.reload + + project.mark_pages_as_not_deployed + + expect(project.pages_metadatum.reload.deployed).to eq(false) + end + + it "updates the existing record and sets deployed to false and clears artifacts_archive" do + pages_metadatum = project.pages_metadatum + pages_metadatum.update!(deployed: true, artifacts_archive: artifacts_archive) + + expect do + project.mark_pages_as_not_deployed + end.to change { pages_metadatum.reload.deployed }.from(true).to(false) + .and change { pages_metadatum.reload.artifacts_archive }.from(artifacts_archive).to(nil) end end @@ -6043,6 +6049,18 @@ RSpec.describe Project do end end + describe '#jira_subscription_exists?' do + let(:project) { create(:project) } + + subject { project.jira_subscription_exists? } + + context 'jira connect subscription exists' do + let!(:jira_connect_subscription) { create(:jira_connect_subscription, namespace: project.namespace) } + + it { is_expected.to eq(true) } + end + end + describe 'with services and chat names' do subject { create(:project) } @@ -6088,53 +6106,6 @@ RSpec.describe Project do end end - describe '#all_lfs_objects_oids' do - let(:project) { create(:project) } - let(:lfs_object) { create(:lfs_object) } - let(:another_lfs_object) { create(:lfs_object) } - - subject { project.all_lfs_objects_oids } - - context 'when project has associated LFS objects' do - before do - create(:lfs_objects_project, lfs_object: lfs_object, project: project) - create(:lfs_objects_project, lfs_object: another_lfs_object, project: project) - end - - it 'returns OIDs of LFS objects' do - expect(subject).to match_array([lfs_object.oid, another_lfs_object.oid]) - end - - context 'and there are specified oids' do - subject { project.all_lfs_objects_oids(oids: [lfs_object.oid]) } - - it 'returns OIDs of LFS objects that match specified oids' do - expect(subject).to eq([lfs_object.oid]) - end - end - end - - context 'when fork has associated LFS objects to itself and source' do - let(:source) { create(:project) } - let(:project) { fork_project(source) } - - before do - create(:lfs_objects_project, lfs_object: lfs_object, project: source) - create(:lfs_objects_project, lfs_object: another_lfs_object, project: project) - end - - it 'returns OIDs of LFS objects' do - expect(subject).to match_array([lfs_object.oid, another_lfs_object.oid]) - end - end - - context 'when project has no associated LFS objects' do - it 'returns empty array' do - expect(subject).to be_empty - end - end - end - describe '#lfs_objects_oids' do let(:project) { create(:project) } let(:lfs_object) { create(:lfs_object) } @@ -6475,6 +6446,49 @@ RSpec.describe Project do end end + describe '#enabled_group_deploy_keys' do + let_it_be(:project) { create(:project) } + + subject { project.enabled_group_deploy_keys } + + context 'when a project does not have a group' do + it { is_expected.to be_empty } + end + + context 'when a project has a parent group' do + let!(:group) { create(:group, projects: [project]) } + + context 'and this group has a group deploy key enabled' do + let!(:group_deploy_key) { create(:group_deploy_key, groups: [group]) } + + it { is_expected.to contain_exactly(group_deploy_key) } + + context 'and this group has parent group which also has a group deploy key enabled' do + let(:super_group) { create(:group) } + + it 'returns both group deploy keys' do + super_group = create(:group) + super_group_deploy_key = create(:group_deploy_key, groups: [super_group]) + group.update!(parent: super_group) + + expect(subject).to contain_exactly(group_deploy_key, super_group_deploy_key) + end + end + end + + context 'and another group has a group deploy key enabled' do + let_it_be(:group_deploy_key) { create(:group_deploy_key) } + + it 'does not return this group deploy key' do + another_group = create(:group) + create(:group_deploy_key, groups: [another_group]) + + expect(subject).to be_empty + end + end + end + end + def finish_job(export_job) export_job.start export_job.finish |