Skip to content

Commit 64cc111

Browse files
committed
Honor Devise's case insensitive fields
1 parent 99c804d commit 64cc111

8 files changed

Lines changed: 73 additions & 16 deletions

File tree

lib/graphql_devise/concerns/controller_methods.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ def find_resource(field, value)
9898
end
9999
end
100100

101+
def get_case_insensitive_field(field, value)
102+
if resource_class.case_insensitive_keys.include?(field)
103+
value.downcase
104+
else
105+
value
106+
end
107+
end
108+
101109
def provider
102110
:email
103111
end

lib/graphql_devise/mutations/login.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Login < Base
99
def resolve(email:, password:)
1010
resource = find_resource(
1111
:email,
12-
email
12+
get_case_insensitive_field(:email, email)
1313
)
1414

1515
if resource && active_for_authentication?(resource)

lib/graphql_devise/mutations/resend_confirmation.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ class ResendConfirmation < Base
77
field :message, String, null: false
88

99
def resolve(email:, redirect_url:)
10-
resource = find_resource(:uid, email)
10+
resource = find_resource(
11+
:email,
12+
get_case_insensitive_field(:email, email)
13+
)
1114

1215
if resource
1316
yield resource if block_given?

lib/graphql_devise/mutations/send_password_reset.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
module GraphqlDevise
22
module Mutations
33
class SendPasswordReset < Base
4-
argument :email, String, required: true, prepare: ->(email, _) { email.downcase }
4+
argument :email, String, required: true
55
argument :redirect_url, String, required: true
66

77
def resolve(email:, redirect_url:)
8-
resource = find_resource(:uid, email)
8+
resource = find_resource(:email, get_case_insensitive_field(:email, email))
99

1010
if resource
1111
yield resource if block_given?
12+
1213
resource.send_reset_password_instructions(
1314
email: email,
1415
provider: 'email',

spec/requests/mutations/login_spec.rb

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
let(:password) { '12345678' }
77

88
context 'when using the user model' do
9-
let(:user) { create(:user, :confirmed, password: password) }
9+
let!(:user) { create(:user, :confirmed, password: password, email: 'vvega@wallaceinc.com') }
10+
let(:email) { user.email }
1011
let(:query) do
1112
<<-GRAPHQL
1213
mutation {
1314
userLogin(
14-
email: "#{user.email}",
15+
email: "#{email}",
1516
password: "#{password}"
1617
) {
1718
user { email name signInCount }
@@ -40,6 +41,17 @@
4041
)
4142
expect(json_response[:errors]).to be_nil
4243
end
44+
45+
context 'when email address uses different casing' do
46+
let(:email) { 'vVeGa@wallaceinc.com' }
47+
48+
it 'honors devise configuration for case insensitive fields' do
49+
expect(response).to include_auth_headers
50+
expect(json_response[:data][:userLogin]).to include(
51+
user: { email: user.email, name: user.name, signInCount: 1 }
52+
)
53+
end
54+
end
4355
end
4456

4557
context 'when credentials are invalid' do

spec/requests/mutations/resend_confirmation_spec.rb

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
RSpec.describe 'Resend confirmation' do
44
include_context 'with graphql query request'
55

6-
let(:user) { create(:user, confirmed_at: nil) }
6+
let!(:user) { create(:user, confirmed_at: nil, email: 'mwallace@wallaceinc.com') }
77
let(:email) { user.email }
88
let(:id) { user.id }
99
let(:redirect) { Faker::Internet.url }
@@ -28,20 +28,20 @@
2828
it 'sends an email to the user with confirmation url and returns a success message' do
2929
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
3030
expect(json_response[:data][:userResendConfirmation]).to include(
31+
message: 'You will receive an email with instructions for how to confirm your email address in a few minutes.',
3132
authenticatable: {
32-
id: id,
33+
id: id,
3334
email: email
34-
},
35-
message: "You will receive an email with instructions for how to confirm your email address in a few minutes."
35+
}
3636
)
37-
37+
3838
email = Nokogiri::HTML(ActionMailer::Base.deliveries.last.body.encoded)
3939
link = email.css('a').first
4040
confirm_link_msg_text = email.css('p')[1].inner_html
4141
confirm_account_link_text = link.inner_html
4242

43-
expect(confirm_link_msg_text).to eq("You can confirm your account email through the link below:")
44-
expect(confirm_account_link_text).to eq("Confirm my account")
43+
expect(confirm_link_msg_text).to eq('You can confirm your account email through the link below:')
44+
expect(confirm_account_link_text).to eq('Confirm my account')
4545

4646
# TODO: Move to feature spec
4747
expect do
@@ -50,6 +50,21 @@
5050
end.to change(user, :confirmed_at).from(NilClass).to(ActiveSupport::TimeWithZone)
5151
end
5252

53+
context 'when email address uses different casing' do
54+
let(:email) { 'mWallace@wallaceinc.com' }
55+
56+
it 'honors devise configuration for case insensitive fields' do
57+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
58+
expect(json_response[:data][:userResendConfirmation]).to include(
59+
message: 'You will receive an email with instructions for how to confirm your email address in a few minutes.',
60+
authenticatable: {
61+
id: id,
62+
email: user.email
63+
}
64+
)
65+
end
66+
end
67+
5368
context 'when the user has already been confirmed' do
5469
before { user.confirm }
5570

@@ -58,7 +73,7 @@
5873
expect(json_response[:data][:userResendConfirmation]).to be_nil
5974
expect(json_response[:errors]).to contain_exactly(
6075
hash_including(
61-
message: "Email was already confirmed, please try signing in",
76+
message: 'Email was already confirmed, please try signing in',
6277
extensions: { code: 'USER_ERROR' }
6378
)
6479
)
@@ -74,7 +89,7 @@
7489
expect(json_response[:data][:userResendConfirmation]).to be_nil
7590
expect(json_response[:errors]).to contain_exactly(
7691
hash_including(
77-
message: "Unable to find user with email '#{email}'.",
92+
message: "Unable to find user with email '#{email}'.",
7893
extensions: { code: 'USER_ERROR' }
7994
)
8095
)

spec/requests/mutations/send_password_reset_spec.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
RSpec.describe 'Send Password Reset Requests' do
44
include_context 'with graphql query request'
55

6-
let(:user) { create(:user, :confirmed) }
6+
let!(:user) { create(:user, :confirmed, email: 'jwinnfield@wallaceinc.com') }
77
let(:email) { user.email }
88
let(:redirect_url) { Faker::Internet.url }
99
let(:query) do
@@ -36,6 +36,14 @@
3636
end
3737
end
3838

39+
context 'when email address uses different casing' do
40+
let(:email) { 'jWinnfield@wallaceinc.com' }
41+
42+
it 'honors devise configuration for case insensitive fields' do
43+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
44+
end
45+
end
46+
3947
context 'when user email is not found' do
4048
let(:email) { 'nothere@gmail.com' }
4149

spec/requests/mutations/sign_up_spec.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@
5555
user.reload
5656
end.to change { user.active_for_authentication? }.to(true)
5757
end
58+
59+
context 'when email address uses different casing' do
60+
let(:email) { 'miaWallace@wallaceinc.com' }
61+
62+
it 'honors devise configuration for case insensitive fields' do
63+
expect { post_request }.to change(ActionMailer::Base.deliveries, :count).by(1)
64+
expect(User.last.email).to eq('miawallace@wallaceinc.com')
65+
expect(json_response[:data][:userSignUp]).to include(user: { email: 'miawallace@wallaceinc.com', name: name })
66+
end
67+
end
5868
end
5969

6070
context 'when required params are missing' do

0 commit comments

Comments
 (0)