From bc0094795565bc9f7399b7900d77950d7082f1dc Mon Sep 17 00:00:00 2001
From: Peter Leitzen <pleitzen@gitlab.com>
Date: Tue, 16 Jul 2019 08:03:17 +0000
Subject: [PATCH] Cleanup usages of `JSON.parse` in specs

Prefer `json_response` where applicable.
---
 .../boards/issues_controller_spec.rb          |  8 ++---
 .../boards/lists_controller_spec.rb           |  4 +--
 .../boards/milestones_controller_spec.rb      |  6 ++--
 .../boards/users_controller_spec.rb           |  6 ++--
 .../groups/boards_controller_spec.rb          |  4 +--
 .../groups/epic_issues_controller_spec.rb     |  2 +-
 .../groups/epics/notes_controller_spec.rb     |  2 +-
 .../groups/epics_controller_spec.rb           |  4 +--
 .../issues_analytics_controller_spec.rb       |  4 +--
 .../controllers/operations_controller_spec.rb |  1 -
 .../projects/boards_controller_spec.rb        |  4 +--
 .../managed_licenses_controller_spec.rb       |  2 +-
 .../merge_requests_controller_spec.rb         |  4 ---
 .../projects/service_desk_controller_spec.rb  | 12 +++-----
 ee/spec/requests/api/epic_links_spec.rb       |  2 +-
 ee/spec/requests/api/epics_spec.rb            |  4 +--
 .../requests/api/project_approvals_spec.rb    |  2 +-
 .../application_settings_controller_spec.rb   |  2 +-
 .../application_controller_spec.rb            |  2 --
 .../boards/issues_controller_spec.rb          |  8 ++---
 .../boards/lists_controller_spec.rb           |  4 +--
 .../groups/boards_controller_spec.rb          |  4 +--
 .../groups/milestones_controller_spec.rb      |  2 +-
 .../health_check_controller_spec.rb           |  1 -
 spec/controllers/health_controller_spec.rb    |  1 -
 spec/controllers/metrics_controller_spec.rb   |  1 -
 .../projects/blob_controller_spec.rb          |  4 +--
 .../projects/boards_controller_spec.rb        |  4 +--
 .../projects/branches_controller_spec.rb      |  9 ++----
 .../projects/commit_controller_spec.rb        |  4 +--
 .../projects/compare_controller_spec.rb       |  9 ++----
 .../projects/deploy_keys_controller_spec.rb   | 10 +++----
 .../projects/discussions_controller_spec.rb   |  4 +--
 .../projects/find_file_controller_spec.rb     |  5 ++--
 .../projects/issues_controller_spec.rb        | 20 +++++--------
 .../merge_requests/diffs_controller_spec.rb   |  2 +-
 .../merge_requests_controller_spec.rb         |  4 +--
 .../projects/notes_controller_spec.rb         |  4 +--
 .../projects/templates_controller_spec.rb     |  9 +++---
 .../projects/wikis_controller_spec.rb         |  2 +-
 spec/controllers/projects_controller_spec.rb  | 29 +++++++------------
 .../snippets/notes_controller_spec.rb         |  6 ++--
 spec/controllers/snippets_controller_spec.rb  |  2 +-
 spec/controllers/users_controller_spec.rb     |  2 +-
 spec/requests/api/search_spec.rb              |  4 +--
 spec/requests/lfs_http_spec.rb                |  4 ---
 spec/requests/lfs_locks_api_spec.rb           |  4 ---
 spec/support/json_response.rb                 |  2 +-
 .../issuable_notes_filter_shared_examples.rb  |  4 +--
 .../update_invalid_issuable.rb                |  2 +-
 50 files changed, 87 insertions(+), 158 deletions(-)

diff --git a/ee/spec/controllers/boards/issues_controller_spec.rb b/ee/spec/controllers/boards/issues_controller_spec.rb
index 7f4d9db93c74..312dea93c267 100644
--- a/ee/spec/controllers/boards/issues_controller_spec.rb
+++ b/ee/spec/controllers/boards/issues_controller_spec.rb
@@ -43,10 +43,8 @@
 
           list_issues user: user, board: board, list: list2
 
-          parsed_response = JSON.parse(response.body)
-
           expect(response).to match_response_schema('issues')
-          expect(parsed_response['issues'].length).to eq 2
+          expect(json_response['issues'].length).to eq 2
           expect(development.issues.map(&:relative_position)).not_to include(nil)
         end
       end
@@ -70,10 +68,8 @@
 
         list_issues user: user, board: board
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to match_response_schema('issues')
-        expect(parsed_response['issues'].length).to eq 2
+        expect(json_response['issues'].length).to eq 2
       end
     end
 
diff --git a/ee/spec/controllers/boards/lists_controller_spec.rb b/ee/spec/controllers/boards/lists_controller_spec.rb
index 7185782c8a04..fb64d2474102 100644
--- a/ee/spec/controllers/boards/lists_controller_spec.rb
+++ b/ee/spec/controllers/boards/lists_controller_spec.rb
@@ -24,10 +24,8 @@
 
       read_board_list user: user, board: board
 
-      parsed_response = JSON.parse(response.body)
-
       expect(response).to match_response_schema('lists', dir: 'ee')
-      expect(parsed_response.length).to eq 3
+      expect(json_response.length).to eq 3
     end
 
     context 'with unauthorized user' do
diff --git a/ee/spec/controllers/boards/milestones_controller_spec.rb b/ee/spec/controllers/boards/milestones_controller_spec.rb
index 6f0b1f855a0f..38d3383f21af 100644
--- a/ee/spec/controllers/boards/milestones_controller_spec.rb
+++ b/ee/spec/controllers/boards/milestones_controller_spec.rb
@@ -20,11 +20,9 @@
 
           expect(response).to have_gitlab_http_status(200)
 
-          parsed_response = JSON.parse(response.body)
-
           expect(response.content_type).to eq('application/json')
-          expect(parsed_response).to all(match_schema('entities/milestone', dir: 'ee'))
-          expect(parsed_response.size).to eq(1)
+          expect(json_response).to all(match_schema('entities/milestone', dir: 'ee'))
+          expect(json_response.size).to eq(1)
         end
       end
 
diff --git a/ee/spec/controllers/boards/users_controller_spec.rb b/ee/spec/controllers/boards/users_controller_spec.rb
index cd909fdd239b..14006c67e073 100644
--- a/ee/spec/controllers/boards/users_controller_spec.rb
+++ b/ee/spec/controllers/boards/users_controller_spec.rb
@@ -22,12 +22,10 @@
                     },
                     format: :json
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to have_gitlab_http_status(200)
         expect(response.content_type).to eq 'application/json'
-        expect(parsed_response).to all(match_schema('entities/user'))
-        expect(parsed_response.length).to eq 2
+        expect(json_response).to all(match_schema('entities/user'))
+        expect(json_response.length).to eq 2
       end
     end
 
diff --git a/ee/spec/controllers/groups/boards_controller_spec.rb b/ee/spec/controllers/groups/boards_controller_spec.rb
index 5fc13ea8242e..c0a7c6b309c4 100644
--- a/ee/spec/controllers/groups/boards_controller_spec.rb
+++ b/ee/spec/controllers/groups/boards_controller_spec.rb
@@ -23,10 +23,8 @@
 
         list_boards format: :json
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to match_response_schema('boards')
-        expect(parsed_response.length).to eq 2
+        expect(json_response.length).to eq 2
       end
 
       context 'with unauthorized user' do
diff --git a/ee/spec/controllers/groups/epic_issues_controller_spec.rb b/ee/spec/controllers/groups/epic_issues_controller_spec.rb
index 89d6ab87f167..a65ff2ed951f 100644
--- a/ee/spec/controllers/groups/epic_issues_controller_spec.rb
+++ b/ee/spec/controllers/groups/epic_issues_controller_spec.rb
@@ -47,7 +47,7 @@
         end
 
         it 'returns the correct json' do
-          expect(JSON.parse(response.body)).to match_schema('related_issues', dir: 'ee')
+          expect(json_response).to match_schema('related_issues', dir: 'ee')
         end
       end
 
diff --git a/ee/spec/controllers/groups/epics/notes_controller_spec.rb b/ee/spec/controllers/groups/epics/notes_controller_spec.rb
index b402282af27d..f60e69095a58 100644
--- a/ee/spec/controllers/groups/epics/notes_controller_spec.rb
+++ b/ee/spec/controllers/groups/epics/notes_controller_spec.rb
@@ -5,7 +5,7 @@
   let(:group) { create(:group) }
   let(:epic) { create(:epic, group: group) }
   let(:note) { create(:note, noteable: epic) }
-  let(:parsed_response) { JSON.parse(response.body).with_indifferent_access }
+  let(:parsed_response) { json_response.with_indifferent_access }
 
   before do
     stub_licensed_features(epics: true)
diff --git a/ee/spec/controllers/groups/epics_controller_spec.rb b/ee/spec/controllers/groups/epics_controller_spec.rb
index e7d8524e0373..15fbb488bd96 100644
--- a/ee/spec/controllers/groups/epics_controller_spec.rb
+++ b/ee/spec/controllers/groups/epics_controller_spec.rb
@@ -375,7 +375,7 @@ def update_epic(epic, params)
         subject
 
         expect(response.content_type).to eq 'application/json'
-        expect(JSON.parse(response.body)).to include('title_text', 'title', 'description', 'description_text')
+        expect(json_response).to include('title_text', 'title', 'description', 'description_text')
       end
 
       context 'with unauthorized user' do
@@ -421,7 +421,7 @@ def update_epic(epic, params)
           it 'returns the correct json' do
             subject
 
-            expect(JSON.parse(response.body)).to eq({ 'web_url' => group_epic_path(group, Epic.last) })
+            expect(json_response).to eq({ 'web_url' => group_epic_path(group, Epic.last) })
           end
 
           it_behaves_like 'disabled when using an external authorization service'
diff --git a/ee/spec/controllers/groups/issues_analytics_controller_spec.rb b/ee/spec/controllers/groups/issues_analytics_controller_spec.rb
index deab548700cd..fb5457a13e89 100644
--- a/ee/spec/controllers/groups/issues_analytics_controller_spec.rb
+++ b/ee/spec/controllers/groups/issues_analytics_controller_spec.rb
@@ -58,7 +58,7 @@
 
           get :show, params: { group_id: group.to_param }, format: :json
 
-          expect(JSON.parse(response.body)).to include(expected_result)
+          expect(json_response).to include(expected_result)
         end
 
         context 'when user cannot view issues' do
@@ -74,7 +74,7 @@
 
             get :show, params: { group_id: group.to_param }, format: :json
 
-            expect(JSON.parse(response.body)).to include(expected_result)
+            expect(json_response).to include(expected_result)
           end
         end
       end
diff --git a/ee/spec/controllers/operations_controller_spec.rb b/ee/spec/controllers/operations_controller_spec.rb
index 696ba1881718..ef01f8b00512 100644
--- a/ee/spec/controllers/operations_controller_spec.rb
+++ b/ee/spec/controllers/operations_controller_spec.rb
@@ -6,7 +6,6 @@
   include Rails.application.routes.url_helpers
 
   let(:user) { create(:user) }
-  let(:json_response) { JSON.parse(response.body) }
 
   shared_examples 'unlicensed' do |http_method, action|
     before do
diff --git a/ee/spec/controllers/projects/boards_controller_spec.rb b/ee/spec/controllers/projects/boards_controller_spec.rb
index 0514917e758f..e47b38fcb6c1 100644
--- a/ee/spec/controllers/projects/boards_controller_spec.rb
+++ b/ee/spec/controllers/projects/boards_controller_spec.rb
@@ -18,10 +18,8 @@
 
       list_boards
 
-      parsed_response = JSON.parse(response.body)
-
       expect(response).to match_response_schema('boards')
-      expect(parsed_response.length).to eq 2
+      expect(json_response.length).to eq 2
     end
 
     it_behaves_like 'redirects to last visited board'
diff --git a/ee/spec/controllers/projects/managed_licenses_controller_spec.rb b/ee/spec/controllers/projects/managed_licenses_controller_spec.rb
index b0963d0fab94..07af86e81349 100644
--- a/ee/spec/controllers/projects/managed_licenses_controller_spec.rb
+++ b/ee/spec/controllers/projects/managed_licenses_controller_spec.rb
@@ -396,7 +396,7 @@
           subject
 
           expect(response).to match_response_schema('software_license_policy', dir: 'ee')
-          expect(JSON.parse(response.body)).to eq(modified_software_license_policy_attributes.with_indifferent_access)
+          expect(json_response).to eq(modified_software_license_policy_attributes.with_indifferent_access)
         end
       end
     end
diff --git a/ee/spec/controllers/projects/merge_requests_controller_spec.rb b/ee/spec/controllers/projects/merge_requests_controller_spec.rb
index b3f1f455543e..6ac6f5ee7fbe 100644
--- a/ee/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/ee/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -1,10 +1,6 @@
 require 'spec_helper'
 
 shared_examples 'approvals' do
-  def json_response
-    JSON.parse(response.body)
-  end
-
   let!(:approver) { create(:user) }
   let!(:approval_rule) { create(:approval_project_rule, project: project, users: [approver, user], approvals_required: 2) }
 
diff --git a/ee/spec/controllers/projects/service_desk_controller_spec.rb b/ee/spec/controllers/projects/service_desk_controller_spec.rb
index fe7e2afc1303..8fb903a1a1d1 100644
--- a/ee/spec/controllers/projects/service_desk_controller_spec.rb
+++ b/ee/spec/controllers/projects/service_desk_controller_spec.rb
@@ -18,10 +18,8 @@
     it 'returns service_desk JSON data' do
       get :show, params: { namespace_id: project.namespace.to_param, project_id: project }, format: :json
 
-      body = JSON.parse(response.body)
-
-      expect(body["service_desk_address"]).to match(/\A[^@]+@[^@]+\z/)
-      expect(body["service_desk_enabled"]).to be_truthy
+      expect(json_response["service_desk_address"]).to match(/\A[^@]+@[^@]+\z/)
+      expect(json_response["service_desk_enabled"]).to be_truthy
       expect(response.status).to eq(200)
     end
 
@@ -45,10 +43,8 @@
 
       put :update, params: { namespace_id: project.namespace.to_param, project_id: project, service_desk_enabled: true }, format: :json
 
-      body = JSON.parse(response.body)
-
-      expect(body["service_desk_address"]).to be_present
-      expect(body["service_desk_enabled"]).to be_truthy
+      expect(json_response["service_desk_address"]).to be_present
+      expect(json_response["service_desk_enabled"]).to be_truthy
       expect(response.status).to eq(200)
     end
 
diff --git a/ee/spec/requests/api/epic_links_spec.rb b/ee/spec/requests/api/epic_links_spec.rb
index 552cec2d3afb..1bd804c40e7f 100644
--- a/ee/spec/requests/api/epic_links_spec.rb
+++ b/ee/spec/requests/api/epic_links_spec.rb
@@ -53,7 +53,7 @@
       it 'returns 200 status' do
         subject
 
-        epics = JSON.parse(response.body)
+        epics = json_response
 
         expect(response).to have_gitlab_http_status(200)
         expect(response).to match_response_schema('public_api/v4/epics', dir: 'ee')
diff --git a/ee/spec/requests/api/epics_spec.rb b/ee/spec/requests/api/epics_spec.rb
index f1de9f3d5bb1..fda2d658894d 100644
--- a/ee/spec/requests/api/epics_spec.rb
+++ b/ee/spec/requests/api/epics_spec.rb
@@ -44,7 +44,7 @@
       it 'returns epic with extra date fields' do
         get api(url, user), params: params
 
-        expect(Array.wrap(JSON.parse(response.body))).to all(exclude(*extra_date_fields))
+        expect(Array.wrap(json_response)).to all(exclude(*extra_date_fields))
       end
     end
 
@@ -56,7 +56,7 @@
       it 'returns epic with extra date fields' do
         get api(url, user), params: params
 
-        expect(Array.wrap(JSON.parse(response.body))).to all(include(*extra_date_fields))
+        expect(Array.wrap(json_response)).to all(include(*extra_date_fields))
       end
     end
   end
diff --git a/ee/spec/requests/api/project_approvals_spec.rb b/ee/spec/requests/api/project_approvals_spec.rb
index 405cf11e49e7..584f6faff495 100644
--- a/ee/spec/requests/api/project_approvals_spec.rb
+++ b/ee/spec/requests/api/project_approvals_spec.rb
@@ -77,7 +77,7 @@
 
           post api(url, current_user), params: settings
 
-          expect(JSON.parse(response.body).symbolize_keys).to include(settings)
+          expect(json_response.symbolize_keys).to include(settings)
         end
 
         it 'only shows approver groups that are visible to the current user' do
diff --git a/spec/controllers/admin/application_settings_controller_spec.rb b/spec/controllers/admin/application_settings_controller_spec.rb
index 5ad5f9cdeea8..4eb0545eb6c4 100644
--- a/spec/controllers/admin/application_settings_controller_spec.rb
+++ b/spec/controllers/admin/application_settings_controller_spec.rb
@@ -41,7 +41,7 @@
     it 'returns JSON data' do
       get :usage_data, format: :json
 
-      body = JSON.parse(response.body)
+      body = json_response
       expect(body["version"]).to eq(Gitlab::VERSION)
       expect(body).to include('counts')
       expect(response.status).to eq(200)
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index 447a12b2facf..84bbbac39b0b 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -63,8 +63,6 @@
       sign_in user
     end
 
-    let(:json_response) { JSON.parse(response.body) }
-
     controller(described_class) do
       def index
         render json: Gon.all_variables
diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb
index 6cad060d8885..246d6f9e0f99 100644
--- a/spec/controllers/boards/issues_controller_spec.rb
+++ b/spec/controllers/boards/issues_controller_spec.rb
@@ -52,10 +52,8 @@
 
           list_issues user: user, board: board, list: list2
 
-          parsed_response = JSON.parse(response.body)
-
           expect(response).to match_response_schema('entities/issue_boards')
-          expect(parsed_response['issues'].length).to eq 2
+          expect(json_response['issues'].length).to eq 2
           expect(development.issues.map(&:relative_position)).not_to include(nil)
         end
 
@@ -123,10 +121,8 @@
 
         list_issues user: user, board: board
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to match_response_schema('entities/issue_boards')
-        expect(parsed_response['issues'].length).to eq 2
+        expect(json_response['issues'].length).to eq 2
       end
     end
 
diff --git a/spec/controllers/boards/lists_controller_spec.rb b/spec/controllers/boards/lists_controller_spec.rb
index e1f75fa33956..418ca6f32100 100644
--- a/spec/controllers/boards/lists_controller_spec.rb
+++ b/spec/controllers/boards/lists_controller_spec.rb
@@ -26,10 +26,8 @@
 
       read_board_list user: user, board: board
 
-      parsed_response = JSON.parse(response.body)
-
       expect(response).to match_response_schema('lists')
-      expect(parsed_response.length).to eq 3
+      expect(json_response.length).to eq 3
     end
 
     context 'with unauthorized user' do
diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb
index 5e0f64ccca40..e4232c2c1abc 100644
--- a/spec/controllers/groups/boards_controller_spec.rb
+++ b/spec/controllers/groups/boards_controller_spec.rb
@@ -63,10 +63,8 @@
 
         list_boards format: :json
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to match_response_schema('boards')
-        expect(parsed_response.length).to eq 1
+        expect(json_response.length).to eq 1
       end
 
       context 'with unauthorized user' do
diff --git a/spec/controllers/groups/milestones_controller_spec.rb b/spec/controllers/groups/milestones_controller_spec.rb
index 19b18091aef0..bf164aeed38d 100644
--- a/spec/controllers/groups/milestones_controller_spec.rb
+++ b/spec/controllers/groups/milestones_controller_spec.rb
@@ -73,7 +73,7 @@
       it 'lists legacy group milestones and group milestones' do
         get :index, params: { group_id: group.to_param }, format: :json
 
-        milestones = JSON.parse(response.body)
+        milestones = json_response
 
         expect(milestones.count).to eq(2)
         expect(milestones.first["title"]).to eq("group milestone")
diff --git a/spec/controllers/health_check_controller_spec.rb b/spec/controllers/health_check_controller_spec.rb
index 19d739fcf4fc..92f005faf4a3 100644
--- a/spec/controllers/health_check_controller_spec.rb
+++ b/spec/controllers/health_check_controller_spec.rb
@@ -5,7 +5,6 @@
 describe HealthCheckController do
   include StubENV
 
-  let(:json_response) { JSON.parse(response.body) }
   let(:xml_response) { Hash.from_xml(response.body)['hash'] }
   let(:token) { Gitlab::CurrentSettings.health_check_access_token }
   let(:whitelisted_ip) { '127.0.0.1' }
diff --git a/spec/controllers/health_controller_spec.rb b/spec/controllers/health_controller_spec.rb
index fc62a8310aab..e82dcfcdb643 100644
--- a/spec/controllers/health_controller_spec.rb
+++ b/spec/controllers/health_controller_spec.rb
@@ -5,7 +5,6 @@
 describe HealthController do
   include StubENV
 
-  let(:json_response) { JSON.parse(response.body) }
   let(:token) { Gitlab::CurrentSettings.health_check_access_token }
   let(:whitelisted_ip) { '127.0.0.1' }
   let(:not_whitelisted_ip) { '127.0.0.2' }
diff --git a/spec/controllers/metrics_controller_spec.rb b/spec/controllers/metrics_controller_spec.rb
index ee454a7818c8..84027119491d 100644
--- a/spec/controllers/metrics_controller_spec.rb
+++ b/spec/controllers/metrics_controller_spec.rb
@@ -5,7 +5,6 @@
 describe MetricsController do
   include StubENV
 
-  let(:json_response) { JSON.parse(response.body) }
   let(:metrics_multiproc_dir) { Dir.mktmpdir }
   let(:whitelisted_ip) { '127.0.0.1' }
   let(:whitelisted_ip_range) { '10.0.0.0/24' }
diff --git a/spec/controllers/projects/blob_controller_spec.rb b/spec/controllers/projects/blob_controller_spec.rb
index 44500d3cde34..45aebd1554c4 100644
--- a/spec/controllers/projects/blob_controller_spec.rb
+++ b/spec/controllers/projects/blob_controller_spec.rb
@@ -160,7 +160,7 @@ def do_get(opts = {})
         it 'renders diff context lines Gitlab::Diff::Line array' do
           do_get(since: 1, to: 2, offset: 0, from_merge_request: true)
 
-          lines = JSON.parse(response.body)
+          lines = json_response
 
           expect(lines.size).to eq(diff_lines.size)
           lines.each do |line|
@@ -173,7 +173,7 @@ def do_get(opts = {})
         it 'handles full being true' do
           do_get(full: true, from_merge_request: true)
 
-          lines = JSON.parse(response.body)
+          lines = json_response
 
           expect(lines.size).to eq(diff_lines.size)
         end
diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb
index c07afc57aeac..543479d8dd51 100644
--- a/spec/controllers/projects/boards_controller_spec.rb
+++ b/spec/controllers/projects/boards_controller_spec.rb
@@ -69,10 +69,8 @@
 
         list_boards format: :json
 
-        parsed_response = JSON.parse(response.body)
-
         expect(response).to match_response_schema('boards')
-        expect(parsed_response.length).to eq 2
+        expect(json_response.length).to eq 2
       end
 
       context 'with unauthorized user' do
diff --git a/spec/controllers/projects/branches_controller_spec.rb b/spec/controllers/projects/branches_controller_spec.rb
index b30966e70a7d..f5bcea4a097d 100644
--- a/spec/controllers/projects/branches_controller_spec.rb
+++ b/spec/controllers/projects/branches_controller_spec.rb
@@ -495,10 +495,8 @@ def destroy_all_merged
               search: 'master'
             }
 
-        parsed_response = JSON.parse(response.body)
-
-        expect(parsed_response.length).to eq 1
-        expect(parsed_response.first).to eq 'master'
+        expect(json_response.length).to eq 1
+        expect(json_response.first).to eq 'master'
       end
     end
 
@@ -591,8 +589,7 @@ def destroy_all_merged
     end
 
     it 'returns the commit counts behind and ahead of default branch' do
-      parsed_response = JSON.parse(response.body)
-      expect(parsed_response).to eq(
+      expect(json_response).to eq(
         "fix" => { "behind" => 29, "ahead" => 2 },
         "branch-merged" => { "behind" => 1, "ahead" => 0 },
         "add-pdf-file" => { "behind" => 0, "ahead" => 3 }
diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb
index b5c6382a26d5..58a1d96d010c 100644
--- a/spec/controllers/projects/commit_controller_spec.rb
+++ b/spec/controllers/projects/commit_controller_spec.rb
@@ -378,8 +378,8 @@ def get_pipelines(extra_params = {})
             get_pipelines(id: commit.id, format: :json)
 
             expect(response).to be_ok
-            expect(JSON.parse(response.body)['pipelines']).not_to be_empty
-            expect(JSON.parse(response.body)['count']['all']).to eq 1
+            expect(json_response['pipelines']).not_to be_empty
+            expect(json_response['count']['all']).to eq 1
             expect(response).to include_pagination_headers
           end
         end
diff --git a/spec/controllers/projects/compare_controller_spec.rb b/spec/controllers/projects/compare_controller_spec.rb
index 92380a2bf09f..48a92a772dce 100644
--- a/spec/controllers/projects/compare_controller_spec.rb
+++ b/spec/controllers/projects/compare_controller_spec.rb
@@ -302,8 +302,7 @@ def diff_for_path(extra_params = {})
           signatures_request
 
           expect(response).to have_gitlab_http_status(200)
-          parsed_body = JSON.parse(response.body)
-          signatures = parsed_body['signatures']
+          signatures = json_response['signatures']
 
           expect(signatures.size).to eq(1)
           expect(signatures.first['commit_sha']).to eq(signature_commit.sha)
@@ -332,8 +331,7 @@ def diff_for_path(extra_params = {})
         signatures_request
 
         expect(response).to have_gitlab_http_status(200)
-        parsed_body = JSON.parse(response.body)
-        expect(parsed_body['signatures']).to be_empty
+        expect(json_response['signatures']).to be_empty
       end
     end
 
@@ -345,8 +343,7 @@ def diff_for_path(extra_params = {})
         signatures_request
 
         expect(response).to have_gitlab_http_status(200)
-        parsed_body = JSON.parse(response.body)
-        expect(parsed_body['signatures']).to be_empty
+        expect(json_response['signatures']).to be_empty
       end
     end
   end
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
index fcd14f138634..ccad76eadddc 100644
--- a/spec/controllers/projects/deploy_keys_controller_spec.rb
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -52,12 +52,10 @@
       it 'returns json in a correct format' do
         get :index, params: params.merge(format: :json)
 
-        json = JSON.parse(response.body)
-
-        expect(json.keys).to match_array(%w(enabled_keys available_project_keys public_keys))
-        expect(json['enabled_keys'].count).to eq(1)
-        expect(json['available_project_keys'].count).to eq(1)
-        expect(json['public_keys'].count).to eq(1)
+        expect(json_response.keys).to match_array(%w(enabled_keys available_project_keys public_keys))
+        expect(json_response['enabled_keys'].count).to eq(1)
+        expect(json_response['available_project_keys'].count).to eq(1)
+        expect(json_response['public_keys'].count).to eq(1)
       end
     end
   end
diff --git a/spec/controllers/projects/discussions_controller_spec.rb b/spec/controllers/projects/discussions_controller_spec.rb
index 4c29162cd0f7..e30b28a4bd57 100644
--- a/spec/controllers/projects/discussions_controller_spec.rb
+++ b/spec/controllers/projects/discussions_controller_spec.rb
@@ -112,7 +112,7 @@
         it "returns the name of the resolving user" do
           post :resolve, params: request_params
 
-          expect(JSON.parse(response.body)['resolved_by']['name']).to eq(user.name)
+          expect(json_response['resolved_by']['name']).to eq(user.name)
         end
 
         it "returns status 200" do
@@ -135,7 +135,7 @@
           it "returns truncated diff lines" do
             post :resolve, params: request_params
 
-            expect(JSON.parse(response.body)['truncated_diff_lines']).to be_present
+            expect(json_response['truncated_diff_lines']).to be_present
           end
         end
       end
diff --git a/spec/controllers/projects/find_file_controller_spec.rb b/spec/controllers/projects/find_file_controller_spec.rb
index 538dbb5ad0bc..a493985f8a06 100644
--- a/spec/controllers/projects/find_file_controller_spec.rb
+++ b/spec/controllers/projects/find_file_controller_spec.rb
@@ -53,10 +53,9 @@ def go(format: 'json')
       it 'returns an array of file path list' do
         go
 
-        json = JSON.parse(response.body)
         is_expected.to respond_with(:success)
-        expect(json).not_to eq(nil)
-        expect(json.length).to be >= 0
+        expect(json_response).not_to eq(nil)
+        expect(json_response.length).to be >= 0
       end
     end
 
diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb
index bc5e0b4671ed..32d14dce936c 100644
--- a/spec/controllers/projects/issues_controller_spec.rb
+++ b/spec/controllers/projects/issues_controller_spec.rb
@@ -444,7 +444,7 @@ def reorder_issue(issue, move_after_id: nil, move_before_id: nil, group_full_pat
         it 'renders json with recaptcha_html' do
           subject
 
-          expect(JSON.parse(response.body)).to have_key('recaptcha_html')
+          expect(json_response).to have_key('recaptcha_html')
         end
       end
     end
@@ -484,10 +484,8 @@ def go(id:)
       it 'returns last edited time' do
         go(id: issue.iid)
 
-        data = JSON.parse(response.body)
-
-        expect(data).to include('updated_at')
-        expect(data['updated_at']).to eq(issue.last_edited_at.to_time.iso8601)
+        expect(json_response).to include('updated_at')
+        expect(json_response['updated_at']).to eq(issue.last_edited_at.to_time.iso8601)
       end
     end
 
@@ -520,10 +518,8 @@ def go(id:)
       it 'returns the necessary data' do
         go(id: issue.iid)
 
-        data = JSON.parse(response.body)
-
-        expect(data).to include('title_text', 'description', 'description_text')
-        expect(data).to include('task_status', 'lock_version')
+        expect(json_response).to include('title_text', 'description', 'description_text')
+        expect(json_response).to include('task_status', 'lock_version')
       end
     end
   end
@@ -692,9 +688,7 @@ def go(id:)
 
           update_issue(issue_params: { assignee_ids: [assignee.id] })
 
-          body = JSON.parse(response.body)
-
-          expect(body['assignees'].first.keys)
+          expect(json_response['assignees'].first.keys)
             .to match_array(%w(id name username avatar_url state web_url))
         end
       end
@@ -1314,7 +1308,7 @@ def import_csv
         it 'filters notes that the user should not see' do
           get :discussions, params: { namespace_id: project.namespace, project_id: project, id: issue.iid }
 
-          expect(JSON.parse(response.body).count).to eq(1)
+          expect(json_response.count).to eq(1)
         end
 
         it 'does not result in N+1 queries' do
diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
index 13a28b738ca1..d940d226176f 100644
--- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb
@@ -112,7 +112,7 @@ def diff_for_path(extra_params = {})
           it 'only renders the diffs for the path given' do
             diff_for_path(old_path: existing_path, new_path: existing_path)
 
-            paths = JSON.parse(response.body)["diff_files"].map { |file| file['new_path'] }
+            paths = json_response["diff_files"].map { |file| file['new_path'] }
 
             expect(paths).to include(existing_path)
           end
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index cc6adc0a6c65..f11880122b11 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -242,9 +242,7 @@ def update_merge_request(mr_params, additional_params = {})
 
         update_merge_request({ assignee_ids: [assignee.id] }, format: :json)
 
-        body = JSON.parse(response.body)
-
-        expect(body['assignees']).to all(include(*%w(name username avatar_url id state web_url)))
+        expect(json_response['assignees']).to all(include(*%w(name username avatar_url id state web_url)))
       end
     end
 
diff --git a/spec/controllers/projects/notes_controller_spec.rb b/spec/controllers/projects/notes_controller_spec.rb
index 1db1963476c7..98aea9056dcd 100644
--- a/spec/controllers/projects/notes_controller_spec.rb
+++ b/spec/controllers/projects/notes_controller_spec.rb
@@ -29,7 +29,7 @@
       }
     end
 
-    let(:parsed_response) { JSON.parse(response.body).with_indifferent_access }
+    let(:parsed_response) { json_response.with_indifferent_access }
     let(:note_json) { parsed_response[:notes].first }
 
     before do
@@ -614,7 +614,7 @@ def post_create(extra_params = {})
           it "returns the name of the resolving user" do
             post :resolve, params: request_params.merge(html: true)
 
-            expect(JSON.parse(response.body)["resolved_by"]).to eq(user.name)
+            expect(json_response["resolved_by"]).to eq(user.name)
           end
 
           it "returns status 200" do
diff --git a/spec/controllers/projects/templates_controller_spec.rb b/spec/controllers/projects/templates_controller_spec.rb
index 9e7d34b10c00..d5ef2b0e1148 100644
--- a/spec/controllers/projects/templates_controller_spec.rb
+++ b/spec/controllers/projects/templates_controller_spec.rb
@@ -7,7 +7,6 @@
   let(:user) { create(:user) }
   let(:file_path_1) { '.gitlab/issue_templates/issue_template.md' }
   let(:file_path_2) { '.gitlab/merge_request_templates/merge_request_template.md' }
-  let(:body) { JSON.parse(response.body) }
   let!(:file_1) { project.repository.create_file(user, file_path_1, 'issue content', message: 'message', branch_name: 'master') }
   let!(:file_2) { project.repository.create_file(user, file_path_2, 'merge request content', message: 'message', branch_name: 'master') }
 
@@ -17,8 +16,8 @@
         get(:show, params: { namespace_id: project.namespace, template_type: 'issue', key: 'issue_template', project_id: project }, format: :json)
 
         expect(response.status).to eq(200)
-        expect(body['name']).to eq('issue_template')
-        expect(body['content']).to eq('issue content')
+        expect(json_response['name']).to eq('issue_template')
+        expect(json_response['content']).to eq('issue content')
       end
     end
 
@@ -27,8 +26,8 @@
         get(:show, params: { namespace_id: project.namespace, template_type: 'merge_request', key: 'merge_request_template', project_id: project }, format: :json)
 
         expect(response.status).to eq(200)
-        expect(body['name']).to eq('merge_request_template')
-        expect(body['content']).to eq('merge request content')
+        expect(json_response['name']).to eq('merge_request_template')
+        expect(json_response['content']).to eq('merge request content')
       end
     end
 
diff --git a/spec/controllers/projects/wikis_controller_spec.rb b/spec/controllers/projects/wikis_controller_spec.rb
index f2e0b5e5c1de..a7e5a79b51dd 100644
--- a/spec/controllers/projects/wikis_controller_spec.rb
+++ b/spec/controllers/projects/wikis_controller_spec.rb
@@ -103,7 +103,7 @@
     it 'renders json in a correct format' do
       post :preview_markdown, params: { namespace_id: project.namespace, project_id: project, id: 'page/path', text: '*Markdown* text' }
 
-      expect(JSON.parse(response.body).keys).to match_array(%w(body references))
+      expect(json_response.keys).to match_array(%w(body references))
     end
   end
 
diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb
index 4e1cac67d236..083a1c1383af 100644
--- a/spec/controllers/projects_controller_spec.rb
+++ b/spec/controllers/projects_controller_spec.rb
@@ -740,20 +740,18 @@ def update_project(**parameters)
     it 'gets a list of branches and tags' do
       get :refs, params: { namespace_id: project.namespace, id: project, sort: 'updated_desc' }
 
-      parsed_body = JSON.parse(response.body)
-      expect(parsed_body['Branches']).to include('master')
-      expect(parsed_body['Tags'].first).to eq('v1.1.0')
-      expect(parsed_body['Tags'].last).to eq('v1.0.0')
-      expect(parsed_body['Commits']).to be_nil
+      expect(json_response['Branches']).to include('master')
+      expect(json_response['Tags'].first).to eq('v1.1.0')
+      expect(json_response['Tags'].last).to eq('v1.0.0')
+      expect(json_response['Commits']).to be_nil
     end
 
     it "gets a list of branches, tags and commits" do
       get :refs, params: { namespace_id: project.namespace, id: project, ref: "123456" }
 
-      parsed_body = JSON.parse(response.body)
-      expect(parsed_body["Branches"]).to include("master")
-      expect(parsed_body["Tags"]).to include("v1.0.0")
-      expect(parsed_body["Commits"]).to include("123456")
+      expect(json_response["Branches"]).to include("master")
+      expect(json_response["Tags"]).to include("v1.0.0")
+      expect(json_response["Commits"]).to include("123456")
     end
 
     context "when preferred language is Japanese" do
@@ -765,10 +763,9 @@ def update_project(**parameters)
       it "gets a list of branches, tags and commits" do
         get :refs, params: { namespace_id: project.namespace, id: project, ref: "123456" }
 
-        parsed_body = JSON.parse(response.body)
-        expect(parsed_body["Branches"]).to include("master")
-        expect(parsed_body["Tags"]).to include("v1.0.0")
-        expect(parsed_body["Commits"]).to include("123456")
+        expect(json_response["Branches"]).to include("master")
+        expect(json_response["Tags"]).to include("v1.0.0")
+        expect(json_response["Commits"]).to include("123456")
       end
     end
 
@@ -797,7 +794,7 @@ def update_project(**parameters)
     it 'renders json in a correct format' do
       post :preview_markdown, params: { namespace_id: public_project.namespace, id: public_project, text: '*Markdown* text' }
 
-      expect(JSON.parse(response.body).keys).to match_array(%w(body references))
+      expect(json_response.keys).to match_array(%w(body references))
     end
 
     context 'when not authorized' do
@@ -821,8 +818,6 @@ def update_project(**parameters)
                                   text: issue.to_reference
                                 }
 
-        json_response = JSON.parse(response.body)
-
         expect(json_response['body']).to match(/\##{issue.iid} \(closed\)/)
       end
 
@@ -833,8 +828,6 @@ def update_project(**parameters)
                                   text: merge_request.to_reference
                                 }
 
-        json_response = JSON.parse(response.body)
-
         expect(json_response['body']).to match(/\!#{merge_request.iid} \(closed\)/)
       end
     end
diff --git a/spec/controllers/snippets/notes_controller_spec.rb b/spec/controllers/snippets/notes_controller_spec.rb
index 586d59c2d09c..652533ac49fd 100644
--- a/spec/controllers/snippets/notes_controller_spec.rb
+++ b/spec/controllers/snippets/notes_controller_spec.rb
@@ -26,7 +26,7 @@
       end
 
       it "returns not empty array of notes" do
-        expect(JSON.parse(response.body)["notes"].empty?).to be_falsey
+        expect(json_response["notes"].empty?).to be_falsey
       end
     end
 
@@ -97,7 +97,7 @@
         it "returns 1 note" do
           get :index, params: { snippet_id: private_snippet }
 
-          expect(JSON.parse(response.body)['notes'].count).to eq(1)
+          expect(json_response['notes'].count).to eq(1)
         end
       end
     end
@@ -114,7 +114,7 @@
       it "does not return any note" do
         get :index, params: { snippet_id: public_snippet }
 
-        expect(JSON.parse(response.body)['notes'].count).to eq(0)
+        expect(json_response['notes'].count).to eq(0)
       end
     end
   end
diff --git a/spec/controllers/snippets_controller_spec.rb b/spec/controllers/snippets_controller_spec.rb
index 3aba02bf3ff5..b0092bc89945 100644
--- a/spec/controllers/snippets_controller_spec.rb
+++ b/spec/controllers/snippets_controller_spec.rb
@@ -622,7 +622,7 @@ def mark_as_spam
 
       post :preview_markdown, params: { id: snippet, text: '*Markdown* text' }
 
-      expect(JSON.parse(response.body).keys).to match_array(%w(body references))
+      expect(json_response.keys).to match_array(%w(body references))
     end
   end
 end
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index c3d6ea9cbcde..8b8d4c57000e 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -291,7 +291,7 @@ def create_note_event
       it 'response with snippets json data' do
         get :snippets, params: { username: user.username }, format: :json
         expect(response).to have_gitlab_http_status(200)
-        expect(JSON.parse(response.body)).to have_key('html')
+        expect(json_response).to have_key('html')
       end
     end
 
diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb
index 3e0b478abb3c..8abdcaa2e0e9 100644
--- a/spec/requests/api/search_spec.rb
+++ b/spec/requests/api/search_spec.rb
@@ -89,7 +89,7 @@
           it 'returns empty array' do
             get api('/search', user), params: { scope: 'milestones', search: 'awesome' }
 
-            milestones = JSON.parse(response.body)
+            milestones = json_response
 
             expect(milestones).to be_empty
           end
@@ -356,7 +356,7 @@
           it 'returns empty array' do
             get api("/projects/#{project.id}/search", user), params: { scope: 'milestones', search: 'awesome' }
 
-            milestones = JSON.parse(response.body)
+            milestones = json_response
 
             expect(milestones).to be_empty
           end
diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb
index 1781759c54bb..dc25e4d808ee 100644
--- a/spec/requests/lfs_http_spec.rb
+++ b/spec/requests/lfs_http_spec.rb
@@ -1439,8 +1439,4 @@ def post_lfs_json(url, body = nil, headers = nil)
 
     post(url, params: params, headers: headers)
   end
-
-  def json_response
-    @json_response ||= JSON.parse(response.body)
-  end
 end
diff --git a/spec/requests/lfs_locks_api_spec.rb b/spec/requests/lfs_locks_api_spec.rb
index 5b7b3d2fdd6d..11436e5cd0ce 100644
--- a/spec/requests/lfs_locks_api_spec.rb
+++ b/spec/requests/lfs_locks_api_spec.rb
@@ -163,8 +163,4 @@ def post_lfs_json(url, body = nil, headers = nil)
   def do_get(url, params = nil, headers = nil)
     get(url, params: (params || {}), headers: (headers || {}).merge('Content-Type' => LfsRequest::CONTENT_TYPE))
   end
-
-  def json_response
-    @json_response ||= JSON.parse(response.body)
-  end
 end
diff --git a/spec/support/json_response.rb b/spec/support/json_response.rb
index 210b0e6d867d..43d8ab73dde6 100644
--- a/spec/support/json_response.rb
+++ b/spec/support/json_response.rb
@@ -1,5 +1,5 @@
 RSpec.configure do |config|
-  config.include_context 'JSON response'
+  config.include_context 'JSON response', type: :controller
   config.include_context 'JSON response', type: :request
   config.include_context 'JSON response', :api
 end
diff --git a/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb b/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb
index 0acc9e2a836f..f4b02dc5350f 100644
--- a/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb
+++ b/spec/support/shared_examples/controllers/issuable_notes_filter_shared_examples.rb
@@ -46,7 +46,7 @@
     user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_comments], issuable)
 
     get :discussions, params: params
-    discussions = JSON.parse(response.body)
+    discussions = json_response
 
     expect(discussions.count).to eq(1)
     expect(discussions.first["notes"].first["system"]).to be(false)
@@ -56,7 +56,7 @@
     user.set_notes_filter(UserPreference::NOTES_FILTERS[:only_activity], issuable)
 
     get :discussions, params: params
-    discussions = JSON.parse(response.body)
+    discussions = json_response
 
     expect(discussions.count).to eq(1)
     expect(discussions.first["notes"].first["system"]).to be(true)
diff --git a/spec/support/shared_examples/update_invalid_issuable.rb b/spec/support/shared_examples/update_invalid_issuable.rb
index 64568de424e7..4cb6d001b9b1 100644
--- a/spec/support/shared_examples/update_invalid_issuable.rb
+++ b/spec/support/shared_examples/update_invalid_issuable.rb
@@ -38,7 +38,7 @@
       put :update, params: params
 
       expect(response.status).to eq(409)
-      expect(JSON.parse(response.body)).to have_key('errors')
+      expect(json_response).to have_key('errors')
     end
   end
 
-- 
GitLab