Skip to content

Commit 319a18a

Browse files
author
David Revelo
committed
Use errors extension in sign up mutation
1 parent b825358 commit 319a18a

3 files changed

Lines changed: 48 additions & 33 deletions

File tree

app/graphql/graphql_devise/mutations/sign_up.rb

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@ class SignUp < Base
88
argument :confirm_success_url, String, required: false
99
argument :config_name, String, required: false
1010

11-
field :authenticable, GraphqlDevise::Types::AuthenticableType, null: true
12-
field :success, Boolean, null: false
13-
field :errors, [String], null: false
14-
1511
def resolve(email:, **attrs)
1612
redirect_url = attrs.delete(:confirm_success_url)
1713
resource = resource_class.new(email: email, provider: :email, **attrs)
@@ -32,13 +28,16 @@ def resolve(email:, **attrs)
3228

3329
set_auth_headers(resource) if active_for_authentication?(resource)
3430

35-
{ success: true, authenticable: resource, errors: [] }
31+
{ authenticable: resource }
3632
else
3733
clean_up_passwords(resource)
38-
resource_errors(resource)
34+
raise_user_error_list(
35+
I18n.t('graphql_devise.registration_failed'),
36+
errors: resource.errors.full_messages
37+
)
3938
end
4039
else
41-
single_error_object("Resource couldn't be built, execution stopped.")
40+
raise_user_error(I18n.t('graphql_devise.resource_build_failed'))
4241
end
4342
end
4443

config/locales/en.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
en:
22
graphql_devise:
3+
registration_failed: "User couldn't be registered"
4+
resource_build_failed: "Resource couldn't be built, execution stopped."
35
not_authenticated: "User is not logged in."
46
user_not_found: "User was not found or was not logged in."
57
passwords:

spec/requests/mutations/sign_up_spec.rb

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
passwordConfirmation: "#{password}"
1818
confirmSuccessUrl: "#{redirect}"
1919
) {
20-
success
21-
errors
2220
user {
2321
email
2422
name
@@ -28,30 +26,46 @@
2826
GRAPHQL
2927
end
3028

31-
it 'creates a new resource that requires confirmation' do
32-
expect {
33-
post '/api/v1/graphql_auth', *graphql_params
34-
json_response
35-
}.to(
36-
change(User, :count).by(1)
37-
.and(change(ActionMailer::Base.deliveries, :count).by(1))
38-
)
39-
40-
user = User.last
41-
expect(user).not_to be_active_for_authentication
42-
expect(user.confirmed_at).to be_nil
43-
expect(user.valid_password?(password)).to be_truthy
44-
expect(json_response[:data][:userSignUp]).to include(
45-
success: true,
46-
errors: [],
47-
user: {
48-
email: email,
49-
name: name
50-
}
51-
)
29+
context 'when params are correct' do
30+
it 'creates a new resource that requires confirmation' do
31+
expect { post_request }.to(
32+
change(User, :count).by(1)
33+
.and(change(ActionMailer::Base.deliveries, :count).by(1))
34+
)
35+
36+
user = User.last
37+
expect(user).not_to be_active_for_authentication
38+
expect(user.confirmed_at).to be_nil
39+
expect(user.valid_password?(password)).to be_truthy
40+
expect(json_response[:data][:userSignUp]).to include(
41+
user: {
42+
email: email,
43+
name: name
44+
}
45+
)
46+
47+
email = ActionMailer::Base.deliveries.last
48+
query = ERB::Util.url_encode("confirmAccount($token:ID!,$clientConfig:String,redirect:String!){userConfirmAccount(token:$token,clientConfig:$clientConfig,redirect:$redirect){success,errors}}&variables={token:\"#{user.confirmation_token}\",clientConfig:\"default\",redirect:\"#{redirect}\"}").html_safe
49+
expect(email.body.encoded).to match(/query="#{query}"/)
50+
end
51+
end
52+
53+
context 'when required params are missing' do
54+
let(:email) { '' }
55+
56+
it 'does *NOT* create resource a resource nor send an email' do
57+
expect { post_request }.to(
58+
not_change(User, :count)
59+
.and(not_change(ActionMailer::Base.deliveries, :count))
60+
)
5261

53-
email = ActionMailer::Base.deliveries.last
54-
query = ERB::Util.url_encode("confirmAccount($token:ID!,$clientConfig:String,redirect:String!){userConfirmAccount(token:$token,clientConfig:$clientConfig,redirect:$redirect){success,errors}}&variables={token:\"#{user.confirmation_token}\",clientConfig:\"default\",redirect:\"#{redirect}\"}").html_safe
55-
expect(email.body.encoded).to match(/query="#{query}"/)
62+
expect(json_response[:data][:userSignUp]).to be_nil
63+
expect(json_response[:errors]).to containing_exactly(
64+
hash_including(
65+
message: "User couldn't be registered",
66+
extensions: { code: 'USER_ERROR', detailed_errors: ["Email can't be blank"] }
67+
)
68+
)
69+
end
5670
end
5771
end

0 commit comments

Comments
 (0)