Extract EE specific files/lines for spec/models/project_*
We have the following files containing EE specific code. We should move them to ee/
spec/models/project_feature_spec.rb
diff --git a/spec/models/project_feature_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_feature_spec.rb
index fee7d65c217..e7c0bc0b6d7 100644
--- a/spec/models/project_feature_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_feature_spec.rb
@@ -64,6 +64,15 @@ describe ProjectFeature do
expect(project.feature_available?(:issues, user)).to eq(true)
end
end
+
+ it "returns true if user is an auditor" do
+ user.update_attribute(:auditor, true)
+
+ features.each do |feature|
+ project.project_feature.update_attribute("#{feature}_access_level".to_sym, ProjectFeature::PRIVATE)
+ expect(project.feature_available?(:issues, user)).to eq(true)
+ end
+ end
end
context 'when feature is enabled for everyone' do
spec/models/project_spec.rb
diff --git a/spec/models/project_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_spec.rb
index 65cf04de13c..52d17344cd2 100644
--- a/spec/models/project_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_spec.rb
@@ -49,6 +49,7 @@ describe Project do
it { is_expected.to have_one(:bamboo_service) }
it { is_expected.to have_one(:teamcity_service) }
it { is_expected.to have_one(:jira_service) }
+ it { is_expected.to have_one(:github_service) }
it { is_expected.to have_one(:redmine_service) }
it { is_expected.to have_one(:custom_issue_tracker_service) }
it { is_expected.to have_one(:bugzilla_service) }
@@ -135,15 +136,6 @@ describe Project do
end
end
- describe '#boards' do
- it 'raises an error when attempting to add more than one board to the project' do
- subject.boards.build
-
- expect { subject.boards.build }.to raise_error(Project::BoardLimitExceeded, 'Number of permitted boards exceeded')
- expect(subject.boards.size).to eq 1
- end
- end
-
describe 'ci_pipelines association' do
it 'returns only pipelines from ci_sources' do
expect(Ci::Pipeline).to receive(:ci_sources).and_call_original
@@ -163,6 +155,18 @@ describe Project do
it { is_expected.to include_module(Sortable) }
end
+ describe 'scopes' do
+ context '#with_wiki_enabled' do
+ it 'returns a project' do
+ project = create(:project_empty_repo, wiki_access_level: ProjectFeature::ENABLED)
+ project1 = create(:project, wiki_access_level: ProjectFeature::DISABLED)
+
+ expect(described_class.with_wiki_enabled).to include(project)
+ expect(described_class.with_wiki_enabled).not_to include(project1)
+ end
+ end
+ end
+
describe '.missing_kubernetes_namespace' do
let!(:project) { create(:project) }
let!(:cluster) { create(:cluster, :provided_by_user, :group) }
@@ -253,6 +257,28 @@ describe Project do
end
end
+ context '#mark_stuck_remote_mirrors_as_failed!' do
+ it 'fails stuck remote mirrors' do
+ project = create(:project, :repository, :remote_mirror)
+
+ project.remote_mirrors.first.update(
+ update_status: :started,
+ last_update_at: 2.days.ago
+ )
+
+ expect do
+ project.mark_stuck_remote_mirrors_as_failed!
+ end.to change { project.remote_mirrors.stuck.count }.from(1).to(0)
+ end
+ end
+
+ context 'mirror' do
+ subject { build(:project, mirror: true) }
+
+ it { is_expected.to validate_presence_of(:import_url) }
+ it { is_expected.to validate_presence_of(:mirror_user) }
+ end
+
describe 'import_url' do
it 'does not allow an invalid URI as import_url' do
project = build(:project, import_url: 'invalid://')
@@ -349,6 +375,14 @@ describe Project do
end
end
+ it 'creates import state when mirror gets enabled' do
+ project2 = create(:project)
+
+ expect do
+ project2.update(mirror: true, import_url: generate(:url), mirror_user: project.creator)
+ end.to change { ProjectImportState.where(project: project2).count }.from(0).to(1)
+ end
+
describe 'project pending deletion' do
let!(:project_pending_deletion) do
create(:project,
@@ -626,6 +660,14 @@ describe Project do
end
end
+ describe "#kerberos_url_to_repo" do
+ let(:project) { create(:project, path: "somewhere") }
+
+ it 'returns valid kerberos url for this repo' do
+ expect(project.kerberos_url_to_repo).to eq("#{Gitlab.config.build_gitlab_kerberos_url}/#{project.namespace.path}/somewhere.git")
+ end
+ end
+
describe "#readme_url" do
context 'with a non-existing repository' do
let(:project) { create(:project) }
@@ -862,6 +904,92 @@ describe Project do
end
end
+ describe 'repository size restrictions' do
+ let(:project) { build(:project) }
+
+ before do
+ allow_any_instance_of(ApplicationSetting).to receive(:repository_size_limit).and_return(50)
+ end
+
+ describe '#changes_will_exceed_size_limit?' do
+ before do
+ allow(project).to receive(:repository_and_lfs_size).and_return(49)
+ end
+ it 'returns true when changes go over' do
+ expect(project.changes_will_exceed_size_limit?(5)).to be_truthy
+ end
+ end
+
+ describe '#actual_size_limit' do
+ it 'returns the limit set in the application settings' do
+ expect(project.actual_size_limit).to eq(50)
+ end
+
+ it 'returns the value set in the group' do
+ group = create(:group, repository_size_limit: 100)
+ project.update_attribute(:namespace_id, group.id)
+
+ expect(project.actual_size_limit).to eq(100)
+ end
+
+ it 'returns the value set locally' do
+ project.update_attribute(:repository_size_limit, 75)
+
+ expect(project.actual_size_limit).to eq(75)
+ end
+ end
+
+ describe '#size_limit_enabled?' do
+ it 'returns false when disabled' do
+ project.update_attribute(:repository_size_limit, 0)
+
+ expect(project.size_limit_enabled?).to be_falsey
+ end
+
+ it 'returns true when a limit is set' do
+ project.update_attribute(:repository_size_limit, 75)
+
+ expect(project.size_limit_enabled?).to be_truthy
+ end
+ end
+
+ describe '#above_size_limit?' do
+ let(:project) do
+ create(:project,
+ statistics: build(:project_statistics))
+ end
+
+ it 'returns true when above the limit' do
+ allow(project).to receive(:repository_and_lfs_size).and_return(100)
+
+ expect(project.above_size_limit?).to be_truthy
+ end
+
+ it 'returns false when not over the limit' do
+ expect(project.above_size_limit?).to be_falsey
+ end
+ end
+
+ describe '#size_to_remove' do
+ it 'returns the correct value' do
+ allow(project).to receive(:repository_and_lfs_size).and_return(100)
+
+ expect(project.size_to_remove).to eq(50)
+ end
+ end
+ end
+
+ describe '#repository_size_limit column' do
+ it 'support values up to 8 exabytes' do
+ project = create(:project)
+ project.update_column(:repository_size_limit, 8.exabytes - 1)
+
+ project.reload
+
+ expect(project.repository_size_limit).to eql(8.exabytes - 1)
+ end
+ end
+
describe '#default_issues_tracker?' do
it "is true if used internal tracker" do
project = build(:project)
@@ -1864,12 +1992,24 @@ describe Project do
end
describe 'handling import URL' do
- it 'returns the sanitized URL' do
- project = create(:project, :import_started, import_url: 'http://user:pass@test.com')
+ context 'when project is a mirror' do
+ it 'returns the full URL' do
+ project = create(:project, :mirror, import_url: 'http://user:pass@test.com')
+
+ project.import_state.finish
+
+ expect(project.reload.import_url).to eq('http://user:pass@test.com')
+ end
+ end
+
+ context 'when project is not a mirror' do
+ it 'returns the sanitized URL' do
+ project = create(:project, :import_started, import_url: 'http://user:pass@test.com')
- project.import_state.finish
+ project.import_state.finish
- expect(project.reload.import_url).to eq('http://test.com')
+ expect(project.reload.import_url).to eq('http://test.com')
+ end
end
end
@@ -2149,6 +2289,32 @@ describe Project do
expect(project.add_import_job).to eq(import_jid)
end
+
+ context 'without mirror' do
+ it 'returns nil' do
+ project = create(:project)
+
+ expect(project.add_import_job).to be nil
+ end
+ end
+
+ context 'without repository' do
+ it 'schedules RepositoryImportWorker' do
+ project = create(:project, import_url: generate(:url))
+
+ expect(RepositoryImportWorker).to receive(:perform_async).with(project.id).and_return(import_jid)
+ expect(project.add_import_job).to eq(import_jid)
+ end
+ end
+
+ context 'with mirror' do
+ it 'schedules RepositoryUpdateMirrorWorker' do
+ project = create(:project, :mirror, :repository)
+
+ expect(RepositoryUpdateMirrorWorker).to receive(:perform_async).with(project.id).and_return(import_jid)
+ expect(project.add_import_job).to eq(import_jid)
+ end
+ end
end
context 'not forked' do
@@ -2360,6 +2526,82 @@ describe Project do
end
end
+ describe '.where_full_path_in' do
+ context 'without any paths' do
+ it 'returns an empty relation' do
+ expect(described_class.where_full_path_in([])).to eq([])
+ end
+ end
+
+ context 'without any valid paths' do
+ it 'returns an empty relation' do
+ expect(described_class.where_full_path_in(%w[foo])).to eq([])
+ end
+ end
+
+ context 'with valid paths' do
+ let!(:project1) { create(:project) }
+ let!(:project2) { create(:project) }
+
+ it 'returns the projects matching the paths' do
+ projects = described_class.where_full_path_in([project1.full_path,
+ project2.full_path])
+
+ expect(projects).to contain_exactly(project1, project2)
+ end
+
+ it 'returns projects regardless of the casing of paths' do
+ projects = described_class.where_full_path_in([project1.full_path.upcase,
+ project2.full_path.upcase])
+
+ expect(projects).to contain_exactly(project1, project2)
+ end
+ end
+ end
+
+ describe '#change_repository_storage' do
+ let(:project) { create(:project, :repository) }
+ let(:read_only_project) { create(:project, :repository, repository_read_only: true) }
+
+ before do
+ FileUtils.mkdir('tmp/tests/extra_storage')
+ stub_storage_settings('extra' => { 'path' => 'tmp/tests/extra_storage' })
+ end
+
+ after do
+ FileUtils.rm_rf('tmp/tests/extra_storage')
+ end
+
+ it 'schedule the transfer of the repository to the new storage and locks the project' do
+ expect(ProjectUpdateRepositoryStorageWorker).to receive(:perform_async).with(project.id, 'extra')
+
+ project.change_repository_storage('extra')
+ project.save
+
+ expect(project).to be_repository_read_only
+ end
+
+ it "doesn't schedule the transfer if the repository is already read-only" do
+ expect(ProjectUpdateRepositoryStorageWorker).not_to receive(:perform_async)
+
+ read_only_project.change_repository_storage('extra')
+ read_only_project.save
+ end
+
+ it "doesn't lock or schedule the transfer if the storage hasn't changed" do
+ expect(ProjectUpdateRepositoryStorageWorker).not_to receive(:perform_async)
+
+ project.change_repository_storage(project.repository_storage)
+ project.save
+
+ expect(project).not_to be_repository_read_only
+ end
+
+ it 'throws an error if an invalid repository storage is provided' do
+ expect { project.change_repository_storage('unknown') }.to raise_error(ArgumentError)
+ end
+ end
+
describe '#change_head' do
let(:project) { create(:project, :repository) }
@@ -2511,16 +2753,6 @@ describe Project do
end
end
- describe '#set_repository_writable!' do
- it 'sets repository_read_only to false' do
- project = create(:project, :read_only)
-
- expect { project.set_repository_writable! }
- .to change(project, :repository_read_only)
- .from(true).to(false)
- end
- end
-
describe '#pushes_since_gc' do
let(:project) { create(:project) }
@@ -2557,6 +2789,35 @@ describe Project do
end
end
+ describe '#repository_and_lfs_size' do
+ let(:project) { create(:project, :repository) }
+ let(:size) { 50 }
+
+ before do
+ allow(project.statistics).to receive(:total_repository_size).and_return(size)
+ end
+
+ it 'returns the total repository and lfs size' do
+ expect(project.repository_and_lfs_size).to eq(size)
+ end
+ end
+
+ describe '#approver_group_ids=' do
+ let(:project) { create(:project) }
+
+ it 'create approver_groups' do
+ group = create :group
+ group1 = create :group
+
+ project = create :project
+
+ project.approver_group_ids = "#{group.id}, #{group1.id}"
+ project.save!
+
+ expect(project.approver_groups.map(&:group)).to match_array([group, group1])
+ end
+ end
+
describe '#reset_pushes_since_gc' do
let(:project) { create(:project) }
@@ -2873,6 +3134,16 @@ describe Project do
end
end
+ describe '#create_import_state' do
+ it 'it is called after save' do
+ project = create(:project)
+
+ expect(project).to receive(:create_import_state)
+
+ project.update(mirror: true, mirror_user: project.owner, import_url: 'http://foo.com')
+ end
+ end
+
describe 'inside_path' do
let!(:project1) { create(:project, namespace: create(:namespace, path: 'name_pace')) }
let!(:project2) { create(:project) }
spec/models/project_team_spec.rb
diff --git a/spec/models/project_team_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_team_spec.rb
index 3537dead5d1..726edc30986 100644
--- a/spec/models/project_team_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_team_spec.rb
@@ -178,18 +178,27 @@ describe ProjectTeam do
end
end
- describe '#members_in_project_and_ancestors' do
- context 'group project' do
- it 'filters out users who are not members of the project' do
- group = create(:group)
- project = create(:project, group: group)
- group_member = create(:group_member, group: group)
- old_user = create(:user)
+ describe '#add_users' do
+ let(:user1) { create(:user) }
+ let(:user2) { create(:user) }
+ let(:project) { create(:project) }
- ProjectAuthorization.create!(project: project, user: old_user, access_level: Gitlab::Access::GUEST)
+ it 'add the given users to the team' do
+ project.team.add_users([user1, user2], :reporter)
- expect(project.team.members_in_project_and_ancestors).to contain_exactly(group_member.user)
- end
+ expect(project.team.reporter?(user1)).to be(true)
+ expect(project.team.reporter?(user2)).to be(true)
+ end
+ end
+
+ describe '#add_user' do
+ let(:user) { create(:user) }
+ let(:project) { create(:project) }
+
+ it 'add the given user to the team' do
+ project.team.add_user(user, :reporter)
+
+ expect(project.team.reporter?(user)).to be(true)
end
end
spec/models/project_wiki_spec.rb
diff --git a/spec/models/project_wiki_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_wiki_spec.rb
index 3ccc706edf2..e699284843c 100644
--- a/spec/models/project_wiki_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/models/project_wiki_spec.rb
@@ -54,6 +54,14 @@ describe ProjectWiki do
end
end
+ describe "#kerberos_url_to_repo" do
+ it 'returns valid kerberos url for this repo' do
+ gitlab_kerberos_url = Gitlab.config.build_gitlab_kerberos_url
+ repo_kerberos_url = "#{gitlab_kerberos_url}/#{subject.full_path}.git"
+ expect(subject.kerberos_url_to_repo).to eq(repo_kerberos_url)
+ end
+ end
+
describe "#wiki_base_path" do
it "returns the wiki base path" do
wiki_base_path = "#{Gitlab.config.gitlab.relative_url_root}/#{project.full_path}/wikis"
Edited by Yorick Peterse