From 0b5133bac2cbcf6f75aaa90acec269a1a7d02c7c Mon Sep 17 00:00:00 2001
From: Jacopo <beschi.jacopo@gmail.com>
Date: Sun, 9 Jul 2017 10:51:59 +0200
Subject: [PATCH] Extract "@request.env['devise.mapping'] =
 Devise.mappings[:user]" to a test helper

Extracted `@request.env['devise.mapping'] = Devise.mappings[:user]` and `Rails.application.env_config['devise.mapping'] = Devise.mappings[:user]`
in our tests into the helper method `set_devise_mapping`
---
 .../34549-extract-devise-mappings-into-helper.yml  |  4 ++++
 spec/controllers/sessions_controller_spec.rb       |  8 +++++---
 spec/features/oauth_login_spec.rb                  |  4 +++-
 spec/javascripts/fixtures/u2f.rb                   |  4 +++-
 spec/support/devise_helpers.rb                     | 14 ++++++++++++++
 spec/support/login_helpers.rb                      |  4 +++-
 6 files changed, 32 insertions(+), 6 deletions(-)
 create mode 100644 changelogs/unreleased/34549-extract-devise-mappings-into-helper.yml
 create mode 100644 spec/support/devise_helpers.rb

diff --git a/changelogs/unreleased/34549-extract-devise-mappings-into-helper.yml b/changelogs/unreleased/34549-extract-devise-mappings-into-helper.yml
new file mode 100644
index 00000000000..e843bbac239
--- /dev/null
+++ b/changelogs/unreleased/34549-extract-devise-mappings-into-helper.yml
@@ -0,0 +1,4 @@
+---
+title: Extract "@request.env[devise.mapping] = Devise.mappings[:user]" to a test helper
+merge_request: 12742
+author: Jacopo Beschi @jacopo-beschi
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index bf922260b2f..e17d5639d7b 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -1,9 +1,11 @@
 require 'spec_helper'
 
 describe SessionsController do
+  include DeviseHelpers
+
   describe '#new' do
     before do
-      @request.env['devise.mapping'] = Devise.mappings[:user]
+      set_devise_mapping(context: @request)
     end
 
     context 'when auto sign-in is enabled' do
@@ -34,7 +36,7 @@ describe SessionsController do
 
   describe '#create' do
     before do
-      @request.env['devise.mapping'] = Devise.mappings[:user]
+      set_devise_mapping(context: @request)
     end
 
     context 'when using standard authentications' do
@@ -257,7 +259,7 @@ describe SessionsController do
 
   describe '#new' do
     before do
-      @request.env['devise.mapping'] = Devise.mappings[:user]
+      set_devise_mapping(context: @request)
     end
 
     it 'redirects correctly for referer on same host with params' do
diff --git a/spec/features/oauth_login_spec.rb b/spec/features/oauth_login_spec.rb
index 42764e808e6..0064c9ef25e 100644
--- a/spec/features/oauth_login_spec.rb
+++ b/spec/features/oauth_login_spec.rb
@@ -1,6 +1,8 @@
 require 'spec_helper'
 
 feature 'OAuth Login', js: true do
+  include DeviseHelpers
+
   def enter_code(code)
     fill_in 'user_otp_attempt', with: code
     click_button 'Verify code'
@@ -8,7 +10,7 @@ feature 'OAuth Login', js: true do
 
   def stub_omniauth_config(provider)
     OmniAuth.config.add_mock(provider, OmniAuth::AuthHash.new(provider: provider.to_s, uid: "12345"))
-    Rails.application.env_config['devise.mapping'] = Devise.mappings[:user]
+    set_devise_mapping(context: Rails.application)
     Rails.application.env_config['omniauth.auth'] = OmniAuth.config.mock_auth[provider]
   end
 
diff --git a/spec/javascripts/fixtures/u2f.rb b/spec/javascripts/fixtures/u2f.rb
index c9c0b891237..e3d7986f2cf 100644
--- a/spec/javascripts/fixtures/u2f.rb
+++ b/spec/javascripts/fixtures/u2f.rb
@@ -10,10 +10,12 @@ context 'U2F' do
   end
 
   describe SessionsController, '(JavaScript fixtures)', type: :controller do
+    include DeviseHelpers
+
     render_views
 
     before do
-      @request.env['devise.mapping'] = Devise.mappings[:user]
+      set_devise_mapping(context: @request)
     end
 
     it 'u2f/authenticate.html.raw' do |example|
diff --git a/spec/support/devise_helpers.rb b/spec/support/devise_helpers.rb
new file mode 100644
index 00000000000..890a2d9d287
--- /dev/null
+++ b/spec/support/devise_helpers.rb
@@ -0,0 +1,14 @@
+module DeviseHelpers
+  # explicitly tells Devise which mapping to use
+  # this is needed when we are testing a Devise controller bypassing the router
+  def set_devise_mapping(context:)
+    env =
+      if context.respond_to?(:env_config)
+        context.env_config
+      elsif context.respond_to?(:env)
+        context.env
+      end
+
+    env['devise.mapping'] = Devise.mappings[:user] if env
+  end
+end
diff --git a/spec/support/login_helpers.rb b/spec/support/login_helpers.rb
index b410a652126..701de9c8c19 100644
--- a/spec/support/login_helpers.rb
+++ b/spec/support/login_helpers.rb
@@ -1,4 +1,6 @@
 module LoginHelpers
+  include DeviseHelpers
+
   # Internal: Log in as a specific user or a new user of a specific role
   #
   # user_or_role - User object, or a role to create (e.g., :admin, :user)
@@ -106,7 +108,7 @@ module LoginHelpers
   end
 
   def stub_omniauth_saml_config(messages)
-    Rails.application.env_config['devise.mapping'] = Devise.mappings[:user]
+    set_devise_mapping(context: Rails.application)
     Rails.application.routes.disable_clear_and_finalize = true
     Rails.application.routes.draw do
       post '/users/auth/saml' => 'omniauth_callbacks#saml'
-- 
GitLab