diff options
Diffstat (limited to 'spec/models/project_spec.rb')
-rw-r--r-- | spec/models/project_spec.rb | 231 |
1 files changed, 166 insertions, 65 deletions
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index ed5b3d4e0be..2d84c1b843e 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -147,6 +147,7 @@ RSpec.describe Project, factory_default: :keep do it { is_expected.to have_many(:job_artifacts).dependent(:restrict_with_error) } it { is_expected.to have_many(:build_trace_chunks).through(:builds).dependent(:restrict_with_error) } it { is_expected.to have_many(:secure_files).class_name('Ci::SecureFile').dependent(:restrict_with_error) } + it { is_expected.to have_one(:build_artifacts_size_refresh).class_name('Projects::BuildArtifactsSizeRefresh') } # GitLab Pages it { is_expected.to have_many(:pages_domains) } @@ -287,41 +288,35 @@ RSpec.describe Project, factory_default: :keep do end context 'updating a project' do - shared_examples 'project update' do - let_it_be(:project_namespace) { create(:project_namespace) } - let_it_be(:project) { project_namespace.project } + let_it_be(:project_namespace) { create(:project_namespace) } + let_it_be(:project) { project_namespace.project } - context 'when project namespace is not set' do - before do - project.update_column(:project_namespace_id, nil) - project.reload - end + context 'when project has an associated project namespace' do + # when FF is disabled creating a project does not create a project_namespace, so we create one + it 'project is INVALID when trying to remove project namespace' do + project.reload + # check that project actually has an associated project namespace + expect(project.project_namespace_id).to eq(project_namespace.id) - it 'updates the project successfully' do - # pre-check that project does not have a project namespace - expect(project.project_namespace).to be_nil + expect do + project.update!(project_namespace_id: nil, path: 'hopefully-valid-path1') + end.to raise_error(ActiveRecord::RecordInvalid) + expect(project).to be_invalid + expect(project.errors.full_messages).to include("Project namespace can't be blank") + expect(project.reload.project_namespace).to be_in_sync_with_project(project) + end - project.update!(path: 'hopefully-valid-path2') + context 'when same project is being updated in 2 instances' do + it 'syncs only changed attributes' do + project1 = Project.last + project2 = Project.last - expect(project).to be_persisted - expect(project).to be_valid - expect(project.path).to eq('hopefully-valid-path2') - expect(project.project_namespace).to be_nil - end - end + project_name = project1.name + project_path = project1.path - context 'when project has an associated project namespace' do - # when FF is disabled creating a project does not create a project_namespace, so we create one - it 'project is INVALID when trying to remove project namespace' do - project.reload - # check that project actually has an associated project namespace - expect(project.project_namespace_id).to eq(project_namespace.id) + project1.update!(name: project_name + "-1") + project2.update!(path: project_path + "-1") - expect do - project.update!(project_namespace_id: nil, path: 'hopefully-valid-path1') - end.to raise_error(ActiveRecord::RecordInvalid) - expect(project).to be_invalid - expect(project.errors.full_messages).to include("Project namespace can't be blank") expect(project.reload.project_namespace).to be_in_sync_with_project(project) end end @@ -4744,8 +4739,7 @@ RSpec.describe Project, factory_default: :keep do shared_examples 'filter respects visibility' do it 'respects visibility' do enable_admin_mode!(user) if admin_mode - project.update!(visibility_level: Gitlab::VisibilityLevel.level_value(project_level.to_s)) - update_feature_access_level(project, feature_access_level) + update_feature_access_level(project, feature_access_level, visibility_level: Gitlab::VisibilityLevel.level_value(project_level.to_s)) expected_objects = expected_count == 1 ? [project] : [] @@ -6225,7 +6219,7 @@ RSpec.describe Project, factory_default: :keep do describe '#gitlab_deploy_token' do let(:project) { create(:project) } - subject { project.gitlab_deploy_token } + subject(:gitlab_deploy_token) { project.gitlab_deploy_token } context 'when there is a gitlab deploy token associated' do let!(:deploy_token) { create(:deploy_token, :gitlab_deploy_token, projects: [project]) } @@ -6257,10 +6251,43 @@ RSpec.describe Project, factory_default: :keep do context 'when there is a deploy token associated to a different project' do let(:project_2) { create(:project) } - let!(:deploy_token) { create(:deploy_token, projects: [project_2]) } + let!(:deploy_token) { create(:deploy_token, :gitlab_deploy_token, projects: [project_2]) } it { is_expected.to be_nil } end + + context 'when the project group has a gitlab deploy token associated' do + let(:group) { create(:group) } + let(:project) { create(:project, group: group) } + let!(:deploy_token) { create(:deploy_token, :gitlab_deploy_token, :group, groups: [group]) } + + it { is_expected.to eq(deploy_token) } + + context 'when the FF ci_variable_for_group_gitlab_deploy_token is disabled' do + before do + stub_feature_flags(ci_variable_for_group_gitlab_deploy_token: false) + end + + it { is_expected.to be_nil } + end + end + + context 'when the project and its group has a gitlab deploy token associated' do + let(:group) { create(:group) } + let(:project) { create(:project, group: group) } + let!(:project_deploy_token) { create(:deploy_token, :gitlab_deploy_token, projects: [project]) } + let!(:group_deploy_token) { create(:deploy_token, :gitlab_deploy_token, :group, groups: [group]) } + + it { is_expected.to eq(project_deploy_token) } + + context 'when the FF ci_variable_for_group_gitlab_deploy_token is disabled' do + before do + stub_feature_flags(ci_variable_for_group_gitlab_deploy_token: false) + end + + it { is_expected.to eq(project_deploy_token) } + end + end end context 'with uploads' do @@ -6824,50 +6851,46 @@ RSpec.describe Project, factory_default: :keep do end describe '#access_request_approvers_to_be_notified' do - context 'for a personal project' do - let_it_be(:project) { create(:project) } - let_it_be(:maintainer) { create(:user) } + shared_examples 'returns active, non_invited, non_requested owners/maintainers of the project' do + specify do + maintainer = create(:project_member, :maintainer, source: project) - let(:owner_membership) { project.members.owners.find_by(user_id: project.namespace.owner_id) } + create(:project_member, :developer, project: project) + create(:project_member, :maintainer, :invited, project: project) + create(:project_member, :maintainer, :access_request, project: project) + create(:project_member, :maintainer, :blocked, project: project) + create(:project_member, :owner, :blocked, project: project) - it 'includes only the owner of the personal project' do - expect(project.access_request_approvers_to_be_notified.to_a).to eq([owner_membership]) + expect(project.access_request_approvers_to_be_notified.to_a).to match_array([maintainer, owner]) end + end - it 'includes the maintainers of the personal project, if any' do - project.add_maintainer(maintainer) - maintainer_membership = project.members.maintainers.find_by(user_id: maintainer.id) + context 'for a personal project' do + let_it_be(:project) { create(:project) } + let_it_be(:owner) { project.members.find_by(user_id: project.first_owner.id) } - expect(project.access_request_approvers_to_be_notified.to_a).to match_array([owner_membership, maintainer_membership]) - end + it_behaves_like 'returns active, non_invited, non_requested owners/maintainers of the project' end - let_it_be(:project) { create(:project, group: create(:group, :public)) } + context 'for a project in a group' do + let_it_be(:project) { create(:project, group: create(:group, :public)) } + let_it_be(:owner) { create(:project_member, :owner, source: project) } - it 'returns a maximum of ten maintainers of the project in recent_sign_in descending order' do - limit = 2 - stub_const("Member::ACCESS_REQUEST_APPROVERS_TO_BE_NOTIFIED_LIMIT", limit) - users = create_list(:user, limit + 1, :with_sign_ins) - active_maintainers = users.map do |user| - create(:project_member, :maintainer, user: user, project: project) - end - - active_maintainers_in_recent_sign_in_desc_order = project.members_and_requesters - .id_in(active_maintainers) - .order_recent_sign_in.limit(limit) + it 'returns a maximum of ten maintainers/owners of the project in recent_sign_in descending order' do + users = create_list(:user, 11, :with_sign_ins) - expect(project.access_request_approvers_to_be_notified).to eq(active_maintainers_in_recent_sign_in_desc_order) - end + active_maintainers_and_owners = users.map do |user| + create(:project_member, [:maintainer, :owner].sample, user: user, project: project) + end - it 'returns active, non_invited, non_requested maintainers of the project' do - maintainer = create(:project_member, :maintainer, source: project) + active_maintainers_and_owners_in_recent_sign_in_desc_order = project.members + .id_in(active_maintainers_and_owners) + .order_recent_sign_in.limit(10) - create(:project_member, :developer, project: project) - create(:project_member, :maintainer, :invited, project: project) - create(:project_member, :maintainer, :access_request, project: project) - create(:project_member, :maintainer, :blocked, project: project) + expect(project.access_request_approvers_to_be_notified).to eq(active_maintainers_and_owners_in_recent_sign_in_desc_order) + end - expect(project.access_request_approvers_to_be_notified.to_a).to eq([maintainer]) + it_behaves_like 'returns active, non_invited, non_requested owners/maintainers of the project' end end @@ -7353,6 +7376,44 @@ RSpec.describe Project, factory_default: :keep do subject { create(:project).packages_enabled } it { is_expected.to be true } + + context 'when packages_enabled is enabled' do + where(:project_visibility, :expected_result) do + Gitlab::VisibilityLevel::PRIVATE | ProjectFeature::PRIVATE + Gitlab::VisibilityLevel::INTERNAL | ProjectFeature::ENABLED + Gitlab::VisibilityLevel::PUBLIC | ProjectFeature::PUBLIC + end + + with_them do + it 'set package_registry_access_level to correct value' do + project = create(:project, + visibility_level: project_visibility, + packages_enabled: false, + package_registry_access_level: ProjectFeature::DISABLED + ) + + project.update!(packages_enabled: true) + + expect(project.package_registry_access_level).to eq(expected_result) + end + end + end + + context 'when packages_enabled is disabled' do + Gitlab::VisibilityLevel.options.values.each do |project_visibility| + it 'set package_registry_access_level to DISABLED' do + project = create(:project, + visibility_level: project_visibility, + packages_enabled: true, + package_registry_access_level: ProjectFeature::PUBLIC + ) + + project.update!(packages_enabled: false) + + expect(project.package_registry_access_level).to eq(ProjectFeature::DISABLED) + end + end + end end describe '#related_group_ids' do @@ -8290,6 +8351,46 @@ RSpec.describe Project, factory_default: :keep do end end + describe "#refreshing_build_artifacts_size?" do + let_it_be(:project) { create(:project) } + + subject { project.refreshing_build_artifacts_size? } + + context 'when project has no existing refresh record' do + it { is_expected.to be_falsey } + end + + context 'when project has existing refresh record' do + context 'and refresh has not yet started' do + before do + allow(project) + .to receive_message_chain(:build_artifacts_size_refresh, :started?) + .and_return(false) + end + + it { is_expected.to eq(false) } + end + + context 'and refresh has started' do + before do + allow(project) + .to receive_message_chain(:build_artifacts_size_refresh, :started?) + .and_return(true) + end + + it { is_expected.to eq(true) } + end + end + end + + describe '#security_training_available?' do + subject { build(:project) } + + it 'returns false' do + expect(subject.security_training_available?).to eq false + end + end + private def finish_job(export_job) |