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 Feb 26, 2019 by Yorick Peterse
Assignee Loading
Time tracking Loading