diff --git a/.rubocop.yml b/.rubocop.yml
index e73500be2a92666d3951f907284c10ab84fc82cd..8c43f6909cf24aaba4f65e5593e02b03b4f067e5 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -983,10 +983,12 @@ RSpec/ExpectActual:
 
 # Checks the file and folder naming of the spec file.
 RSpec/FilePath:
-  Enabled: false
-  CustomTransform:
-    RuboCop: rubocop
-    RSpec: rspec
+  Enabled: true
+  IgnoreMethods: true
+  Exclude:
+    - 'qa/**/*'
+    - 'spec/javascripts/fixtures/*'
+    - 'spec/requests/api/v3/*'
 
 # Checks if there are focused specs.
 RSpec/Focus:
diff --git a/spec/controllers/blob_controller_spec.rb b/spec/controllers/blob_controller_spec.rb
deleted file mode 100644
index 44e011fd3a85b5cbb0948c55a279d34617f2b65e..0000000000000000000000000000000000000000
--- a/spec/controllers/blob_controller_spec.rb
+++ /dev/null
@@ -1,67 +0,0 @@
-require 'spec_helper'
-
-describe Projects::BlobController do
-  let(:project) { create(:project, :repository) }
-  let(:user)    { create(:user) }
-
-  before do
-    sign_in(user)
-
-    project.team << [user, :master]
-
-    allow(project).to receive(:branches).and_return(['master', 'foo/bar/baz'])
-    allow(project).to receive(:tags).and_return(['v1.0.0', 'v2.0.0'])
-    controller.instance_variable_set(:@project, project)
-  end
-
-  describe "GET show" do
-    render_views
-
-    before do
-      get(:show,
-          namespace_id: project.namespace,
-          project_id: project,
-          id: id)
-    end
-
-    context "valid branch, valid file" do
-      let(:id) { 'master/README.md' }
-      it { is_expected.to respond_with(:success) }
-    end
-
-    context "valid branch, invalid file" do
-      let(:id) { 'master/invalid-path.rb' }
-      it { is_expected.to respond_with(:not_found) }
-    end
-
-    context "invalid branch, valid file" do
-      let(:id) { 'invalid-branch/README.md' }
-      it { is_expected.to respond_with(:not_found) }
-    end
-
-    context "binary file" do
-      let(:id) { 'binary-encoding/encoding/binary-1.bin' }
-      it { is_expected.to respond_with(:success) }
-    end
-  end
-
-  describe 'GET show with tree path' do
-    render_views
-
-    before do
-      get(:show,
-          namespace_id: project.namespace,
-          project_id: project,
-          id: id)
-      controller.instance_variable_set(:@blob, nil)
-    end
-
-    context 'redirect to tree' do
-      let(:id) { 'markdown/doc' }
-      it 'redirects' do
-        expect(subject).
-          to redirect_to("/#{project.path_with_namespace}/tree/markdown/doc")
-      end
-    end
-  end
-end
diff --git a/spec/controllers/profiles/personal_access_tokens_spec.rb b/spec/controllers/profiles/personal_access_tokens_controller_spec.rb
similarity index 100%
rename from spec/controllers/profiles/personal_access_tokens_spec.rb
rename to spec/controllers/profiles/personal_access_tokens_controller_spec.rb
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 0fd09d156c49ea00dc20edc8a4cbbe70070b34d4..3b3caa9d3e63b4d4fdae61587dd3ae8b8fbe7487 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -3,6 +3,57 @@
 describe Projects::BlobController do
   let(:project) { create(:project, :public, :repository) }
 
+  describe "GET show" do
+    render_views
+
+    context 'with file path' do
+      before do
+        get(:show,
+            namespace_id: project.namespace,
+            project_id: project,
+            id: id)
+      end
+
+      context "valid branch, valid file" do
+        let(:id) { 'master/README.md' }
+        it { is_expected.to respond_with(:success) }
+      end
+
+      context "valid branch, invalid file" do
+        let(:id) { 'master/invalid-path.rb' }
+        it { is_expected.to respond_with(:not_found) }
+      end
+
+      context "invalid branch, valid file" do
+        let(:id) { 'invalid-branch/README.md' }
+        it { is_expected.to respond_with(:not_found) }
+      end
+
+      context "binary file" do
+        let(:id) { 'binary-encoding/encoding/binary-1.bin' }
+        it { is_expected.to respond_with(:success) }
+      end
+    end
+
+    context 'with tree path' do
+      before do
+        get(:show,
+            namespace_id: project.namespace,
+            project_id: project,
+            id: id)
+        controller.instance_variable_set(:@blob, nil)
+      end
+
+      context 'redirect to tree' do
+        let(:id) { 'markdown/doc' }
+        it 'redirects' do
+          expect(subject).
+            to redirect_to("/#{project.path_with_namespace}/tree/markdown/doc")
+        end
+      end
+    end
+  end
+
   describe 'GET diff' do
     let(:user) { create(:user) }
 
diff --git a/spec/controllers/projects/todo_controller_spec.rb b/spec/controllers/projects/todos_controller_spec.rb
similarity index 100%
rename from spec/controllers/projects/todo_controller_spec.rb
rename to spec/controllers/projects/todos_controller_spec.rb
diff --git a/spec/lib/gitlab/checks/force_push_spec.rb b/spec/lib/gitlab/checks/force_push_spec.rb
index 7a84bbebd0231912f97ead4719a6ae2d9bd2e070..bc66ce83d4ae86cd7d33c18853c1851ae0ec8cb9 100644
--- a/spec/lib/gitlab/checks/force_push_spec.rb
+++ b/spec/lib/gitlab/checks/force_push_spec.rb
@@ -1,19 +1,19 @@
 require 'spec_helper'
 
-describe Gitlab::Checks::ChangeAccess, lib: true do
+describe Gitlab::Checks::ForcePush, lib: true do
   let(:project) { create(:project, :repository) }
 
   context "exit code checking" do
     it "does not raise a runtime error if the `popen` call to git returns a zero exit code" do
       allow(Gitlab::Popen).to receive(:popen).and_return(['normal output', 0])
 
-      expect { Gitlab::Checks::ForcePush.force_push?(project, 'oldrev', 'newrev') }.not_to raise_error
+      expect { described_class.force_push?(project, 'oldrev', 'newrev') }.not_to raise_error
     end
 
     it "raises a runtime error if the `popen` call to git returns a non-zero exit code" do
       allow(Gitlab::Popen).to receive(:popen).and_return(['error', 1])
 
-      expect { Gitlab::Checks::ForcePush.force_push?(project, 'oldrev', 'newrev') }.to raise_error(RuntimeError)
+      expect { described_class.force_push?(project, 'oldrev', 'newrev') }.to raise_error(RuntimeError)
     end
   end
 end
diff --git a/spec/lib/git_ref_validator_spec.rb b/spec/lib/gitlab/git_ref_validator_spec.rb
similarity index 100%
rename from spec/lib/git_ref_validator_spec.rb
rename to spec/lib/gitlab/git_ref_validator_spec.rb
diff --git a/spec/lib/gitlab/healthchecks/db_check_spec.rb b/spec/lib/gitlab/health_checks/db_check_spec.rb
similarity index 100%
rename from spec/lib/gitlab/healthchecks/db_check_spec.rb
rename to spec/lib/gitlab/health_checks/db_check_spec.rb
diff --git a/spec/lib/gitlab/healthchecks/fs_shards_check_spec.rb b/spec/lib/gitlab/health_checks/fs_shards_check_spec.rb
similarity index 100%
rename from spec/lib/gitlab/healthchecks/fs_shards_check_spec.rb
rename to spec/lib/gitlab/health_checks/fs_shards_check_spec.rb
diff --git a/spec/lib/gitlab/healthchecks/redis_check_spec.rb b/spec/lib/gitlab/health_checks/redis_check_spec.rb
similarity index 100%
rename from spec/lib/gitlab/healthchecks/redis_check_spec.rb
rename to spec/lib/gitlab/health_checks/redis_check_spec.rb
diff --git a/spec/lib/gitlab/healthchecks/simple_check_shared.rb b/spec/lib/gitlab/health_checks/simple_check_shared.rb
similarity index 100%
rename from spec/lib/gitlab/healthchecks/simple_check_shared.rb
rename to spec/lib/gitlab/health_checks/simple_check_shared.rb
diff --git a/spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb b/spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
similarity index 100%
rename from spec/lib/gitlab/import_export/wiki_repo_bundler_spec.rb
rename to spec/lib/gitlab/import_export/wiki_repo_saver_spec.rb
diff --git a/spec/lib/gitlab/backend/shell_spec.rb b/spec/lib/gitlab/shell_spec.rb
similarity index 100%
rename from spec/lib/gitlab/backend/shell_spec.rb
rename to spec/lib/gitlab/shell_spec.rb
diff --git a/spec/lib/light_url_builder_spec.rb b/spec/lib/light_url_builder_spec.rb
deleted file mode 100644
index 3fe8cf43934d0e988ea475515c52ce4c74a4ea4e..0000000000000000000000000000000000000000
--- a/spec/lib/light_url_builder_spec.rb
+++ /dev/null
@@ -1,119 +0,0 @@
-require 'spec_helper'
-
-describe Gitlab::UrlBuilder, lib: true do
-  describe '.build' do
-    context 'when passing a Commit' do
-      it 'returns a proper URL' do
-        commit = build_stubbed(:commit)
-
-        url = described_class.build(commit)
-
-        expect(url).to eq "#{Settings.gitlab['url']}/#{commit.project.path_with_namespace}/commit/#{commit.id}"
-      end
-    end
-
-    context 'when passing an Issue' do
-      it 'returns a proper URL' do
-        issue = build_stubbed(:issue, iid: 42)
-
-        url = described_class.build(issue)
-
-        expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}"
-      end
-    end
-
-    context 'when passing a MergeRequest' do
-      it 'returns a proper URL' do
-        merge_request = build_stubbed(:merge_request, iid: 42)
-
-        url = described_class.build(merge_request)
-
-        expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}"
-      end
-    end
-
-    context 'when passing a Note' do
-      context 'on a Commit' do
-        it 'returns a proper URL' do
-          note = build_stubbed(:note_on_commit)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}"
-        end
-      end
-
-      context 'on a Commit Diff' do
-        it 'returns a proper URL' do
-          note = build_stubbed(:diff_note_on_commit)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{note.project.path_with_namespace}/commit/#{note.commit_id}#note_#{note.id}"
-        end
-      end
-
-      context 'on an Issue' do
-        it 'returns a proper URL' do
-          issue = create(:issue, iid: 42)
-          note = build_stubbed(:note_on_issue, noteable: issue)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{issue.project.path_with_namespace}/issues/#{issue.iid}#note_#{note.id}"
-        end
-      end
-
-      context 'on a MergeRequest' do
-        it 'returns a proper URL' do
-          merge_request = create(:merge_request, iid: 42)
-          note = build_stubbed(:note_on_merge_request, noteable: merge_request)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}"
-        end
-      end
-
-      context 'on a MergeRequest Diff' do
-        it 'returns a proper URL' do
-          merge_request = create(:merge_request, iid: 42)
-          note = build_stubbed(:diff_note_on_merge_request, noteable: merge_request)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{merge_request.project.path_with_namespace}/merge_requests/#{merge_request.iid}#note_#{note.id}"
-        end
-      end
-
-      context 'on a ProjectSnippet' do
-        it 'returns a proper URL' do
-          project_snippet = create(:project_snippet)
-          note = build_stubbed(:note_on_project_snippet, noteable: project_snippet)
-
-          url = described_class.build(note)
-
-          expect(url).to eq "#{Settings.gitlab['url']}/#{project_snippet.project.path_with_namespace}/snippets/#{note.noteable_id}#note_#{note.id}"
-        end
-      end
-
-      context 'on another object' do
-        it 'returns a proper URL' do
-          project = build_stubbed(:empty_project)
-
-          expect { described_class.build(project) }.
-            to raise_error(NotImplementedError, 'No URL builder defined for Project')
-        end
-      end
-    end
-
-    context 'when passing a WikiPage' do
-      it 'returns a proper URL' do
-        wiki_page = build(:wiki_page)
-        url = described_class.build(wiki_page)
-
-        expect(url).to eq "#{Gitlab.config.gitlab.url}#{wiki_page.wiki.wiki_base_path}/#{wiki_page.slug}"
-      end
-    end
-  end
-end
diff --git a/spec/mailers/emails/merge_requests_spec.rb b/spec/mailers/emails/merge_requests_spec.rb
index e22858d1d8fbbdcb8c229e3e0dc786aaf73856f5..2ad572bb5c75f728828ce8c439b285131bc12811 100644
--- a/spec/mailers/emails/merge_requests_spec.rb
+++ b/spec/mailers/emails/merge_requests_spec.rb
@@ -1,7 +1,7 @@
 require 'spec_helper'
 require 'email_spec'
 
-describe Notify, "merge request notifications" do
+describe Emails::MergeRequests do
   include EmailSpec::Matchers
 
   describe "#resolved_all_discussions_email" do
diff --git a/spec/mailers/emails/profile_spec.rb b/spec/mailers/emails/profile_spec.rb
index 5ca936f28f0d0603798681c0c222d0a0f193f59b..8c1c9bf135fa58412c0dd4c9b816fbc0ba2ecb55 100644
--- a/spec/mailers/emails/profile_spec.rb
+++ b/spec/mailers/emails/profile_spec.rb
@@ -1,7 +1,7 @@
 require 'spec_helper'
 require 'email_spec'
 
-describe Notify do
+describe Emails::Profile do
   include EmailSpec::Matchers
   include_context 'gitlab email notification'
 
@@ -15,106 +15,104 @@
     end
   end
 
-  describe 'profile notifications' do
-    describe 'for new users, the email' do
-      let(:example_site_path) { root_path }
-      let(:new_user) { create(:user, email: new_user_address, created_by_id: 1) }
-      let(:token) { 'kETLwRaayvigPq_x3SNM' }
+  describe 'for new users, the email' do
+    let(:example_site_path) { root_path }
+    let(:new_user) { create(:user, email: new_user_address, created_by_id: 1) }
+    let(:token) { 'kETLwRaayvigPq_x3SNM' }
 
-      subject { Notify.new_user_email(new_user.id, token) }
+    subject { Notify.new_user_email(new_user.id, token) }
 
-      it_behaves_like 'an email sent from GitLab'
-      it_behaves_like 'a new user email'
-      it_behaves_like 'it should not have Gmail Actions links'
-      it_behaves_like 'a user cannot unsubscribe through footer link'
+    it_behaves_like 'an email sent from GitLab'
+    it_behaves_like 'a new user email'
+    it_behaves_like 'it should not have Gmail Actions links'
+    it_behaves_like 'a user cannot unsubscribe through footer link'
 
-      it 'contains the password text' do
-        is_expected.to have_body_text /Click here to set your password/
-      end
+    it 'contains the password text' do
+      is_expected.to have_body_text /Click here to set your password/
+    end
 
-      it 'includes a link for user to set password' do
-        params = "reset_password_token=#{token}"
-        is_expected.to have_body_text(
-          %r{http://#{Gitlab.config.gitlab.host}(:\d+)?/users/password/edit\?#{params}}
-        )
-      end
+    it 'includes a link for user to set password' do
+      params = "reset_password_token=#{token}"
+      is_expected.to have_body_text(
+        %r{http://#{Gitlab.config.gitlab.host}(:\d+)?/users/password/edit\?#{params}}
+      )
+    end
 
-      it 'explains the reset link expiration' do
-        is_expected.to have_body_text(/This link is valid for \d+ (hours?|days?)/)
-        is_expected.to have_body_text(new_user_password_url)
-        is_expected.to have_body_text(/\?user_email=.*%40.*/)
-      end
+    it 'explains the reset link expiration' do
+      is_expected.to have_body_text(/This link is valid for \d+ (hours?|days?)/)
+      is_expected.to have_body_text(new_user_password_url)
+      is_expected.to have_body_text(/\?user_email=.*%40.*/)
     end
+  end
 
-    describe 'for users that signed up, the email' do
-      let(:example_site_path) { root_path }
-      let(:new_user) { create(:user, email: new_user_address, password: "securePassword") }
+  describe 'for users that signed up, the email' do
+    let(:example_site_path) { root_path }
+    let(:new_user) { create(:user, email: new_user_address, password: "securePassword") }
 
-      subject { Notify.new_user_email(new_user.id) }
+    subject { Notify.new_user_email(new_user.id) }
 
-      it_behaves_like 'an email sent from GitLab'
-      it_behaves_like 'a new user email'
-      it_behaves_like 'it should not have Gmail Actions links'
-      it_behaves_like 'a user cannot unsubscribe through footer link'
+    it_behaves_like 'an email sent from GitLab'
+    it_behaves_like 'a new user email'
+    it_behaves_like 'it should not have Gmail Actions links'
+    it_behaves_like 'a user cannot unsubscribe through footer link'
 
-      it 'does not contain the new user\'s password' do
-        is_expected.not_to have_body_text /password/
-      end
+    it 'does not contain the new user\'s password' do
+      is_expected.not_to have_body_text /password/
     end
+  end
 
-    describe 'user added ssh key' do
-      let(:key) { create(:personal_key) }
+  describe 'user added ssh key' do
+    let(:key) { create(:personal_key) }
 
-      subject { Notify.new_ssh_key_email(key.id) }
+    subject { Notify.new_ssh_key_email(key.id) }
 
-      it_behaves_like 'an email sent from GitLab'
-      it_behaves_like 'it should not have Gmail Actions links'
-      it_behaves_like 'a user cannot unsubscribe through footer link'
+    it_behaves_like 'an email sent from GitLab'
+    it_behaves_like 'it should not have Gmail Actions links'
+    it_behaves_like 'a user cannot unsubscribe through footer link'
 
-      it 'is sent to the new user' do
-        is_expected.to deliver_to key.user.email
-      end
+    it 'is sent to the new user' do
+      is_expected.to deliver_to key.user.email
+    end
 
-      it 'has the correct subject' do
-        is_expected.to have_subject /^SSH key was added to your account$/i
-      end
+    it 'has the correct subject' do
+      is_expected.to have_subject /^SSH key was added to your account$/i
+    end
 
-      it 'contains the new ssh key title' do
-        is_expected.to have_body_text /#{key.title}/
-      end
+    it 'contains the new ssh key title' do
+      is_expected.to have_body_text /#{key.title}/
+    end
 
-      it 'includes a link to ssh keys page' do
-        is_expected.to have_body_text /#{profile_keys_path}/
-      end
+    it 'includes a link to ssh keys page' do
+      is_expected.to have_body_text /#{profile_keys_path}/
+    end
 
-      context 'with SSH key that does not exist' do
-        it { expect { Notify.new_ssh_key_email('foo') }.not_to raise_error }
-      end
+    context 'with SSH key that does not exist' do
+      it { expect { Notify.new_ssh_key_email('foo') }.not_to raise_error }
     end
+  end
 
-    describe 'user added email' do
-      let(:email) { create(:email) }
+  describe 'user added email' do
+    let(:email) { create(:email) }
 
-      subject { Notify.new_email_email(email.id) }
+    subject { Notify.new_email_email(email.id) }
 
-      it_behaves_like 'it should not have Gmail Actions links'
-      it_behaves_like 'a user cannot unsubscribe through footer link'
+    it_behaves_like 'it should not have Gmail Actions links'
+    it_behaves_like 'a user cannot unsubscribe through footer link'
 
-      it 'is sent to the new user' do
-        is_expected.to deliver_to email.user.email
-      end
+    it 'is sent to the new user' do
+      is_expected.to deliver_to email.user.email
+    end
 
-      it 'has the correct subject' do
-        is_expected.to have_subject /^Email was added to your account$/i
-      end
+    it 'has the correct subject' do
+      is_expected.to have_subject /^Email was added to your account$/i
+    end
 
-      it 'contains the new email address' do
-        is_expected.to have_body_text /#{email.email}/
-      end
+    it 'contains the new email address' do
+      is_expected.to have_body_text /#{email.email}/
+    end
 
-      it 'includes a link to emails page' do
-        is_expected.to have_body_text /#{profile_emails_path}/
-      end
+    it 'includes a link to emails page' do
+      is_expected.to have_body_text /#{profile_emails_path}/
     end
   end
 end
diff --git a/spec/migrations/schema_spec.rb b/spec/migrations/active_record/schema_spec.rb
similarity index 100%
rename from spec/migrations/schema_spec.rb
rename to spec/migrations/active_record/schema_spec.rb
diff --git a/spec/models/concerns/awardable_spec.rb b/spec/models/concerns/awardable_spec.rb
index de791abdf3dbc66b26059b37db419a925a61922b..63ad3a3630b228b31a15512d16b5e8f07991d283 100644
--- a/spec/models/concerns/awardable_spec.rb
+++ b/spec/models/concerns/awardable_spec.rb
@@ -1,10 +1,12 @@
 require 'spec_helper'
 
-describe Issue, "Awardable" do
+describe Awardable do
   let!(:issue)        { create(:issue) }
   let!(:award_emoji)  { create(:award_emoji, :downvote, awardable: issue) }
 
   describe "Associations" do
+    subject { build(:issue) }
+
     it { is_expected.to have_many(:award_emoji).dependent(:destroy) }
   end
 
diff --git a/spec/models/concerns/discussion_on_diff_spec.rb b/spec/models/concerns/discussion_on_diff_spec.rb
index 0002a00770f48537f09c4bc13a13253e2d9f62c2..8571e85627ce123e58ce63ffddca627f94d785a5 100644
--- a/spec/models/concerns/discussion_on_diff_spec.rb
+++ b/spec/models/concerns/discussion_on_diff_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe DiffDiscussion, DiscussionOnDiff, model: true do
+describe DiscussionOnDiff, model: true do
   subject { create(:diff_note_on_merge_request).to_discussion }
 
   describe "#truncated_diff_lines" do
@@ -8,9 +8,9 @@
 
     context "when diff is greater than allowed number of truncated diff lines " do
       it "returns fewer lines"  do
-        expect(subject.diff_lines.count).to be > described_class::NUMBER_OF_TRUNCATED_DIFF_LINES
+        expect(subject.diff_lines.count).to be > DiffDiscussion::NUMBER_OF_TRUNCATED_DIFF_LINES
 
-        expect(truncated_lines.count).to be <= described_class::NUMBER_OF_TRUNCATED_DIFF_LINES
+        expect(truncated_lines.count).to be <= DiffDiscussion::NUMBER_OF_TRUNCATED_DIFF_LINES
       end
     end
 
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index 4522206fab15a3077ad3c5d4207b348ff424731c..3ecba2e96870bb14ab47656a7949b5ee606e3ffa 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -1,10 +1,13 @@
 require 'spec_helper'
 
-describe Issue, "Issuable" do
+describe Issuable do
+  let(:issuable_class) { Issue }
   let(:issue) { create(:issue) }
   let(:user) { create(:user) }
 
   describe "Associations" do
+    subject { build(:issue) }
+
     it { is_expected.to belong_to(:project) }
     it { is_expected.to belong_to(:author) }
     it { is_expected.to belong_to(:assignee) }
@@ -23,10 +26,14 @@
   end
 
   describe 'Included modules' do
+    let(:described_class) { issuable_class }
+
     it { is_expected.to include_module(Awardable) }
   end
 
   describe "Validation" do
+    subject { build(:issue) }
+
     before do
       allow(subject).to receive(:set_iid).and_return(false)
     end
@@ -39,9 +46,11 @@
   end
 
   describe "Scope" do
-    it { expect(described_class).to respond_to(:opened) }
-    it { expect(described_class).to respond_to(:closed) }
-    it { expect(described_class).to respond_to(:assigned) }
+    subject { build(:issue) }
+
+    it { expect(issuable_class).to respond_to(:opened) }
+    it { expect(issuable_class).to respond_to(:closed) }
+    it { expect(issuable_class).to respond_to(:assigned) }
   end
 
   describe 'author_name' do
@@ -115,16 +124,16 @@
     let!(:searchable_issue) { create(:issue, title: "Searchable issue") }
 
     it 'returns notes with a matching title' do
-      expect(described_class.search(searchable_issue.title)).
+      expect(issuable_class.search(searchable_issue.title)).
         to eq([searchable_issue])
     end
 
     it 'returns notes with a partially matching title' do
-      expect(described_class.search('able')).to eq([searchable_issue])
+      expect(issuable_class.search('able')).to eq([searchable_issue])
     end
 
     it 'returns notes with a matching title regardless of the casing' do
-      expect(described_class.search(searchable_issue.title.upcase)).
+      expect(issuable_class.search(searchable_issue.title.upcase)).
         to eq([searchable_issue])
     end
   end
@@ -135,31 +144,31 @@
     end
 
     it 'returns notes with a matching title' do
-      expect(described_class.full_search(searchable_issue.title)).
+      expect(issuable_class.full_search(searchable_issue.title)).
         to eq([searchable_issue])
     end
 
     it 'returns notes with a partially matching title' do
-      expect(described_class.full_search('able')).to eq([searchable_issue])
+      expect(issuable_class.full_search('able')).to eq([searchable_issue])
     end
 
     it 'returns notes with a matching title regardless of the casing' do
-      expect(described_class.full_search(searchable_issue.title.upcase)).
+      expect(issuable_class.full_search(searchable_issue.title.upcase)).
         to eq([searchable_issue])
     end
 
     it 'returns notes with a matching description' do
-      expect(described_class.full_search(searchable_issue.description)).
+      expect(issuable_class.full_search(searchable_issue.description)).
         to eq([searchable_issue])
     end
 
     it 'returns notes with a partially matching description' do
-      expect(described_class.full_search(searchable_issue.description)).
+      expect(issuable_class.full_search(searchable_issue.description)).
         to eq([searchable_issue])
     end
 
     it 'returns notes with a matching description regardless of the casing' do
-      expect(described_class.full_search(searchable_issue.description.upcase)).
+      expect(issuable_class.full_search(searchable_issue.description.upcase)).
         to eq([searchable_issue])
     end
   end
diff --git a/spec/models/concerns/noteable_spec.rb b/spec/models/concerns/noteable_spec.rb
index 92cc8859a8cc74b64e75bbb052bf430eceafaa16..bdae742ff1def07b363159efbac8798369d9eb48 100644
--- a/spec/models/concerns/noteable_spec.rb
+++ b/spec/models/concerns/noteable_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe MergeRequest, Noteable, model: true do
+describe Noteable, model: true do
   let!(:active_diff_note1) { create(:diff_note_on_merge_request) }
   let(:project) { active_diff_note1.project }
   subject { active_diff_note1.noteable }
diff --git a/spec/models/concerns/relative_positioning_spec.rb b/spec/models/concerns/relative_positioning_spec.rb
index 255b584a85e78ec4eb039e0c3c21b14c0365384f..494e6f1b6f65631794f3e3ba4331ee458276cac1 100644
--- a/spec/models/concerns/relative_positioning_spec.rb
+++ b/spec/models/concerns/relative_positioning_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Issue, 'RelativePositioning' do
+describe RelativePositioning do
   let(:project) { create(:empty_project) }
   let(:issue) { create(:issue, project: project) }
   let(:issue1) { create(:issue, project: project) }
diff --git a/spec/models/concerns/spammable_spec.rb b/spec/models/concerns/spammable_spec.rb
index fd3b830757148c01bc61563dc075b301d929af0d..e698207166c220289047c8f3ea245a5eb52b503d 100644
--- a/spec/models/concerns/spammable_spec.rb
+++ b/spec/models/concerns/spammable_spec.rb
@@ -1,9 +1,11 @@
 require 'spec_helper'
 
-describe Issue, 'Spammable' do
+describe Spammable do
   let(:issue) { create(:issue, description: 'Test Desc.') }
 
   describe 'Associations' do
+    subject { build(:issue) }
+
     it { is_expected.to have_one(:user_agent_detail).dependent(:destroy) }
   end
 
diff --git a/spec/models/concerns/strip_attribute_spec.rb b/spec/models/concerns/strip_attribute_spec.rb
index c3af7a0960ffb28d42fe2b8e64992efe520c6182..8c945686b6663a95c0202d6490a63c34b08b26a9 100644
--- a/spec/models/concerns/strip_attribute_spec.rb
+++ b/spec/models/concerns/strip_attribute_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Milestone, "StripAttribute" do
+describe StripAttribute do
   let(:milestone) { create(:milestone) }
 
   describe ".strip_attributes" do
diff --git a/spec/models/project_services/pipeline_email_service_spec.rb b/spec/models/project_services/pipelines_email_service_spec.rb
similarity index 100%
rename from spec/models/project_services/pipeline_email_service_spec.rb
rename to spec/models/project_services/pipelines_email_service_spec.rb
diff --git a/spec/policies/issue_policy_spec.rb b/spec/policies/issue_policy_spec.rb
index 2905d5b26a5db0edf382ed0c3873b07d824e803a..9a870b7fda12f3e5a7f794941beeabfa2fc9f521 100644
--- a/spec/policies/issue_policy_spec.rb
+++ b/spec/policies/issue_policy_spec.rb
@@ -1,118 +1,192 @@
 require 'spec_helper'
 
 describe IssuePolicy, models: true do
-  let(:user) { create(:user) }
-
-  describe '#rules' do
-    context 'using a regular issue' do
-      let(:project) { create(:empty_project, :public) }
-      let(:issue) { create(:issue, project: project) }
-      let(:policies) { described_class.abilities(user, issue).to_set }
-
-      context 'with a regular user' do
-        it 'includes the read_issue permission' do
-          expect(policies).to include(:read_issue)
-        end
-
-        it 'does not include the admin_issue permission' do
-          expect(policies).not_to include(:admin_issue)
-        end
-
-        it 'does not include the update_issue permission' do
-          expect(policies).not_to include(:update_issue)
-        end
-      end
+  let(:guest) { create(:user) }
+  let(:author) { create(:user) }
+  let(:assignee) { create(:user) }
+  let(:reporter) { create(:user) }
+  let(:group) { create(:group, :public) }
+  let(:reporter_from_group_link) { create(:user) }
+
+  def permissions(user, issue)
+    described_class.abilities(user, issue).to_set
+  end
+
+  context 'a private project' do
+    let(:non_member) { create(:user) }
+    let(:project) { create(:empty_project, :private) }
+    let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
+    let(:issue_no_assignee) { create(:issue, project: project) }
+
+    before do
+      project.team << [guest, :guest]
+      project.team << [author, :guest]
+      project.team << [assignee, :guest]
+      project.team << [reporter, :reporter]
+
+      group.add_reporter(reporter_from_group_link)
+
+      create(:project_group_link, group: group, project: project)
+    end
+
+    it 'does not allow non-members to read issues' do
+      expect(permissions(non_member, issue)).not_to include(:read_issue, :update_issue, :admin_issue)
+      expect(permissions(non_member, issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
+    end
+
+    it 'allows guests to read issues' do
+      expect(permissions(guest, issue)).to include(:read_issue)
+      expect(permissions(guest, issue)).not_to include(:update_issue, :admin_issue)
+
+      expect(permissions(guest, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(guest, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
+
+    it 'allows reporters to read, update, and admin issues' do
+      expect(permissions(reporter, issue)).to include(:read_issue, :update_issue, :admin_issue)
+      expect(permissions(reporter, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+    end
+
+    it 'allows reporters from group links to read, update, and admin issues' do
+      expect(permissions(reporter_from_group_link, issue)).to include(:read_issue, :update_issue, :admin_issue)
+      expect(permissions(reporter_from_group_link, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+    end
+
+    it 'allows issue authors to read and update their issues' do
+      expect(permissions(author, issue)).to include(:read_issue, :update_issue)
+      expect(permissions(author, issue)).not_to include(:admin_issue)
+
+      expect(permissions(author, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(author, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
+
+    it 'allows issue assignees to read and update their issues' do
+      expect(permissions(assignee, issue)).to include(:read_issue, :update_issue)
+      expect(permissions(assignee, issue)).not_to include(:admin_issue)
+
+      expect(permissions(assignee, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(assignee, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
 
-      context 'with a user that is a project reporter' do
-        before do
-          project.team << [user, :reporter]
-        end
+    context 'with confidential issues' do
+      let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
+      let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
 
-        it 'includes the read_issue permission' do
-          expect(policies).to include(:read_issue)
-        end
+      it 'does not allow non-members to read confidential issues' do
+        expect(permissions(non_member, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(non_member, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
+      end
+
+      it 'does not allow guests to read confidential issues' do
+        expect(permissions(guest, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(guest, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
+      end
 
-        it 'includes the admin_issue permission' do
-          expect(policies).to include(:admin_issue)
-        end
+      it 'allows reporters to read, update, and admin confidential issues' do
+        expect(permissions(reporter, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(reporter, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+      end
 
-        it 'includes the update_issue permission' do
-          expect(policies).to include(:update_issue)
-        end
+      it 'allows reporters from group links to read, update, and admin confidential issues' do
+        expect(permissions(reporter_from_group_link, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
       end
 
-      context 'with a user that is a project guest' do
-        before do
-          project.team << [user, :guest]
-        end
+      it 'allows issue authors to read and update their confidential issues' do
+        expect(permissions(author, confidential_issue)).to include(:read_issue, :update_issue)
+        expect(permissions(author, confidential_issue)).not_to include(:admin_issue)
 
-        it 'includes the read_issue permission' do
-          expect(policies).to include(:read_issue)
-        end
+        expect(permissions(author, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
+      end
 
-        it 'does not include the admin_issue permission' do
-          expect(policies).not_to include(:admin_issue)
-        end
+      it 'allows issue assignees to read and update their confidential issues' do
+        expect(permissions(assignee, confidential_issue)).to include(:read_issue, :update_issue)
+        expect(permissions(assignee, confidential_issue)).not_to include(:admin_issue)
 
-        it 'does not include the update_issue permission' do
-          expect(policies).not_to include(:update_issue)
-        end
+        expect(permissions(assignee, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
       end
     end
+  end
 
-    context 'using a confidential issue' do
-      let(:issue) { create(:issue, :confidential) }
+  context 'a public project' do
+    let(:project) { create(:empty_project, :public) }
+    let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
+    let(:issue_no_assignee) { create(:issue, project: project) }
 
-      context 'with a regular user' do
-        let(:policies) { described_class.abilities(user, issue).to_set }
+    before do
+      project.team << [guest, :guest]
+      project.team << [reporter, :reporter]
 
-        it 'does not include the read_issue permission' do
-          expect(policies).not_to include(:read_issue)
-        end
+      group.add_reporter(reporter_from_group_link)
 
-        it 'does not include the admin_issue permission' do
-          expect(policies).not_to include(:admin_issue)
-        end
+      create(:project_group_link, group: group, project: project)
+    end
 
-        it 'does not include the update_issue permission' do
-          expect(policies).not_to include(:update_issue)
-        end
-      end
+    it 'allows guests to read issues' do
+      expect(permissions(guest, issue)).to include(:read_issue)
+      expect(permissions(guest, issue)).not_to include(:update_issue, :admin_issue)
+
+      expect(permissions(guest, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(guest, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
+
+    it 'allows reporters to read, update, and admin issues' do
+      expect(permissions(reporter, issue)).to include(:read_issue, :update_issue, :admin_issue)
+      expect(permissions(reporter, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+    end
+
+    it 'allows reporters from group links to read, update, and admin issues' do
+      expect(permissions(reporter_from_group_link, issue)).to include(:read_issue, :update_issue, :admin_issue)
+      expect(permissions(reporter_from_group_link, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+    end
 
-      context 'with a user that is a project member' do
-        let(:policies) { described_class.abilities(user, issue).to_set }
+    it 'allows issue authors to read and update their issues' do
+      expect(permissions(author, issue)).to include(:read_issue, :update_issue)
+      expect(permissions(author, issue)).not_to include(:admin_issue)
 
-        before do
-          issue.project.team << [user, :reporter]
-        end
+      expect(permissions(author, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(author, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
+
+    it 'allows issue assignees to read and update their issues' do
+      expect(permissions(assignee, issue)).to include(:read_issue, :update_issue)
+      expect(permissions(assignee, issue)).not_to include(:admin_issue)
 
-        it 'includes the read_issue permission' do
-          expect(policies).to include(:read_issue)
-        end
+      expect(permissions(assignee, issue_no_assignee)).to include(:read_issue)
+      expect(permissions(assignee, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
+    end
 
-        it 'includes the admin_issue permission' do
-          expect(policies).to include(:admin_issue)
-        end
+    context 'with confidential issues' do
+      let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
+      let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
 
-        it 'includes the update_issue permission' do
-          expect(policies).to include(:update_issue)
-        end
+      it 'does not allow guests to read confidential issues' do
+        expect(permissions(guest, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(guest, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
       end
 
-      context 'without a user' do
-        let(:policies) { described_class.abilities(nil, issue).to_set }
+      it 'allows reporters to read, update, and admin confidential issues' do
+        expect(permissions(reporter, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(reporter, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+      end
+
+      it 'allows reporter from group links to read, update, and admin confidential issues' do
+        expect(permissions(reporter_from_group_link, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
+        expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
+      end
 
-        it 'does not include the read_issue permission' do
-          expect(policies).not_to include(:read_issue)
-        end
+      it 'allows issue authors to read and update their confidential issues' do
+        expect(permissions(author, confidential_issue)).to include(:read_issue, :update_issue)
+        expect(permissions(author, confidential_issue)).not_to include(:admin_issue)
+
+        expect(permissions(author, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
+      end
 
-        it 'does not include the admin_issue permission' do
-          expect(policies).not_to include(:admin_issue)
-        end
+      it 'allows issue assignees to read and update their confidential issues' do
+        expect(permissions(assignee, confidential_issue)).to include(:read_issue, :update_issue)
+        expect(permissions(assignee, confidential_issue)).not_to include(:admin_issue)
 
-        it 'does not include the update_issue permission' do
-          expect(policies).not_to include(:update_issue)
-        end
+        expect(permissions(assignee, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
       end
     end
   end
diff --git a/spec/policies/issues_policy_spec.rb b/spec/policies/issues_policy_spec.rb
deleted file mode 100644
index 2b7b6cad6547c70d0cdef934679debfc9470de72..0000000000000000000000000000000000000000
--- a/spec/policies/issues_policy_spec.rb
+++ /dev/null
@@ -1,193 +0,0 @@
-require 'spec_helper'
-
-describe IssuePolicy, models: true do
-  let(:guest) { create(:user) }
-  let(:author) { create(:user) }
-  let(:assignee) { create(:user) }
-  let(:reporter) { create(:user) }
-  let(:group) { create(:group, :public) }
-  let(:reporter_from_group_link) { create(:user) }
-
-  def permissions(user, issue)
-    IssuePolicy.abilities(user, issue).to_set
-  end
-
-  context 'a private project' do
-    let(:non_member) { create(:user) }
-    let(:project) { create(:empty_project, :private) }
-    let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
-    let(:issue_no_assignee) { create(:issue, project: project) }
-
-    before do
-      project.team << [guest, :guest]
-      project.team << [author, :guest]
-      project.team << [assignee, :guest]
-      project.team << [reporter, :reporter]
-
-      group.add_reporter(reporter_from_group_link)
-
-      create(:project_group_link, group: group, project: project)
-    end
-
-    it 'does not allow non-members to read issues' do
-      expect(permissions(non_member, issue)).not_to include(:read_issue, :update_issue, :admin_issue)
-      expect(permissions(non_member, issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-    end
-
-    it 'allows guests to read issues' do
-      expect(permissions(guest, issue)).to include(:read_issue)
-      expect(permissions(guest, issue)).not_to include(:update_issue, :admin_issue)
-
-      expect(permissions(guest, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(guest, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    it 'allows reporters to read, update, and admin issues' do
-      expect(permissions(reporter, issue)).to include(:read_issue, :update_issue, :admin_issue)
-      expect(permissions(reporter, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-    end
-
-    it 'allows reporters from group links to read, update, and admin issues' do
-      expect(permissions(reporter_from_group_link, issue)).to include(:read_issue, :update_issue, :admin_issue)
-      expect(permissions(reporter_from_group_link, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-    end
-
-    it 'allows issue authors to read and update their issues' do
-      expect(permissions(author, issue)).to include(:read_issue, :update_issue)
-      expect(permissions(author, issue)).not_to include(:admin_issue)
-
-      expect(permissions(author, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(author, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    it 'allows issue assignees to read and update their issues' do
-      expect(permissions(assignee, issue)).to include(:read_issue, :update_issue)
-      expect(permissions(assignee, issue)).not_to include(:admin_issue)
-
-      expect(permissions(assignee, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(assignee, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    context 'with confidential issues' do
-      let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
-      let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
-
-      it 'does not allow non-members to read confidential issues' do
-        expect(permissions(non_member, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(non_member, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'does not allow guests to read confidential issues' do
-        expect(permissions(guest, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(guest, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows reporters to read, update, and admin confidential issues' do
-        expect(permissions(reporter, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(reporter, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows reporters from group links to read, update, and admin confidential issues' do
-        expect(permissions(reporter_from_group_link, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows issue authors to read and update their confidential issues' do
-        expect(permissions(author, confidential_issue)).to include(:read_issue, :update_issue)
-        expect(permissions(author, confidential_issue)).not_to include(:admin_issue)
-
-        expect(permissions(author, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows issue assignees to read and update their confidential issues' do
-        expect(permissions(assignee, confidential_issue)).to include(:read_issue, :update_issue)
-        expect(permissions(assignee, confidential_issue)).not_to include(:admin_issue)
-
-        expect(permissions(assignee, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-    end
-  end
-
-  context 'a public project' do
-    let(:project) { create(:empty_project, :public) }
-    let(:issue) { create(:issue, project: project, assignee: assignee, author: author) }
-    let(:issue_no_assignee) { create(:issue, project: project) }
-
-    before do
-      project.team << [guest, :guest]
-      project.team << [reporter, :reporter]
-
-      group.add_reporter(reporter_from_group_link)
-
-      create(:project_group_link, group: group, project: project)
-    end
-
-    it 'allows guests to read issues' do
-      expect(permissions(guest, issue)).to include(:read_issue)
-      expect(permissions(guest, issue)).not_to include(:update_issue, :admin_issue)
-
-      expect(permissions(guest, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(guest, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    it 'allows reporters to read, update, and admin issues' do
-      expect(permissions(reporter, issue)).to include(:read_issue, :update_issue, :admin_issue)
-      expect(permissions(reporter, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-    end
-
-    it 'allows reporters from group links to read, update, and admin issues' do
-      expect(permissions(reporter_from_group_link, issue)).to include(:read_issue, :update_issue, :admin_issue)
-      expect(permissions(reporter_from_group_link, issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-    end
-
-    it 'allows issue authors to read and update their issues' do
-      expect(permissions(author, issue)).to include(:read_issue, :update_issue)
-      expect(permissions(author, issue)).not_to include(:admin_issue)
-
-      expect(permissions(author, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(author, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    it 'allows issue assignees to read and update their issues' do
-      expect(permissions(assignee, issue)).to include(:read_issue, :update_issue)
-      expect(permissions(assignee, issue)).not_to include(:admin_issue)
-
-      expect(permissions(assignee, issue_no_assignee)).to include(:read_issue)
-      expect(permissions(assignee, issue_no_assignee)).not_to include(:update_issue, :admin_issue)
-    end
-
-    context 'with confidential issues' do
-      let(:confidential_issue) { create(:issue, :confidential, project: project, assignee: assignee, author: author) }
-      let(:confidential_issue_no_assignee) { create(:issue, :confidential, project: project) }
-
-      it 'does not allow guests to read confidential issues' do
-        expect(permissions(guest, confidential_issue)).not_to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(guest, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows reporters to read, update, and admin confidential issues' do
-        expect(permissions(reporter, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(reporter, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows reporter from group links to read, update, and admin confidential issues' do
-        expect(permissions(reporter_from_group_link, confidential_issue)).to include(:read_issue, :update_issue, :admin_issue)
-        expect(permissions(reporter_from_group_link, confidential_issue_no_assignee)).to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows issue authors to read and update their confidential issues' do
-        expect(permissions(author, confidential_issue)).to include(:read_issue, :update_issue)
-        expect(permissions(author, confidential_issue)).not_to include(:admin_issue)
-
-        expect(permissions(author, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-
-      it 'allows issue assignees to read and update their confidential issues' do
-        expect(permissions(assignee, confidential_issue)).to include(:read_issue, :update_issue)
-        expect(permissions(assignee, confidential_issue)).not_to include(:admin_issue)
-
-        expect(permissions(assignee, confidential_issue_no_assignee)).not_to include(:read_issue, :update_issue, :admin_issue)
-      end
-    end
-  end
-end
diff --git a/spec/requests/api/doorkeeper_access_spec.rb b/spec/requests/api/doorkeeper_access_spec.rb
index b5897b2e34618aee00d6589aaa7583c64677c8e5..868fef65c1ca2b1a1387426e6f80fb85bd2eca47 100644
--- a/spec/requests/api/doorkeeper_access_spec.rb
+++ b/spec/requests/api/doorkeeper_access_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe API::API do
+describe 'doorkeeper access' do
   let!(:user) { create(:user) }
   let!(:application) { Doorkeeper::Application.create!(name: "MyApp", redirect_uri: "https://app.com", owner: user) }
   let!(:token) { Doorkeeper::AccessToken.create! application_id: application.id, resource_owner_id: user.id, scopes: "api" }
diff --git a/spec/requests/api/api_internal_helpers_spec.rb b/spec/requests/api/helpers/internal_helpers_spec.rb
similarity index 100%
rename from spec/requests/api/api_internal_helpers_spec.rb
rename to spec/requests/api/helpers/internal_helpers_spec.rb
diff --git a/spec/requests/api/oauth_tokens_spec.rb b/spec/requests/api/oauth_tokens_spec.rb
index 819df1059600158e23714e6d48bc71d8f8f34ace..0d56e1f732ed6f9bdd7bf8c96d6695eac02d4c16 100644
--- a/spec/requests/api/oauth_tokens_spec.rb
+++ b/spec/requests/api/oauth_tokens_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe API::API do
+describe 'OAuth tokens' do
   context 'Resource Owner Password Credentials' do
     def request_oauth_token(user)
       post '/oauth/token', username: user.username, password: user.password, grant_type: 'password'
diff --git a/spec/routing/environments_spec.rb b/spec/routing/environments_spec.rb
index ba124de70bb195fcbdee6b9974d778c1e7732b0e..624f3c43f0a8cf9ba5a9b348aa1b2a7e2e198f58 100644
--- a/spec/routing/environments_spec.rb
+++ b/spec/routing/environments_spec.rb
@@ -1,6 +1,6 @@
 require 'spec_helper'
 
-describe Projects::EnvironmentsController, :routing do
+describe 'environments routing', :routing do
   let(:project) { create(:empty_project) }
 
   let(:environment) do
diff --git a/spec/routing/notifications_routing_spec.rb b/spec/routing/notifications_routing_spec.rb
index 24592942a967e77b20d38dc6391550af2890239d..54ed87b5520b1c58159d336c5d7c6267c06ff866 100644
--- a/spec/routing/notifications_routing_spec.rb
+++ b/spec/routing/notifications_routing_spec.rb
@@ -1,13 +1,11 @@
 require "spec_helper"
 
-describe Profiles::NotificationsController do
-  describe "routing" do
-    it "routes to #show" do
-      expect(get("/profile/notifications")).to route_to("profiles/notifications#show")
-    end
+describe "notifications routing" do
+  it "routes to #show" do
+    expect(get("/profile/notifications")).to route_to("profiles/notifications#show")
+  end
 
-    it "routes to #update" do
-      expect(put("/profile/notifications")).to route_to("profiles/notifications#update")
-    end
+  it "routes to #update" do
+    expect(put("/profile/notifications")).to route_to("profiles/notifications#update")
   end
 end
diff --git a/spec/serializers/analytics_generic_entity_spec.rb b/spec/serializers/analytics_issue_entity_spec.rb
similarity index 100%
rename from spec/serializers/analytics_generic_entity_spec.rb
rename to spec/serializers/analytics_issue_entity_spec.rb
diff --git a/spec/services/issues/resolve_discussions_spec.rb b/spec/services/issues/resolve_discussions_spec.rb
index 4a4929daefc9638b219d21d3c08e5b12ffa32257..c3b4c2176eeba2934fe7f94018ae328100051eee 100644
--- a/spec/services/issues/resolve_discussions_spec.rb
+++ b/spec/services/issues/resolve_discussions_spec.rb
@@ -1,15 +1,15 @@
 require 'spec_helper.rb'
 
-class DummyService < Issues::BaseService
-  include ::Issues::ResolveDiscussions
+describe Issues::ResolveDiscussions, services: true do
+  class DummyService < Issues::BaseService
+    include ::Issues::ResolveDiscussions
 
-  def initialize(*args)
-    super
-    filter_resolve_discussion_params
+    def initialize(*args)
+      super
+      filter_resolve_discussion_params
+    end
   end
-end
 
-describe DummyService, services: true do
   let(:project) { create(:project, :repository) }
   let(:user) { create(:user) }
 
@@ -23,7 +23,7 @@ def initialize(*args)
     let(:other_merge_request) { create(:merge_request, source_project: project, source_branch: "other") }
 
     describe "#merge_request_for_resolving_discussion" do
-      let(:service) { described_class.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid) }
+      let(:service) { DummyService.new(project, user, merge_request_to_resolve_discussions_of: merge_request.iid) }
 
       it "finds the merge request" do
         expect(service.merge_request_to_resolve_discussions_of).to eq(merge_request)
@@ -43,7 +43,7 @@ def initialize(*args)
 
     describe "#discussions_to_resolve" do
       it "contains a single discussion when matching merge request and discussion are passed" do
-        service = described_class.new(
+        service = DummyService.new(
           project,
           user,
           discussion_to_resolve: discussion.id,
@@ -61,7 +61,7 @@ def initialize(*args)
                                                   noteable: merge_request,
                                                   project: merge_request.target_project,
                                                   line_number: 15)])
-        service = described_class.new(
+        service = DummyService.new(
           project,
           user,
           merge_request_to_resolve_discussions_of: merge_request.iid
@@ -79,7 +79,7 @@ def initialize(*args)
                                                    project: merge_request.target_project,
                                                    line_number: 15,
                                                    )])
-        service = described_class.new(
+        service = DummyService.new(
           project,
           user,
           merge_request_to_resolve_discussions_of: merge_request.iid
@@ -92,7 +92,7 @@ def initialize(*args)
       end
 
       it "is empty when a discussion and another merge request are passed" do
-        service = described_class.new(
+        service = DummyService.new(
           project,
           user,
           discussion_to_resolve: discussion.id,
diff --git a/spec/services/merge_requests/resolved_discussion_notification_service.rb b/spec/services/merge_requests/resolved_discussion_notification_service_spec.rb
similarity index 100%
rename from spec/services/merge_requests/resolved_discussion_notification_service.rb
rename to spec/services/merge_requests/resolved_discussion_notification_service_spec.rb
diff --git a/spec/workers/pipeline_proccess_worker_spec.rb b/spec/workers/pipeline_process_worker_spec.rb
similarity index 100%
rename from spec/workers/pipeline_proccess_worker_spec.rb
rename to spec/workers/pipeline_process_worker_spec.rb