Skip to content
GitLab
Next
    • GitLab: the DevOps platform
    • Explore GitLab
    • Install GitLab
    • How GitLab compares
    • Get started
    • GitLab docs
    • GitLab Learn
  • Pricing
  • Talk to an expert
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
    Projects Groups Topics Snippets
  • Register
  • Sign in
  • GitLab GitLab
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
    • Locked files
  • Issues 51,846
    • Issues 51,846
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
    • Requirements
  • Merge requests 1,575
    • Merge requests 1,575
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Artifacts
    • Schedules
    • Test cases
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Container Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • GitLab.orgGitLab.org
  • GitLabGitLab
  • Issues
  • #9506
Closed
Open
Issue created Jan 30, 2019 by Yorick Peterse@yorickpeterseContributor

Move all EE specific specs to the ee/specs directory

EE specific code that resides in spec should be moved to corresponding EE specific tests that reside in ee/spec.

Differences

spec/controllers/projects/project_members_controller_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/controllers/projects/project_members_controller_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/controllers/projects/project_members_controller_spec.rb
index 4141e41c7a7..1c3ada0dfa5 100644
--- a/spec/controllers/projects/project_members_controller_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/controllers/projects/project_members_controller_spec.rb
@@ -4,7 +4,8 @@ require('spec_helper')
 
 describe Projects::ProjectMembersController do
   let(:user) { create(:user) }
-  let(:project) { create(:project, :public, :access_requestable) }
+  let(:project) { create(:project, :public, :access_requestable, namespace: namespace) }
+  let(:namespace) { create :group }
 
   describe 'GET index' do
     it 'has the project_members address with a 200 status code' do
@@ -315,6 +316,13 @@ describe Projects::ProjectMembersController do
   end
 
   describe 'POST apply_import' do
+    subject(:apply_import) do
+      post(:apply_import, params: {
+        namespace_id: project.namespace,
+        project_id: project,
+        source_project_id: another_project.id
+      })
+    end
     let(:another_project) { create(:project, :private) }
     let(:member) { create(:user) }
 
@@ -324,40 +332,44 @@ describe Projects::ProjectMembersController do
       sign_in(user)
     end
 
-    shared_context 'import applied' do
-      before do
-        post(:apply_import, params: {
-                              namespace_id: project.namespace,
-                              project_id: project,
-                              source_project_id: another_project.id
-                            })
-      end
-    end
-
     context 'when user can access source project members' do
       before do
         another_project.add_guest(user)
       end
 
-      include_context 'import applied'
-
       it 'imports source project members' do
+        apply_import
+
         expect(project.team_members).to include member
         expect(response).to set_flash.to 'Successfully imported'
         expect(response).to redirect_to(
           project_project_members_path(project)
         )
       end
+
+      context 'and the project group has membership lock enabled' do
+        before do
+          project.namespace.update(membership_lock: true)
+        end
+
+        it 'responds with 403' do
+          apply_import
+
+          expect(response.status).to eq 403
+        end
+      end
     end
 
     context 'when user is not member of a source project' do
-      include_context 'import applied'
-
       it 'does not import team members' do
+        apply_import
+
         expect(project.team_members).not_to include member
       end
 
       it 'responds with not found' do
+        apply_import
+
         expect(response.status).to eq 404
       end
     end
@@ -365,40 +377,78 @@ describe Projects::ProjectMembersController do
 
   describe 'POST create' do
     let(:stranger) { create(:user) }
+    subject(:create_member) do
+      post :create, params: {
+        user_ids: stranger.id,
+        namespace_id: project.namespace,
+        access_level: access_level,
+        project_id: project
+      }
+    end
+    let(:access_level) { nil }
+
+    before do
+      project.add_maintainer(user)
+      sign_in(user)
+    end
 
     context 'when creating owner' do
-      before do
-        project.add_maintainer(user)
-        sign_in(user)
-      end
+      let(:access_level) { Member::OWNER }
 
       it 'does not create a member' do
-        expect do
-          post :create, params: {
-                          user_ids: stranger.id,
-                          namespace_id: project.namespace,
-                          access_level: Member::OWNER,
-                          project_id: project
-                        }
-        end.to change { project.members.count }.by(0)
+        expect { create_member }.not_to change { project.members.count }
       end
     end
 
     context 'when create maintainer' do
+      let(:access_level) { Member::MAINTAINER }
+
+      it 'creates a member' do
+        expect { create_member }.to change { project.members.count }.by(1)
+      end
+    end
+
+    context 'when project group has membership lock enabled' do
       before do
-        project.add_maintainer(user)
-        sign_in(user)
+        project.namespace.update(membership_lock: true)
       end
 
-      it 'creates a member' do
-        expect do
-          post :create, params: {
-                          user_ids: stranger.id,
-                          namespace_id: project.namespace,
-                          access_level: Member::MAINTAINER,
-                          project_id: project
-                        }
-        end.to change { project.members.count }.by(1)
+      it 'responds with 403' do
+        create_member
+
+        expect(response.status).to eq 403
+      end
+    end
+  end
+
+  describe 'GET import' do
+    subject(:import) do
+      get :import, params: {
+        namespace_id: project.namespace,
+        project_id: project
+      }
+    end
+
+    before do
+      project.add_maintainer(user)
+      sign_in(user)
+    end
+
+    it 'responds with 200' do
+      import
+
+      expect(response.status).to eq 200
+    end
+
+    context 'when project group has membership lock enabled' do
+      before do
+        project.namespace.update(membership_lock: true)
+      end
+
+      it 'responds with 403' do
+        import
+
+        expect(response.status).to eq 403
       end
     end
   end
spec/db/schema_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31109
diff --git a/spec/db/schema_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/db/schema_spec.rb
index 6cfec5f4017..74b2f7ebfed 100644
--- a/spec/db/schema_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/db/schema_spec.rb
@@ -1,12 +1,16 @@
 # frozen_string_literal: true
 
 require 'spec_helper'
+require Rails.root.join('ee', 'spec', 'db', 'schema_support')
 
 describe 'Database schema' do
+  prepend ::EE::DB::SchemaSupport
+
   let(:connection) { ActiveRecord::Base.connection }
   let(:tables) { connection.tables }
 
   # Use if you are certain that this column should not have a foreign key
+  # EE: edit the ee/spec/db/schema_support.rb
   IGNORED_FK_COLUMNS = {
     abuse_reports: %w[reporter_id user_id],
     application_settings: %w[performance_bar_allowed_group_id slack_app_id snowplow_site_id],
spec/features/dashboard/todos/todos_filtering_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31109
diff --git a/spec/features/dashboard/todos/todos_filtering_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/dashboard/todos/todos_filtering_spec.rb
index 85f865321cf..3ea42748936 100644
--- a/spec/features/dashboard/todos/todos_filtering_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/dashboard/todos/todos_filtering_spec.rb
@@ -4,23 +4,36 @@ describe 'Dashboard > User filters todos', :js do
   let(:user_1)    { create(:user, username: 'user_1', name: 'user_1') }
   let(:user_2)    { create(:user, username: 'user_2', name: 'user_2') }
 
-  let(:project_1) { create(:project, name: 'project_1') }
-  let(:project_2) { create(:project, name: 'project_2') }
+  let(:group1) { create(:group) }
+  let(:group2) { create(:group) }
 
-  let(:issue) { create(:issue, title: 'issue', project: project_1) }
+  let(:project_1) { create(:project, name: 'project_1', namespace: group1) }
+  let(:project_2) { create(:project, name: 'project_2', namespace: group1) }
+  let(:project_3) { create(:project, name: 'project_3', namespace: group2) }
+
+  let(:issue1) { create(:issue, title: 'issue', project: project_1) }
+  let(:issue2) { create(:issue, title: 'issue', project: project_3) }
 
   let!(:merge_request) { create(:merge_request, source_project: project_2, title: 'merge_request') }
 
   before do
-    create(:todo, user: user_1, author: user_2, project: project_1, target: issue, action: 1)
+    create(:todo, user: user_1, author: user_2, project: project_1, target: issue1, action: 1)
+    create(:todo, user: user_1, author: user_2, project: project_3, target: issue2, action: 1)
     create(:todo, user: user_1, author: user_1, project: project_2, target: merge_request, action: 2)
 
     project_1.add_developer(user_1)
     project_2.add_developer(user_1)
+    project_3.add_developer(user_1)
     sign_in(user_1)
     visit dashboard_todos_path
   end
 
+  it 'displays all todos without a filter' do
+    expect(page).to have_content issue1.to_reference(full: true)
+    expect(page).to have_content merge_request.to_reference(full: true)
+    expect(page).to have_content issue2.to_reference(full: true)
+  end
+
   it 'filters by project' do
     click_button 'Project'
     within '.dropdown-menu-project' do
@@ -34,6 +47,20 @@ describe 'Dashboard > User filters todos', :js do
     expect(page).not_to have_content project_2.full_name
   end
 
+  it 'filters by group' do
+    click_button 'Group'
+    within '.dropdown-menu-group' do
+      fill_in 'Search groups', with: group1.full_name
+      click_link group1.full_name
+    end
+
+    wait_for_requests
+
+    expect(page).to     have_content issue1.to_reference(full: true)
+    expect(page).to     have_content merge_request.to_reference(full: true)
+    expect(page).not_to have_content issue2.to_reference(full: true)
+  end
+
   context 'Author filter' do
     it 'filters by author' do
       click_button 'Author'
@@ -63,7 +90,7 @@ describe 'Dashboard > User filters todos', :js do
     it 'shows only authors of existing done todos' do
       user_3 = create :user
       user_4 = create :user
-      create(:todo, user: user_1, author: user_3, project: project_1, target: issue, action: 1, state: :done)
+      create(:todo, user: user_1, author: user_3, project: project_1, target: issue1, action: 1, state: :done)
       create(:todo, user: user_1, author: user_4, project: project_2, target: merge_request, action: 2, state: :done)
 
       project_1.add_developer(user_3)
@@ -92,14 +119,15 @@ describe 'Dashboard > User filters todos', :js do
 
     wait_for_requests
 
-    expect(find('.todos-list')).to     have_content issue.to_reference
+    expect(find('.todos-list')).to     have_content issue1.to_reference
+    expect(find('.todos-list')).to     have_content issue2.to_reference
     expect(find('.todos-list')).not_to have_content merge_request.to_reference
   end
 
   describe 'filter by action' do
     before do
       create(:todo, :build_failed, user: user_1, author: user_2, project: project_1)
-      create(:todo, :marked, user: user_1, author: user_2, project: project_1, target: issue)
+      create(:todo, :marked, user: user_1, author: user_2, project: project_1, target: issue1)
     end
 
     it 'filters by Assigned' do
spec/features/protected_tags_spec.rb https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31109
diff --git a/spec/features/protected_tags_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/protected_tags_spec.rb
index 652542b1719..7b9dde29ce9 100644
--- a/spec/features/protected_tags_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/protected_tags_spec.rb
@@ -14,6 +14,7 @@ describe 'Protected Tags', :js do
     it "allows creating explicit protected tags" do
       visit project_protected_tags_path(project)
       set_protected_tag_name('some-tag')
+      set_allowed_to('create')
       click_on "Protect"
 
       within(".protected-tags-list") { expect(page).to have_content('some-tag') }
@@ -27,6 +28,7 @@ describe 'Protected Tags', :js do
 
       visit project_protected_tags_path(project)
       set_protected_tag_name('some-tag')
+      set_allowed_to('create')
       click_on "Protect"
 
       within(".protected-tags-list") { expect(page).to have_content(commit.id[0..7]) }
@@ -35,6 +37,7 @@ describe 'Protected Tags', :js do
     it "displays an error message if the named tag does not exist" do
       visit project_protected_tags_path(project)
       set_protected_tag_name('some-tag')
+      set_allowed_to('create')
       click_on "Protect"
 
       within(".protected-tags-list") { expect(page).to have_content('tag was removed') }
@@ -45,6 +48,7 @@ describe 'Protected Tags', :js do
     it "allows creating protected tags with a wildcard" do
       visit project_protected_tags_path(project)
       set_protected_tag_name('*-stable')
+      set_allowed_to('create')
       click_on "Protect"
 
       within(".protected-tags-list") { expect(page).to have_content('*-stable') }
@@ -58,6 +62,7 @@ describe 'Protected Tags', :js do
 
       visit project_protected_tags_path(project)
       set_protected_tag_name('*-stable')
+      set_allowed_to('create')
       click_on "Protect"
 
       within(".protected-tags-list") do
@@ -73,6 +78,7 @@ describe 'Protected Tags', :js do
 
       visit project_protected_tags_path(project)
       set_protected_tag_name('*-stable')
+      set_allowed_to('create')
       click_on "Protect"
 
       visit project_protected_tags_path(project)
spec/features/security/profile_access_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/features/security/profile_access_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/security/profile_access_spec.rb
index 044a47567be..9fa5ae0df7d 100644
--- a/spec/features/security/profile_access_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/security/profile_access_spec.rb
@@ -10,6 +10,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 
@@ -18,6 +19,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 
@@ -26,6 +28,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 
@@ -34,6 +37,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 
@@ -42,6 +46,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 
@@ -50,6 +55,7 @@ describe "Profile access" do
 
     it { is_expected.to be_allowed_for :admin }
     it { is_expected.to be_allowed_for :user }
+    it { is_expected.to be_allowed_for :auditor }
     it { is_expected.to be_denied_for :visitor }
   end
 end
spec/features/security/project/private_access_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31119
diff --git a/spec/features/security/project/private_access_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/security/project/private_access_spec.rb
index f380bc122a7..65dbae1c674 100644
--- a/spec/features/security/project/private_access_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/security/project/private_access_spec.rb
@@ -126,7 +126,7 @@ describe "Private Project Access" do
 
   describe "GET /:project_path/blob" do
     let(:commit) { project.repository.commit }
-    subject { project_blob_path(project, File.join(commit.id, '.gitignore'))}
+    subject { project_blob_path(project, File.join(commit.id, '.gitignore')) }
 
     it { is_expected.to be_allowed_for(:admin) }
     it { is_expected.to be_allowed_for(:owner).of(project) }
spec/features/usage_stats_consent_spec.rb https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31109
diff --git a/spec/features/usage_stats_consent_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/usage_stats_consent_spec.rb
index dd8f3179895..86da58581c5 100644
--- a/spec/features/usage_stats_consent_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/features/usage_stats_consent_spec.rb
@@ -8,7 +8,7 @@ describe 'Usage stats consent' do
     let(:message) { 'To help improve GitLab, we would like to periodically collect usage information.' }
 
     before do
-      allow(user).to receive(:has_current_license?).and_return false
+      allow_any_instance_of(EE::User).to receive(:has_current_license?).and_return false
 
       gitlab_sign_in(user)
     end
spec/fixtures/lib/gitlab/metrics/dashboard/schemas/dashboard.json: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31119
diff --git a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/dashboard.json b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/dashboard.json
index 1ee1205e29a..5d779a323c2 100644
--- a/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/dashboard.json
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/fixtures/lib/gitlab/metrics/dashboard/schemas/dashboard.json
@@ -1,6 +1,10 @@
 {
   "type": "object",
-  "required": ["dashboard", "priority", "panel_groups"],
+  "required": [
+    "dashboard",
+    "priority",
+    "panel_groups"
+  ],
   "properties": {
     "dashboard": { "type": "string" },
     "priority": { "type": "number" },
spec/lib/banzai/filter/wiki_link_filter_spec.rb https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31109
diff --git a/spec/lib/banzai/filter/wiki_link_filter_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/banzai/filter/wiki_link_filter_spec.rb
index cce1cd0b284..75745310d43 100644
--- a/spec/lib/banzai/filter/wiki_link_filter_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/banzai/filter/wiki_link_filter_spec.rb
@@ -88,7 +88,7 @@ describe Banzai::Filter::WikiLinkFilter do
         "javascript:",
         "java\0script:",
         "   javascript:"
-        ]
+      ]
 
       invalid_slugs.each do |slug|
         context "with the slug #{slug}" do
spec/lib/gitlab/ci/config/entry/job_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/lib/gitlab/ci/config/entry/job_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/ci/config/entry/job_spec.rb
index 25766d34c65..c34e3ec9af1 100644
--- a/spec/lib/gitlab/ci/config/entry/job_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/ci/config/entry/job_spec.rb
@@ -176,6 +176,46 @@ describe Gitlab::Ci::Config::Entry::Job do
         end
       end
 
+      context 'when parallel value is not correct' do
+        context 'when it is not a numeric value' do
+          let(:config) { { parallel: true } }
+
+          it 'returns error about invalid type' do
+            expect(entry).not_to be_valid
+            expect(entry.errors).to include 'job parallel is not a number'
+          end
+        end
+
+        context 'when it is lower than two' do
+          let(:config) { { parallel: 1 } }
+
+          it 'returns error about value too low' do
+            expect(entry).not_to be_valid
+            expect(entry.errors)
+              .to include 'job parallel must be greater than or equal to 2'
+          end
+        end
+
+        context 'when it is bigger than 50' do
+          let(:config) { { parallel: 51 } }
+
+          it 'returns error about value too high' do
+            expect(entry).not_to be_valid
+            expect(entry.errors)
+              .to include 'job parallel must be less than or equal to 50'
+          end
+        end
+
+        context 'when it is not an integer' do
+          let(:config) { { parallel: 1.5 } }
+
+          it 'returns error about wrong value' do
+            expect(entry).not_to be_valid
+            expect(entry.errors).to include 'job parallel must be an integer'
+          end
+        end
+      end
+
       context 'when delayed job' do
         context 'when start_in is specified' do
           let(:config) { { script: 'echo', when: 'delayed', start_in: '1 day' } }
spec/lib/gitlab/git_ref_validator_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/lib/gitlab/git_ref_validator_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/git_ref_validator_spec.rb
index b63389af29f..6fc41cd64f9 100644
--- a/spec/lib/gitlab/git_ref_validator_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/git_ref_validator_spec.rb
@@ -4,66 +4,66 @@ describe Gitlab::GitRefValidator do
   using RSpec::Parameterized::TableSyntax
 
   context '.validate' do
-    it { expect(described_class.validate('feature/new')).to be true }
-    it { expect(described_class.validate('implement_@all')).to be true }
-    it { expect(described_class.validate('my_new_feature')).to be true }
-    it { expect(described_class.validate('my-branch')).to be true }
-    it { expect(described_class.validate('#1')).to be true }
-    it { expect(described_class.validate('feature/refs/heads/foo')).to be true }
-    it { expect(described_class.validate('feature/~new/')).to be false }
-    it { expect(described_class.validate('feature/^new/')).to be false }
-    it { expect(described_class.validate('feature/:new/')).to be false }
-    it { expect(described_class.validate('feature/?new/')).to be false }
-    it { expect(described_class.validate('feature/*new/')).to be false }
-    it { expect(described_class.validate('feature/[new/')).to be false }
-    it { expect(described_class.validate('feature/new/')).to be false }
-    it { expect(described_class.validate('feature/new.')).to be false }
-    it { expect(described_class.validate('feature\@{')).to be false }
-    it { expect(described_class.validate('feature\new')).to be false }
-    it { expect(described_class.validate('feature//new')).to be false }
-    it { expect(described_class.validate('feature new')).to be false }
-    it { expect(described_class.validate('refs/heads/')).to be false }
-    it { expect(described_class.validate('refs/remotes/')).to be false }
-    it { expect(described_class.validate('refs/heads/feature')).to be false }
-    it { expect(described_class.validate('refs/remotes/origin')).to be false }
-    it { expect(described_class.validate('-')).to be false }
-    it { expect(described_class.validate('-branch')).to be false }
-    it { expect(described_class.validate('+foo:bar')).to be false }
-    it { expect(described_class.validate('foo:bar')).to be false }
-    it { expect(described_class.validate('.tag')).to be false }
-    it { expect(described_class.validate('my branch')).to be false }
-    it { expect(described_class.validate("\xA0\u0000\xB0")).to be false }
+    it { expect(described_class.validate('feature/new')).to be_truthy }
+    it { expect(described_class.validate('implement_@all')).to be_truthy }
+    it { expect(described_class.validate('my_new_feature')).to be_truthy }
+    it { expect(described_class.validate('my-branch')).to be_truthy }
+    it { expect(described_class.validate('#1')).to be_truthy }
+    it { expect(described_class.validate('feature/refs/heads/foo')).to be_truthy }
+    it { expect(described_class.validate('feature/~new/')).to be_falsey }
+    it { expect(described_class.validate('feature/^new/')).to be_falsey }
+    it { expect(described_class.validate('feature/:new/')).to be_falsey }
+    it { expect(described_class.validate('feature/?new/')).to be_falsey }
+    it { expect(described_class.validate('feature/*new/')).to be_falsey }
+    it { expect(described_class.validate('feature/[new/')).to be_falsey }
+    it { expect(described_class.validate('feature/new/')).to be_falsey }
+    it { expect(described_class.validate('feature/new.')).to be_falsey }
+    it { expect(described_class.validate('feature\@{')).to be_falsey }
+    it { expect(described_class.validate('feature\new')).to be_falsey }
+    it { expect(described_class.validate('feature//new')).to be_falsey }
+    it { expect(described_class.validate('feature new')).to be_falsey }
+    it { expect(described_class.validate('refs/heads/')).to be_falsey }
+    it { expect(described_class.validate('refs/remotes/')).to be_falsey }
+    it { expect(described_class.validate('refs/heads/feature')).to be_falsey }
+    it { expect(described_class.validate('refs/remotes/origin')).to be_falsey }
+    it { expect(described_class.validate('-')).to be_falsey }
+    it { expect(described_class.validate('-branch')).to be_falsey }
+    it { expect(described_class.validate('+foo:bar')).to be_falsey }
+    it { expect(described_class.validate('foo:bar')).to be_falsey }
+    it { expect(described_class.validate('.tag')).to be_falsey }
+    it { expect(described_class.validate('my branch')).to be_falsey }
+    it { expect(described_class.validate("\xA0\u0000\xB0")).to be_falsey }
   end
 
   context '.validate_merge_request_branch' do
-    it { expect(described_class.validate_merge_request_branch('HEAD')).to be true }
-    it { expect(described_class.validate_merge_request_branch('feature/new')).to be true }
-    it { expect(described_class.validate_merge_request_branch('implement_@all')).to be true }
-    it { expect(described_class.validate_merge_request_branch('my_new_feature')).to be true }
-    it { expect(described_class.validate_merge_request_branch('my-branch')).to be true }
-    it { expect(described_class.validate_merge_request_branch('#1')).to be true }
-    it { expect(described_class.validate_merge_request_branch('feature/refs/heads/foo')).to be true }
-    it { expect(described_class.validate_merge_request_branch('feature/~new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/^new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/:new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/?new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/*new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/[new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/new/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature/new.')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature\@{')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature\new')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature//new')).to be false }
-    it { expect(described_class.validate_merge_request_branch('feature new')).to be false }
-    it { expect(described_class.validate_merge_request_branch('refs/heads/master')).to be true }
-    it { expect(described_class.validate_merge_request_branch('refs/heads/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('refs/remotes/')).to be false }
-    it { expect(described_class.validate_merge_request_branch('-')).to be false }
-    it { expect(described_class.validate_merge_request_branch('-branch')).to be false }
-    it { expect(described_class.validate_merge_request_branch('+foo:bar')).to be false }
-    it { expect(described_class.validate_merge_request_branch('foo:bar')).to be false }
-    it { expect(described_class.validate_merge_request_branch('.tag')).to be false }
-    it { expect(described_class.validate_merge_request_branch('my branch')).to be false }
-    it { expect(described_class.validate_merge_request_branch("\xA0\u0000\xB0")).to be false }
+    it { expect(described_class.validate_merge_request_branch('HEAD')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('feature/new')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('implement_@all')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('my_new_feature')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('my-branch')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('#1')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('feature/refs/heads/foo')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('feature/~new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/^new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/:new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/?new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/*new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/[new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/new/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature/new.')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature\@{')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature\new')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature//new')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('feature new')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('refs/heads/master')).to be_truthy }
+    it { expect(described_class.validate_merge_request_branch('refs/heads/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('refs/remotes/')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('-')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('-branch')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('+foo:bar')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('foo:bar')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('.tag')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch('my branch')).to be_falsey }
+    it { expect(described_class.validate_merge_request_branch("\xA0\u0000\xB0")).to be_falsey }
   end
 end
spec/lib/gitlab/object_hierarchy_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/lib/gitlab/object_hierarchy_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/object_hierarchy_spec.rb
index e6e9ae3223e..4154f9cbe80 100644
--- a/spec/lib/gitlab/object_hierarchy_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/object_hierarchy_spec.rb
@@ -145,6 +145,20 @@ describe Gitlab::ObjectHierarchy, :postgresql do
     end
   end
 
+  describe '#root' do
+    it 'includes only the roots' do
+      relation = described_class.new(Group.where(id: child2)).roots
+
+      expect(relation).to contain_exactly(parent)
+    end
+
+    it 'when quering parent it includes parent' do
+      relation = described_class.new(Group.where(id: parent)).roots
+
+      expect(relation).to contain_exactly(parent)
+    end
+  end
+
   describe '#all_objects' do
     let(:relation) do
       described_class.new(Group.where(id: child1.id)).all_objects
spec/lib/gitlab/search_results_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/lib/gitlab/search_results_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/search_results_spec.rb
index 3d27156b356..cc029038108 100644
--- a/spec/lib/gitlab/search_results_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/search_results_spec.rb
@@ -272,7 +272,6 @@ describe Gitlab::SearchResults do
       milestone_1 = create(:milestone, project: private_project_1, title: 'Private project with access milestone', state: 'closed')
       milestone_2 = create(:milestone, project: internal_project, title: 'Internal project milestone')
       milestone_3 = create(:milestone, project: public_project_1, title: 'Public project with milestones enabled milestone')
-      # Global search scope takes user authorized projects, internal projects and public projects.
       limit_projects = ProjectsFinder.new(current_user: user).execute
 
       milestones = described_class.new(user, limit_projects, 'milestone').objects('milestones')
spec/lib/gitlab/sidekiq_config_spec.rb: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14832
diff --git a/spec/lib/gitlab/sidekiq_config_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/sidekiq_config_spec.rb
index 0c66d764851..9c83af740b7 100644
--- a/spec/lib/gitlab/sidekiq_config_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/lib/gitlab/sidekiq_config_spec.rb
@@ -21,25 +21,4 @@ describe Gitlab::SidekiqConfig do
       expect(queues).to include('default')
     end
   end
-
-  describe '.expand_queues' do
-    it 'expands queue namespaces to concrete queue names' do
-      queues = described_class.expand_queues(%w[cronjob])
-
-      expect(queues).to include('cronjob:stuck_import_jobs')
-      expect(queues).to include('cronjob:stuck_merge_jobs')
-    end
-
-    it 'lets concrete queue names pass through' do
-      queues = described_class.expand_queues(%w[post_receive])
-
-      expect(queues).to include('post_receive')
-    end
-
-    it 'lets unknown queues pass through' do
-      queues = described_class.expand_queues(%w[unknown])
-
-      expect(queues).to include('unknown')
-    end
-  end
 end
spec/requests/api/pipelines_spec.rb https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14823
diff --git a/spec/requests/api/pipelines_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/pipelines_spec.rb
index 35b3dd219f7..ba68c517f81 100644
--- a/spec/requests/api/pipelines_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/pipelines_spec.rb
@@ -532,8 +532,14 @@ describe API::Pipelines do
         expect(json_response['message']).to eq '404 Not found'
       end
 
-      it 'does not log an audit event' do
-        expect { delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", owner) }.not_to change { SecurityEvent.count }
+      context 'when audit events is enabled' do
+        before do
+          stub_licensed_features(extended_audit_events: true, admin_audit_log: true)
+        end
+
+        it 'does not log an audit event' do
+          expect { delete api("/projects/#{project.id}/pipelines/#{pipeline.id}", owner) }.not_to change { SecurityEvent.count }
+        end
       end
 
       context 'when the pipeline has jobs' do
spec/requests/api/resource_label_events_spec.rb: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14845
diff --git a/spec/requests/api/resource_label_events_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/resource_label_events_spec.rb
index 37b46eaeb86..588e9c7050e 100644
--- a/spec/requests/api/resource_label_events_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/requests/api/resource_label_events_spec.rb
@@ -63,6 +63,22 @@ describe API::ResourceLabelEvents do
     end
   end
 
+  context 'when eventable is an Epic' do
+    let(:group) { create(:group, :public) }
+    let(:epic) { create(:epic, group: group, author: user) }
+
+    before do
+      group.add_owner(user)
+      stub_licensed_features(epics: true)
+    end
+
+    it_behaves_like 'resource_label_events API', 'groups', 'epics', 'id' do
+      let(:parent) { group }
+      let(:eventable) { epic }
+      let!(:event) { create(:resource_label_event, epic: epic) }
+    end
+  end
+
   context 'when eventable is a Merge Request' do
     let(:merge_request) { create(:merge_request, source_project: project, target_project: project, author: user) }
spec/services/ci/destroy_pipeline_service_spec.rb: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/14832
diff --git a/spec/services/ci/destroy_pipeline_service_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/services/ci/destroy_pipeline_service_spec.rb
index bff2b3179fb..f7adfdc6cfa 100644
--- a/spec/services/ci/destroy_pipeline_service_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/services/ci/destroy_pipeline_service_spec.rb
@@ -17,21 +17,6 @@ describe ::Ci::DestroyPipelineService do
       expect { pipeline.reload }.to raise_error(ActiveRecord::RecordNotFound)
     end
 
-    it 'clears the cache', :use_clean_rails_memory_store_caching do
-      create(:commit_status, :success, pipeline: pipeline, ref: pipeline.ref)
-
-      expect(project.pipeline_status.has_status?).to be_truthy
-
-      subject
-
-      # Need to use find to avoid memoization
-      expect(Project.find(project.id).pipeline_status.has_status?).to be_falsey
-    end
-
-    it 'does not log an audit event' do
-      expect { subject }.not_to change { SecurityEvent.count }
-    end
-
     context 'when the pipeline has jobs' do
       let!(:build) { create(:ci_build, project: project, pipeline: pipeline) }
spec/services/quick_actions/interpret_service_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31119
diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/services/quick_actions/interpret_service_spec.rb
index 95a131e8c86..71c4c3ad0d7 100644
--- a/spec/services/quick_actions/interpret_service_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/services/quick_actions/interpret_service_spec.rb
@@ -574,7 +574,7 @@ describe QuickActions::InterpretService do
 
       context 'Issue' do
         it 'populates assignee_ids: [] if content contains /unassign' do
-          issue.update(assignee_ids: [developer.id])
+          issue.update!(assignee_ids: [developer.id])
           _, updates = service.execute(content, issue)
 
           expect(updates).to eq(assignee_ids: [])
@@ -583,7 +583,7 @@ describe QuickActions::InterpretService do
 
       context 'Merge Request' do
         it 'populates assignee_ids: [] if content contains /unassign' do
-          merge_request.update(assignee_ids: [developer.id])
+          merge_request.update!(assignee_ids: [developer.id])
           _, updates = service.execute(content, merge_request)
 
           expect(updates).to eq(assignee_ids: [])
spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31119
diff --git a/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
index 0206928a211..88c4b52b3a6 100644
--- a/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb
@@ -12,6 +12,7 @@ describe 'projects/merge_requests/creations/_new_submit.html.haml' do
     assign(:hidden_commit_count, 0)
     assign(:total_commit_count, merge_request.commits.count)
     assign(:project, merge_request.target_project)
+    assign(:target_project, merge_request.target_project)
     assign(:mr_presenter, merge_request.present(current_user: merge_request.author))
 
     allow(view).to receive(:can?).and_return(true)
spec/views/projects/merge_requests/edit.html.haml_spec.rb: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/31119
diff --git a/spec/views/projects/merge_requests/edit.html.haml_spec.rb b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/views/projects/merge_requests/edit.html.haml_spec.rb
index 529afa03f9c..0a3a46210ed 100644
--- a/spec/views/projects/merge_requests/edit.html.haml_spec.rb
+++ b/home/yorickpeterse/Projects/gitlab/gdk-ee/gitlab/spec/views/projects/merge_requests/edit.html.haml_spec.rb
@@ -23,6 +23,7 @@ describe 'projects/merge_requests/edit.html.haml' do
 
   before do
     assign(:project, project)
+    assign(:target_project, project)
     assign(:merge_request, closed_merge_request)
     assign(:mr_presenter, closed_merge_request.present(current_user: user))
Edited Jul 25, 2019 by Robert Speicher
Assignee
Assign to
Time tracking