From 16bf14f9bf56c259356e8f25b35e1fe8abb89f52 Mon Sep 17 00:00:00 2001
From: Ahmad Farhat <ahmad.af.farhat@gmail.com>
Date: Tue, 3 Oct 2023 11:37:42 -0400
Subject: [PATCH] Fix CI (#5432)

* Fix Greenlight CI

* Rubocop fixes
---
 .github/workflows/ci.build.push.yml           |  2 +
 .rubocop.yml                                  |  3 ++
 .../api/v1/admin/server_rooms_controller.rb   |  2 +-
 .../api/v1/rooms_configurations_controller.rb |  2 +-
 app/controllers/api/v1/rooms_controller.rb    |  2 +-
 .../api/v1/verify_account_controller.rb       |  2 +-
 app/controllers/concerns/authorizable.rb      |  8 +--
 app/controllers/concerns/presentable.rb       |  2 +-
 ..._storage_variant_records.active_storage.rb |  2 +-
 lib/tasks/poller.rake                         |  2 -
 .../admin/invitations_controller_spec.rb      |  6 +--
 .../admin/role_permissions_controller_spec.rb |  8 +--
 .../admin/roles_controller_spec.rb            | 24 ++++-----
 .../server_recordings_controller_spec.rb      | 14 +++---
 .../admin/server_rooms_controller_spec.rb     |  6 +--
 .../admin/site_settings_controller_spec.rb    |  8 +--
 .../admin/users_controller_spec.rb            | 14 +++---
 spec/controllers/external_controller_spec.rb  |  6 +--
 spec/controllers/meetings_controller_spec.rb  | 18 +++----
 .../controllers/recordings_controller_spec.rb | 34 ++++++-------
 .../reset_password_controller_spec.rb         |  2 +-
 .../room_settings_controller_spec.rb          |  4 +-
 .../rooms_configurations_controller_spec.rb   | 12 ++---
 spec/controllers/rooms_controller_spec.rb     | 50 +++++++++----------
 spec/controllers/sessions_controller_spec.rb  |  8 +--
 .../shared_accesses_controller_spec.rb        | 16 +++---
 .../site_settings_controller_spec.rb          |  4 +-
 spec/controllers/users_controller_spec.rb     | 22 ++++----
 28 files changed, 143 insertions(+), 140 deletions(-)

diff --git a/.github/workflows/ci.build.push.yml b/.github/workflows/ci.build.push.yml
index 06f68a2f..cb894d4c 100644
--- a/.github/workflows/ci.build.push.yml
+++ b/.github/workflows/ci.build.push.yml
@@ -9,6 +9,8 @@ on:
       - v2
       - v3
       - translations*
+      - snyk*
+      - dependabot*
 
 jobs:
   main:
diff --git a/.rubocop.yml b/.rubocop.yml
index 0b5ffffe..9f6ae1c9 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -95,3 +95,6 @@ Rails/Output:
 Rails/RootPathnameMethods:
   Enabled: false
 
+Rails/ThreeStateBooleanColumn:
+  Enabled: false
+
diff --git a/app/controllers/api/v1/admin/server_rooms_controller.rb b/app/controllers/api/v1/admin/server_rooms_controller.rb
index c45fdc15..f5099826 100644
--- a/app/controllers/api/v1/admin/server_rooms_controller.rb
+++ b/app/controllers/api/v1/admin/server_rooms_controller.rb
@@ -36,7 +36,7 @@ module Api
 
           pagy, paged_rooms = pagy(rooms)
 
-          RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.select(&:online).any?
+          RunningMeetingChecker.new(rooms: paged_rooms.select(&:online)).call if paged_rooms.any?(&:online)
 
           render_data data: paged_rooms, meta: pagy_metadata(pagy), serializer: ServerRoomSerializer, status: :ok
         end
diff --git a/app/controllers/api/v1/rooms_configurations_controller.rb b/app/controllers/api/v1/rooms_configurations_controller.rb
index 66524eb4..1b209354 100644
--- a/app/controllers/api/v1/rooms_configurations_controller.rb
+++ b/app/controllers/api/v1/rooms_configurations_controller.rb
@@ -45,7 +45,7 @@ module Api
 
         render_data data: config_value, status: :ok
       rescue StandardError
-        return render_error status: :not_found unless config_value
+        render_error status: :not_found unless config_value
       end
     end
   end
diff --git a/app/controllers/api/v1/rooms_controller.rb b/app/controllers/api/v1/rooms_controller.rb
index 0cfd7962..ffde5ff5 100644
--- a/app/controllers/api/v1/rooms_controller.rb
+++ b/app/controllers/api/v1/rooms_controller.rb
@@ -51,7 +51,7 @@ module Api
           room.shared = true if room.user_id != current_user.id
         end
 
-        RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.select(&:online).any?
+        RunningMeetingChecker.new(rooms: rooms.select(&:online)).call if rooms.any?(&:online)
 
         render_data data: rooms, status: :ok
       end
diff --git a/app/controllers/api/v1/verify_account_controller.rb b/app/controllers/api/v1/verify_account_controller.rb
index 8be2b92f..a0e4430a 100644
--- a/app/controllers/api/v1/verify_account_controller.rb
+++ b/app/controllers/api/v1/verify_account_controller.rb
@@ -62,7 +62,7 @@ module Api
         return render_error status: :bad_request unless params[:user]
 
         @user = User.find_by id: params[:user][:id]
-        return render_data status: :ok unless @user && !@user.verified?
+        render_data status: :ok unless @user && !@user.verified?
       end
     end
   end
diff --git a/app/controllers/concerns/authorizable.rb b/app/controllers/concerns/authorizable.rb
index 5de6097d..cea926b7 100644
--- a/app/controllers/concerns/authorizable.rb
+++ b/app/controllers/concerns/authorizable.rb
@@ -21,17 +21,17 @@ module Authorizable
 
   # Unless the request format is explicitly json Rails will mitigate the responsibility to CSR to handle it.
   def ensure_valid_request
-    return render 'components/index' if !Rails.env.development? && !valid_api_request?
+    render 'components/index' if !Rails.env.development? && !valid_api_request?
   end
 
   # Ensures that the user is logged in
   def ensure_authenticated
-    return render_error status: :unauthorized unless current_user
+    render_error status: :unauthorized unless current_user
   end
 
   # PermissionsChecker service will return a true or false depending on whether the current_user's role has the provided permission_name
   def ensure_authorized(permission_names, user_id: nil, friendly_id: nil, record_id: nil)
-    return render_error status: :forbidden unless PermissionsChecker.new(
+    render_error status: :forbidden unless PermissionsChecker.new(
       current_user:,
       permission_names:,
       user_id:,
@@ -42,7 +42,7 @@ module Authorizable
   end
 
   def ensure_super_admin
-    return render_error status: :forbidden unless current_user.super_admin?
+    render_error status: :forbidden unless current_user.super_admin?
   end
 
   private
diff --git a/app/controllers/concerns/presentable.rb b/app/controllers/concerns/presentable.rb
index 6ab661f5..06a59f20 100644
--- a/app/controllers/concerns/presentable.rb
+++ b/app/controllers/concerns/presentable.rb
@@ -20,7 +20,7 @@ module Presentable
   extend ActiveSupport::Concern
 
   def presentation_file_name(room)
-    return room.presentation.filename if room.presentation.attached?
+    room.presentation.filename if room.presentation.attached?
   end
 
   def presentation_thumbnail(room)
diff --git a/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb b/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
index 91e341db..2a94068d 100644
--- a/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
+++ b/db/migrate/20230705183746_create_active_storage_variant_records.active_storage.rb
@@ -7,7 +7,7 @@ class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0]
 
     # Use Active Record's configured type for primary key
 
-    create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| # rubocop:disable Rails/CreateTableWithTimestamps
+    create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t|
       t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type
       t.string :variation_digest, null: false
 
diff --git a/lib/tasks/poller.rake b/lib/tasks/poller.rake
index a4a3070d..b8809108 100644
--- a/lib/tasks/poller.rake
+++ b/lib/tasks/poller.rake
@@ -46,7 +46,6 @@ namespace :poller do
     online_meetings = Room.includes(:user).where(online: true)
 
     RunningMeetingChecker.new(rooms: online_meetings).call
-
   rescue StandardError => e
     err "Unable to poll meetings. Error: #{e}"
   end
@@ -72,7 +71,6 @@ namespace :poller do
         end
 
         RecordingCreator.new(recording:).call
-
       rescue StandardError => e
         err "Unable to poll Recording:\nRecordID: #{recording[:recordID]}\nError: #{e}"
         next
diff --git a/spec/controllers/admin/invitations_controller_spec.rb b/spec/controllers/admin/invitations_controller_spec.rb
index 12392a14..5ad306a9 100644
--- a/spec/controllers/admin/invitations_controller_spec.rb
+++ b/spec/controllers/admin/invitations_controller_spec.rb
@@ -39,7 +39,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('email')).to match_array(invitations.pluck(:email))
+      expect(response.parsed_body['data'].pluck('email')).to match_array(invitations.pluck(:email))
     end
 
     it 'returns the invitations according to the query' do
@@ -52,7 +52,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
 
       get :index, params: { search: 'test.com' }
 
-      expect(JSON.parse(response.body)['data'].pluck('email')).to match_array(invitations.pluck(:email))
+      expect(response.parsed_body['data'].pluck('email')).to match_array(invitations.pluck(:email))
     end
 
     context 'user without ManageUsers permission' do
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::InvitationsController, type: :controller do
       expect { post :create, params: { invitations: valid_params } }.to change(Invitation, :count).by(3)
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'emails the invitations to the invited user' do
diff --git a/spec/controllers/admin/role_permissions_controller_spec.rb b/spec/controllers/admin/role_permissions_controller_spec.rb
index 7f7559c4..fdcf26f5 100644
--- a/spec/controllers/admin/role_permissions_controller_spec.rb
+++ b/spec/controllers/admin/role_permissions_controller_spec.rb
@@ -32,10 +32,10 @@ RSpec.describe Api::V1::Admin::RolePermissionsController, type: :controller do
       get :index, params: { role_id: user_with_manage_roles_permission.role_id }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['CreateRoom']).to eq('true')
-      expect(JSON.parse(response.body)['data']['RoomLimit']).to eq('100')
-      expect(JSON.parse(response.body)['data']['SharedList']).to eq('true')
-      expect(JSON.parse(response.body)['data']['ManageRoles']).to eq('true')
+      expect(response.parsed_body['data']['CreateRoom']).to eq('true')
+      expect(response.parsed_body['data']['RoomLimit']).to eq('100')
+      expect(response.parsed_body['data']['SharedList']).to eq('true')
+      expect(response.parsed_body['data']['ManageRoles']).to eq('true')
     end
 
     context 'user without ManageRoles permission' do
diff --git a/spec/controllers/admin/roles_controller_spec.rb b/spec/controllers/admin/roles_controller_spec.rb
index 23e7d37f..0659ee43 100644
--- a/spec/controllers/admin/roles_controller_spec.rb
+++ b/spec/controllers/admin/roles_controller_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
       get :index
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(roles.pluck(:id))
     end
 
     it 'returns the roles according to the query' do
@@ -44,14 +44,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       create_list(:role, 3)
 
       get :index, params: { search: 'role' }
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(search_roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(search_roles.pluck(:id))
     end
 
     it 'returns all roles if the search bar is empty' do
       create_list(:role, 5)
 
       get :index, params: { search: '' }
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(Role.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(Role.pluck(:id))
     end
 
     it 'excludes roles with a different provider' do
@@ -62,7 +62,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(greenlight_roles.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(greenlight_roles.pluck(:id))
     end
 
     context 'user with ManageUser permission' do
@@ -79,7 +79,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
 
         get :index
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(roles.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(roles.pluck(:id))
       end
     end
 
@@ -108,14 +108,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
 
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(roles.sort.reverse)
+        expect(response.parsed_body['data'].pluck('name')).to eq(roles.sort.reverse)
       end
 
       it 'orders the roles list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(roles.sort)
+        expect(response.parsed_body['data'].pluck('name')).to eq(roles.sort)
       end
     end
   end
@@ -125,14 +125,14 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       valid_params = { name: 'CrazyRole' }
       expect { post :create, params: { role: valid_params } }.to change(Role, :count).by(1)
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'returns :bad_request for invalid params' do
       invalid_params = { name: '' }
       post :create, params: { not_role: invalid_params }
       expect(response).to have_http_status(:bad_request)
-      expect(JSON.parse(response.body)['errors']).not_to be_empty
+      expect(response.parsed_body['errors']).not_to be_empty
     end
 
     it 'calls create_role_permissions on role' do
@@ -161,7 +161,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       post :update, params: { id: role.id, role: valid_params }
       expect(role.reload.name).to eq(valid_params[:name])
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['errors']).to be_nil
+      expect(response.parsed_body['errors']).to be_nil
     end
 
     it 'returns :not_found for unfound roles' do
@@ -174,7 +174,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       invalid_params = { name: '' }
       post :update, params: { id: role.id, not_role: invalid_params }
       expect(response).to have_http_status(:bad_request)
-      expect(JSON.parse(response.body)['errors']).not_to be_empty
+      expect(response.parsed_body['errors']).not_to be_empty
     end
 
     context 'user without ManageRoles permission' do
@@ -196,7 +196,7 @@ RSpec.describe Api::V1::Admin::RolesController, type: :controller do
       role = create(:role)
       get :show, params: { id: role.id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(role.id)
+      expect(response.parsed_body['data']['id']).to eq(role.id)
     end
 
     it 'returns :not_found for unfound roles' do
diff --git a/spec/controllers/admin/server_recordings_controller_spec.rb b/spec/controllers/admin/server_recordings_controller_spec.rb
index 4a405537..cf54781e 100644
--- a/spec/controllers/admin/server_recordings_controller_spec.rb
+++ b/spec/controllers/admin/server_recordings_controller_spec.rb
@@ -35,7 +35,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
     end
 
     it 'returns the recordings according to the query' do
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index, params: { search: 'recording' }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(search_recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(search_recordings.pluck(:id))
     end
 
     it 'returns all recordings if the search query is empty' do
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index, params: { search: '' }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
     end
 
     it 'excludes rooms whose owners have a different provider' do
@@ -64,7 +64,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recs.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(recs.pluck(:id))
     end
 
     context 'SuperAdmin accessing recordings for provider other than current provider' do
@@ -79,7 +79,7 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
 
         get :index
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck(:id))
       end
     end
 
@@ -105,14 +105,14 @@ RSpec.describe Api::V1::Admin::ServerRecordingsController, type: :controller do
         get :index, params: { sort: { column: 'name', direction: 'DESC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[P O O])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[P O O])
       end
 
       it 'orders the recordings list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[O O P])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[O O P])
       end
     end
   end
diff --git a/spec/controllers/admin/server_rooms_controller_spec.rb b/spec/controllers/admin/server_rooms_controller_spec.rb
index ec691cfc..b6d135b3 100644
--- a/spec/controllers/admin/server_rooms_controller_spec.rb
+++ b/spec/controllers/admin/server_rooms_controller_spec.rb
@@ -37,7 +37,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
       create_list(:room, 2, user_id: user_two.id)
 
       get :index
-      expect(JSON.parse(response.body)['data'].pluck('friendly_id'))
+      expect(response.parsed_body['data'].pluck('friendly_id'))
         .to match_array(Room.all.pluck(:friendly_id))
     end
 
@@ -56,7 +56,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
         create_list(:room, 2, user_id: user_two.id)
 
         get :index
-        expect(JSON.parse(response.body)['data'].pluck('friendly_id'))
+        expect(response.parsed_body['data'].pluck('friendly_id'))
           .to match_array(Room.all.pluck(:friendly_id))
       end
     end
@@ -69,7 +69,7 @@ RSpec.describe Api::V1::Admin::ServerRoomsController, type: :controller do
       create_list(:room, 2, user: user2)
 
       get :index
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(rooms.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(rooms.pluck(:id))
     end
 
     context 'user without ManageRooms permission' do
diff --git a/spec/controllers/admin/site_settings_controller_spec.rb b/spec/controllers/admin/site_settings_controller_spec.rb
index 67d122b5..5cd2ed94 100644
--- a/spec/controllers/admin/site_settings_controller_spec.rb
+++ b/spec/controllers/admin/site_settings_controller_spec.rb
@@ -36,10 +36,10 @@ RSpec.describe Api::V1::Admin::SiteSettingsController, type: :controller do
       get :index, params: { names: %w[settingA settingB] }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({
-                                                        'settingA' => 'valueA',
-                                                        'settingB' => 'valueB'
-                                                      })
+      expect(response.parsed_body['data']).to eq({
+                                                   'settingA' => 'valueA',
+                                                   'settingB' => 'valueB'
+                                                 })
     end
 
     context 'user without ManageSiteSettings permission' do
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index 3c93f7ca..d5e45968 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -32,7 +32,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
       users = create_list(:user, 3, status: 'active') + [user, user_with_manage_users_permission]
       get :verified
       expect(response).to have_http_status(:ok)
-      response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_user_ids = response.parsed_body['data'].pluck('id')
       expect(response_user_ids).to match_array(users.pluck(:id))
     end
 
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :verified
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(greenlight_users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(greenlight_users.pluck(:id))
     end
   end
 
@@ -53,7 +53,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :pending
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(users.pluck(:id))
     end
 
     context 'user without ManageUsers permission' do
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
 
       get :banned
 
-      expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(users.pluck(:id))
+      expect(response.parsed_body['data'].pluck('id')).to match_array(users.pluck(:id))
     end
 
     context 'user without ManageUsers permission' do
@@ -101,7 +101,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'active') + [user, user_with_manage_users_permission]
         get :verified
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
 
@@ -109,7 +109,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'pending')
         get :pending
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
 
@@ -117,7 +117,7 @@ RSpec.describe Api::V1::Admin::UsersController, type: :controller do
         users = create_list(:user, 3, status: 'banned')
         get :banned
         expect(response).to have_http_status(:ok)
-        response_user_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_user_ids = response.parsed_body['data'].pluck('id')
         expect(response_user_ids).to match_array(users.pluck(:id))
       end
     end
diff --git a/spec/controllers/external_controller_spec.rb b/spec/controllers/external_controller_spec.rb
index 0f28fd71..1dc22e9b 100644
--- a/spec/controllers/external_controller_spec.rb
+++ b/spec/controllers/external_controller_spec.rb
@@ -389,7 +389,7 @@ RSpec.describe ExternalController, type: :controller do
 
         expect(room.reload.online).to be(false)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
 
       it 'increments a rooms recordings processing value if the meeting was recorded' do
@@ -409,7 +409,7 @@ RSpec.describe ExternalController, type: :controller do
 
         expect(room.online).to be(false)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
     end
 
@@ -418,7 +418,7 @@ RSpec.describe ExternalController, type: :controller do
         get :meeting_ended, params: { meetingID: '404', recordingmarks: 'false' }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)).to eq({})
+        expect(response.parsed_body).to eq({})
       end
     end
   end
diff --git a/spec/controllers/meetings_controller_spec.rb b/spec/controllers/meetings_controller_spec.rb
index 8b197677..48aeec11 100644
--- a/spec/controllers/meetings_controller_spec.rb
+++ b/spec/controllers/meetings_controller_spec.rb
@@ -48,7 +48,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :start, params: { friendly_id: room.friendly_id }
 
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+      expect(response.parsed_body['data']).to eq('JOIN_URL')
     end
 
     it 'cannot make call to MeetingStarter service for another room' do
@@ -81,7 +81,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :start, params: { friendly_id: room.friendly_id }
 
       expect(response).to have_http_status(:created)
-      expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+      expect(response.parsed_body['data']).to eq('JOIN_URL')
     end
 
     it 'returns an error if the user is not logged in' do
@@ -104,7 +104,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :start, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+        expect(response.parsed_body['data']).to eq('JOIN_URL')
       end
     end
 
@@ -134,7 +134,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :start, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['data']).to eq('JOIN_URL')
+        expect(response.parsed_body['data']).to eq('JOIN_URL')
       end
     end
   end
@@ -146,7 +146,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
 
       post :status, params: { friendly_id: test_room.friendly_id, name: user.name }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+      expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
     end
 
     it 'returns status false if the meeting is NOT running and the user is NOT authorized to start the meeting' do
@@ -156,7 +156,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :status, params: { friendly_id: test_room.friendly_id, name: user.name }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'status' => false })
+      expect(response.parsed_body['data']).to eq({ 'status' => false })
     end
 
     it 'joins as viewer if no access code is required nor provided' do
@@ -192,7 +192,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
       post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+      expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
     end
 
     context 'user is joining a shared room' do
@@ -360,7 +360,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+        expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
       end
 
       it 'doesnt start the meeting if its already running' do
@@ -373,7 +373,7 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
         post :status, params: { friendly_id: room.friendly_id, name: user.name }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
+        expect(response.parsed_body['data']).to eq({ 'joinUrl' => 'JOIN_URL', 'status' => true })
       end
     end
 
diff --git a/spec/controllers/recordings_controller_spec.rb b/spec/controllers/recordings_controller_spec.rb
index fd8a53c3..8814aded 100644
--- a/spec/controllers/recordings_controller_spec.rb
+++ b/spec/controllers/recordings_controller_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -43,7 +43,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       get :index
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns the recordings according to the query' do
@@ -56,7 +56,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'greenlight' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -70,7 +70,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'presentation' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -84,7 +84,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:recording, 10)
 
       get :index, params: { search: 'unpublished' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -93,7 +93,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create(:room, user:, recordings:)
 
       get :index, params: { search: '' }
-      response_recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_recording_ids = response.parsed_body['data'].pluck('id')
       expect(response_recording_ids).to match_array(recordings.pluck(:id))
     end
 
@@ -108,14 +108,14 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
         get :index, params: { sort: { column: 'name', direction: 'DESC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[C B A])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[C B A])
       end
 
       it 'orders the recordings list by column and direction ASC' do
         get :index, params: { sort: { column: 'name', direction: 'ASC' } }
         expect(response).to have_http_status(:ok)
         # Order is important match_array isn't adequate for this test.
-        expect(JSON.parse(response.body)['data'].pluck('name')).to eq(%w[A B C])
+        expect(response.parsed_body['data'].pluck('name')).to eq(%w[A B C])
       end
     end
   end
@@ -287,7 +287,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
       create_list(:room, 5, user:, recordings:)
 
       get :recordings_count
-      expect(JSON.parse(response.body)['data']).to be(5)
+      expect(response.parsed_body['data']).to be(5)
     end
   end
 
@@ -314,7 +314,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)).to match_array ['https://test.com/screenshare', 'https://test.com/video']
+          expect(response.parsed_body).to match_array ['https://test.com/screenshare', 'https://test.com/video']
         end
 
         context 'Single playback format' do
@@ -328,7 +328,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id }
 
             expect(response).to have_http_status(:ok)
-            expect(JSON.parse(response.body)).to eq ['https://test.com/screenshare']
+            expect(response.parsed_body).to eq ['https://test.com/screenshare']
           end
         end
       end
@@ -349,7 +349,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)).to match_array recording.formats.pluck(:url)
+          expect(response.parsed_body).to match_array recording.formats.pluck(:url)
         end
       end
     end
@@ -370,7 +370,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id, recording_format: 'screenshare' }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)['data']).to eq 'https://test.com/screenshare'
+          expect(response.parsed_body['data']).to eq 'https://test.com/screenshare'
         end
 
         context 'Single playback format' do
@@ -384,7 +384,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: 'screenshare' }
 
             expect(response).to have_http_status(:ok)
-            expect(JSON.parse(response.body)['data']).to eq 'https://test.com/screenshare/solo'
+            expect(response.parsed_body['data']).to eq 'https://test.com/screenshare/solo'
           end
         end
 
@@ -393,7 +393,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: '404' }
 
             expect(response).to have_http_status(:not_found)
-            expect(JSON.parse(response.body)['data']).to be_blank
+            expect(response.parsed_body['data']).to be_blank
           end
         end
       end
@@ -416,7 +416,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
           post :recording_url, params: { id: recording.record_id, recording_format: target_format.recording_type }
 
           expect(response).to have_http_status(:ok)
-          expect(JSON.parse(response.body)['data']).to eq target_format.url
+          expect(response.parsed_body['data']).to eq target_format.url
         end
 
         context 'Inexistent format' do
@@ -424,7 +424,7 @@ RSpec.describe Api::V1::RecordingsController, type: :controller do
             post :recording_url, params: { id: recording.record_id, recording_format: '404' }
 
             expect(response).to have_http_status(:not_found)
-            expect(JSON.parse(response.body)['data']).to be_blank
+            expect(response.parsed_body['data']).to be_blank
           end
         end
       end
diff --git a/spec/controllers/reset_password_controller_spec.rb b/spec/controllers/reset_password_controller_spec.rb
index ea9c0349..c3070578 100644
--- a/spec/controllers/reset_password_controller_spec.rb
+++ b/spec/controllers/reset_password_controller_spec.rb
@@ -38,7 +38,7 @@ RSpec.describe Api::V1::ResetPasswordController, type: :controller do
       expect(ActionMailer::MailDeliveryJob).to have_been_enqueued.at(:no_wait).exactly(:once).with('UserMailer', 'reset_password_email',
                                                                                                    'deliver_now', Hash)
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns :bad_request for invalid params' do
diff --git a/spec/controllers/room_settings_controller_spec.rb b/spec/controllers/room_settings_controller_spec.rb
index 16acf00a..14674b69 100644
--- a/spec/controllers/room_settings_controller_spec.rb
+++ b/spec/controllers/room_settings_controller_spec.rb
@@ -42,7 +42,7 @@ RSpec.describe Api::V1::RoomSettingsController, type: :controller do
 
       get :show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'setting' => 'value' })
+      expect(response.parsed_body['data']).to eq({ 'setting' => 'value' })
     end
 
     it 'returns the value for a shared user' do
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::RoomSettingsController, type: :controller do
       sign_in_user(shared_user)
 
       get :show, params: { friendly_id: room.friendly_id }
-      expect(JSON.parse(response.body)['data']).to eq({ 'setting' => 'value' })
+      expect(response.parsed_body['data']).to eq({ 'setting' => 'value' })
     end
 
     context 'AuthN' do
diff --git a/spec/controllers/rooms_configurations_controller_spec.rb b/spec/controllers/rooms_configurations_controller_spec.rb
index 9d38dd8c..159786c1 100644
--- a/spec/controllers/rooms_configurations_controller_spec.rb
+++ b/spec/controllers/rooms_configurations_controller_spec.rb
@@ -38,11 +38,11 @@ RSpec.describe Api::V1::RoomsConfigurationsController, type: :controller do
 
       get :index
 
-      expect(JSON.parse(response.body)['data']).to eq({
-                                                        'TRUE' => 'true',
-                                                        'FALSE' => 'false',
-                                                        'OPTIONAL' => 'optional'
-                                                      })
+      expect(response.parsed_body['data']).to eq({
+                                                   'TRUE' => 'true',
+                                                   'FALSE' => 'false',
+                                                   'OPTIONAL' => 'optional'
+                                                 })
       expect(response).to have_http_status(:ok)
     end
   end
@@ -55,7 +55,7 @@ RSpec.describe Api::V1::RoomsConfigurationsController, type: :controller do
     it 'returns the correct configuration value' do
       get :show, params: { name: 'record' }
 
-      expect(JSON.parse(response.body)['data']).to eq('false')
+      expect(response.parsed_body['data']).to eq('false')
 
       expect(response).to have_http_status(:ok)
     end
diff --git a/spec/controllers/rooms_controller_spec.rb b/spec/controllers/rooms_controller_spec.rb
index 747ab0b8..469cbc07 100644
--- a/spec/controllers/rooms_controller_spec.rb
+++ b/spec/controllers/rooms_controller_spec.rb
@@ -35,14 +35,14 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       rooms = create_list(:room, 3, user:) + shared_rooms
       get :index
       expect(response).to have_http_status(:ok)
-      response_room_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_room_ids = response.parsed_body['data'].pluck('id')
       expect(response_room_ids).to match_array(rooms.pluck(:id))
     end
 
     it 'no rooms for current_user should return empty list' do
       get :index
       expect(response).to have_http_status(:ok)
-      response_room_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_room_ids = response.parsed_body['data'].pluck('id')
       expect(response_room_ids).to be_empty
     end
 
@@ -54,14 +54,14 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         create_list(:room, 2, user:)
 
         get :index, params: { search: 'room' }
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(searched_rooms.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(searched_rooms.pluck(:id))
       end
 
       it 'returns all rooms when no search query was given' do
         create_list(:room, 5, user:)
 
         get :index, params: { search: '' }
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(user.rooms.pluck(:id))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(user.rooms.pluck(:id))
       end
     end
   end
@@ -71,13 +71,13 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       room = create(:room, user:)
       get :show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(room.id)
+      expect(response.parsed_body['data']['id']).to eq(room.id)
     end
 
     it 'returns :not_found if the room doesnt exist' do
       get :show, params: { friendly_id: 'invalid_friendly_id' }
       expect(response).to have_http_status(:not_found)
-      expect(JSON.parse(response.body)['data']).to be_nil
+      expect(response.parsed_body['data']).to be_nil
     end
 
     it 'user cannot see another users room without ManageRooms permission' do
@@ -99,7 +99,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       it 'allows a user who the room is shared with to view the room' do
         get :show, params: { friendly_id: room.friendly_id }
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']['id']).to eq(room.id)
+        expect(response.parsed_body['data']['id']).to eq(room.id)
       end
     end
   end
@@ -129,19 +129,19 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       get :public_show, params: { friendly_id: room.friendly_id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['name']).to eq(room.name)
-      expect(JSON.parse(response.body)['data']['require_authentication']).to be(true)
-      expect(JSON.parse(response.body)['data']['viewer_access_code']).to be(true)
-      expect(JSON.parse(response.body)['data']['moderator_access_code']).to be(false)
-      expect(JSON.parse(response.body)['data']['anyone_join_as_moderator']).to be(true)
-      expect(JSON.parse(response.body)['data']['owner_name']).to eq(user.name)
-      expect(JSON.parse(response.body)['data']['owner_avatar']).to be_present
+      expect(response.parsed_body['data']['name']).to eq(room.name)
+      expect(response.parsed_body['data']['require_authentication']).to be(true)
+      expect(response.parsed_body['data']['viewer_access_code']).to be(true)
+      expect(response.parsed_body['data']['moderator_access_code']).to be(false)
+      expect(response.parsed_body['data']['anyone_join_as_moderator']).to be(true)
+      expect(response.parsed_body['data']['owner_name']).to eq(user.name)
+      expect(response.parsed_body['data']['owner_avatar']).to be_present
     end
 
     it 'returns :not_found if the room doesnt exist' do
       get :public_show, params: { friendly_id: 'invalid_friendly_id' }
       expect(response).to have_http_status(:not_found)
-      expect(JSON.parse(response.body)['data']).to be_nil
+      expect(response.parsed_body['data']).to be_nil
     end
   end
 
@@ -301,7 +301,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
       recordings = create_list(:recording, 5, room: room1)
       create_list(:recording, 5, room: room2)
       get :recordings, params: { friendly_id: room1.friendly_id }
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to match_array(recordings.pluck(:id))
     end
@@ -309,7 +309,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
     it 'returns an empty array if the room has no recordings' do
       room1 = create(:room, user:, friendly_id: 'friendly_id_1')
       get :recordings, params: { friendly_id: room1.friendly_id }
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to be_empty
     end
@@ -324,7 +324,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       get :recordings, params: { friendly_id: room.friendly_id }
 
-      recording_ids = JSON.parse(response.body)['data'].pluck('id')
+      recording_ids = response.parsed_body['data'].pluck('id')
       expect(response).to have_http_status(:ok)
       expect(recording_ids).to match_array(recordings.pluck(:id))
     end
@@ -353,7 +353,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         get :public_recordings, params: { friendly_id: room.friendly_id }
 
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data']).to match_array(expected_response)
+        expect(response.parsed_body['data']).to match_array(expected_response)
       end
     end
 
@@ -370,9 +370,9 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_have(page:, pages:, recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck('id'))
-        expect(JSON.parse(response.body)['meta']['pages']).to eq(pages)
-        expect(JSON.parse(response.body)['meta']['page']).to eq(page)
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck('id'))
+        expect(response.parsed_body['meta']['pages']).to eq(pages)
+        expect(response.parsed_body['meta']['page']).to eq(page)
       end
 
       context 'First page' do
@@ -427,7 +427,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_have_ordered(recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to eq(recordings.pluck('id'))
+        expect(response.parsed_body['data'].pluck('id')).to eq(recordings.pluck('id'))
       end
 
       describe 'Sort by name' do
@@ -493,7 +493,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
 
       def expect_response_to_match(recordings:)
         expect(response).to have_http_status(:ok)
-        expect(JSON.parse(response.body)['data'].pluck('id')).to match_array(recordings.pluck('id'))
+        expect(response.parsed_body['data'].pluck('id')).to match_array(recordings.pluck('id'))
       end
 
       describe 'Matched by name' do
@@ -539,7 +539,7 @@ RSpec.describe Api::V1::RoomsController, type: :controller do
         get :public_recordings, params: { friendly_id: '404' }
 
         expect(response).to have_http_status(:not_found)
-        expect(JSON.parse(response.body)['data']).to be_blank
+        expect(response.parsed_body['data']).to be_blank
       end
     end
   end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 06bbabc2..e2202d26 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -64,8 +64,8 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['data']).to eq(unverified_user.id)
-      expect(JSON.parse(response.body)['errors']).to eq('UnverifiedUser')
+      expect(response.parsed_body['data']).to eq(unverified_user.id)
+      expect(response.parsed_body['errors']).to eq('UnverifiedUser')
     end
 
     it 'returns BannedUser error if the user is banned' do
@@ -78,7 +78,7 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['errors']).to eq('BannedUser')
+      expect(response.parsed_body['errors']).to eq('BannedUser')
     end
 
     it 'returns Pending error if the user is banned' do
@@ -91,7 +91,7 @@ RSpec.describe Api::V1::SessionsController, type: :controller do
         }
       }
 
-      expect(JSON.parse(response.body)['errors']).to eq('PendingUser')
+      expect(response.parsed_body['errors']).to eq('PendingUser')
     end
 
     it 'logs in with greenlight account before bn account' do
diff --git a/spec/controllers/shared_accesses_controller_spec.rb b/spec/controllers/shared_accesses_controller_spec.rb
index e48f1fce..1511f810 100644
--- a/spec/controllers/shared_accesses_controller_spec.rb
+++ b/spec/controllers/shared_accesses_controller_spec.rb
@@ -51,7 +51,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users = shared_users
 
       get :show, params: { friendly_id: room.friendly_id, search: '' }
-      shared_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      shared_user_ids = response.parsed_body['data'].pluck('id')
       expect(shared_user_ids).to match_array(shared_users.pluck(:id))
       expect(shared_user_ids).not_to include(unshared_users.pluck(:id))
     end
@@ -62,7 +62,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users << searched_users
 
       get :show, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(searched_users.pluck(:id))
     end
 
@@ -74,7 +74,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       room.shared_users = shared_users + [shared_user]
 
       get :show, params: { friendly_id: room.friendly_id, search: '' }
-      shared_user_ids = JSON.parse(response.body)['data'].pluck('id')
+      shared_user_ids = response.parsed_body['data'].pluck('id')
       expect(shared_user_ids).to match_array((shared_users + [shared_user]).pluck(:id))
     end
   end
@@ -85,7 +85,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users << user
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: '' }
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'does not return any users if the search params has less than 3 characters' do
@@ -93,7 +93,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users << user
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'Jo' }
-      expect(JSON.parse(response.body)['data']).to be_empty
+      expect(response.parsed_body['data']).to be_empty
     end
 
     it 'returns the users that the room can be shared to' do
@@ -101,7 +101,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users = create_list(:user, 5, name: 'John Doe')
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(shareable_users.pluck(:id))
     end
 
@@ -110,7 +110,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
       shareable_users = create_list(:user, 5, name: 'Jane Doe')
 
       get :shareable_users, params: { friendly_id: room.friendly_id, search: 'Jane Doe' }
-      response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+      response_users_ids = response.parsed_body['data'].pluck('id')
       expect(response_users_ids).to match_array(shareable_users.pluck(:id))
     end
 
@@ -120,7 +120,7 @@ RSpec.describe Api::V1::SharedAccessesController, type: :controller do
         create(:user, :without_shared_list_permission, name: 'John Doe')
 
         get :shareable_users, params: { friendly_id: room.friendly_id, search: 'John Doe' }
-        response_users_ids = JSON.parse(response.body)['data'].pluck('id')
+        response_users_ids = response.parsed_body['data'].pluck('id')
         expect(response_users_ids).to match_array([])
       end
     end
diff --git a/spec/controllers/site_settings_controller_spec.rb b/spec/controllers/site_settings_controller_spec.rb
index 8b2faf14..b8bd10d9 100644
--- a/spec/controllers/site_settings_controller_spec.rb
+++ b/spec/controllers/site_settings_controller_spec.rb
@@ -34,7 +34,7 @@ RSpec.describe Api::V1::SiteSettingsController, type: :controller do
       get :index, params: { names: 'SettingName' }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq('false')
+      expect(response.parsed_body['data']).to eq('false')
     end
 
     it 'calls SettingGetter and returns multiple values' do
@@ -44,7 +44,7 @@ RSpec.describe Api::V1::SiteSettingsController, type: :controller do
       get :index, params: { names: %w[Uno Dos Tres] }
 
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']).to eq({ 'Uno' => 1, 'Dos' => 2, 'Tres' => 3 })
+      expect(response.parsed_body['data']).to eq({ 'Uno' => 1, 'Dos' => 2, 'Tres' => 3 })
     end
 
     it 'returns forbidden if trying to access a forbidden setting' do
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index 7249637a..7c61036e 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -58,7 +58,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
         expect { post :create, params: user_params }.to change(User, :count).from(0).to(1)
 
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['errors']).to be_nil
+        expect(response.parsed_body['errors']).to be_nil
       end
 
       it 'assigns the User role to the user' do
@@ -170,7 +170,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
         expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued
         expect(response).to have_http_status(:bad_request)
-        expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:record_invalid])
+        expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:record_invalid])
       end
 
       context 'Duplicated email' do
@@ -184,7 +184,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
           expect(ActionMailer::MailDeliveryJob).not_to have_been_enqueued
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:email_exists])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:email_exists])
         end
       end
     end
@@ -209,7 +209,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
 
         expect(User.find_by(email: user_params[:email]).role).to eq(autobots)
         expect(response).to have_http_status(:created)
-        expect(JSON.parse(response.body)['errors']).to be_nil
+        expect(response.parsed_body['errors']).to be_nil
       end
     end
 
@@ -228,7 +228,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.to change(User, :count).from(0).to(1)
 
           expect(response).to have_http_status(:created)
-          expect(JSON.parse(response.body)['errors']).to be_nil
+          expect(response.parsed_body['errors']).to be_nil
         end
 
         it 'deletes an invitation after using it' do
@@ -244,14 +244,14 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.to change(User, :count).by(1)
 
           expect(response).to have_http_status(:created)
-          expect(JSON.parse(response.body)['errors']).to be_nil
+          expect(response.parsed_body['errors']).to be_nil
         end
 
         it 'returns an InviteInvalid error if no invite is passed' do
           expect { post :create, params: user_params }.not_to change(User, :count)
 
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
         end
 
         it 'returns an InviteInvalid error if the token is wrong' do
@@ -259,7 +259,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
           expect { post :create, params: user_params }.not_to change(User, :count)
 
           expect(response).to have_http_status(:bad_request)
-          expect(JSON.parse(response.body)['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
+          expect(response.parsed_body['errors']).to eq(Rails.configuration.custom_error_msgs[:invite_token_invalid])
         end
       end
 
@@ -287,8 +287,8 @@ RSpec.describe Api::V1::UsersController, type: :controller do
         expect { post :create, params: user_params }.not_to change(User, :count)
 
         expect(response).to have_http_status(:forbidden)
-        expect(JSON.parse(response.body)['data']).to be_blank
-        expect(JSON.parse(response.body)['errors']).not_to be_nil
+        expect(response.parsed_body['data']).to be_blank
+        expect(response.parsed_body['errors']).not_to be_nil
       end
     end
   end
@@ -301,7 +301,7 @@ RSpec.describe Api::V1::UsersController, type: :controller do
     it 'returns a user if id is valid' do
       get :show, params: { id: user.id }
       expect(response).to have_http_status(:ok)
-      expect(JSON.parse(response.body)['data']['id']).to eq(user.id)
+      expect(response.parsed_body['data']['id']).to eq(user.id)
     end
   end
 
-- 
GitLab