graphql_devise 0.18.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.circleci/config.yml +7 -2
- data/.gitignore +3 -0
- data/.rubocop.yml +9 -10
- data/Appraisals +70 -18
- data/CHANGELOG.md +53 -0
- data/README.md +71 -142
- data/app/controllers/graphql_devise/graphql_controller.rb +3 -3
- data/app/views/graphql_devise/mailer/confirmation_instructions.html.erb +1 -5
- data/config/routes.rb +0 -2
- data/graphql_devise.gemspec +7 -5
- data/lib/graphql_devise/concerns/additional_controller_methods.rb +48 -0
- data/lib/graphql_devise/concerns/additional_model_methods.rb +17 -0
- data/lib/graphql_devise/concerns/authenticatable.rb +1 -1
- data/lib/graphql_devise/concerns/controller_methods.rb +70 -93
- data/lib/graphql_devise/concerns/field_authentication.rb +14 -0
- data/lib/graphql_devise/concerns/set_user_by_token.rb +1 -1
- data/lib/graphql_devise/default_operations.rb +16 -0
- data/lib/graphql_devise/engine.rb +0 -2
- data/lib/graphql_devise/model/with_email_updater.rb +5 -30
- data/lib/graphql_devise/mount_method/operation_preparer.rb +0 -7
- data/lib/graphql_devise/mount_method/operation_preparers/custom_operation_preparer.rb +1 -1
- data/lib/graphql_devise/mount_method/operation_preparers/default_operation_preparer.rb +1 -1
- data/lib/graphql_devise/mount_method/operation_sanitizer.rb +0 -12
- data/lib/graphql_devise/mount_method/option_sanitizer.rb +0 -2
- data/lib/graphql_devise/mount_method/option_sanitizers/array_checker.rb +2 -2
- data/lib/graphql_devise/mount_method/option_sanitizers/class_checker.rb +2 -2
- data/lib/graphql_devise/mount_method/option_sanitizers/hash_checker.rb +1 -1
- data/lib/graphql_devise/mount_method/option_sanitizers/string_checker.rb +1 -1
- data/lib/graphql_devise/mount_method/option_validators/provided_operations_validator.rb +0 -2
- data/lib/graphql_devise/mount_method/option_validators/skip_only_validator.rb +1 -1
- data/lib/graphql_devise/mount_method/option_validators/supported_operations_validator.rb +1 -1
- data/lib/graphql_devise/mount_method/options_validator.rb +0 -3
- data/lib/graphql_devise/mount_method/supported_options.rb +0 -5
- data/lib/graphql_devise/mutations/base.rb +1 -1
- data/lib/graphql_devise/mutations/confirm_registration_with_token.rb +1 -1
- data/lib/graphql_devise/mutations/login.rb +1 -1
- data/lib/graphql_devise/mutations/register.rb +1 -1
- data/lib/graphql_devise/mutations/update_password_with_token.rb +1 -1
- data/lib/graphql_devise/resolvers/base.rb +1 -1
- data/lib/graphql_devise/resource_loader.rb +71 -39
- data/lib/graphql_devise/route_mounter.rb +13 -0
- data/lib/graphql_devise/schema_plugin.rb +7 -40
- data/lib/graphql_devise/types/authenticatable_type.rb +1 -1
- data/lib/graphql_devise/types/base_field.rb +9 -0
- data/lib/graphql_devise/types/base_type.rb +8 -0
- data/lib/graphql_devise/types/credential_type.rb +1 -1
- data/lib/graphql_devise/types/mutation_type.rb +1 -0
- data/lib/graphql_devise/types/query_type.rb +1 -0
- data/lib/graphql_devise/version.rb +1 -1
- data/lib/graphql_devise.rb +21 -29
- data/spec/dummy/app/controllers/api/v1/graphql_controller.rb +1 -16
- data/spec/dummy/app/graphql/dummy_schema.rb +1 -5
- data/spec/dummy/app/graphql/interpreter_schema.rb +6 -2
- data/spec/dummy/app/graphql/mutations/base_mutation.rb +6 -0
- data/spec/dummy/app/graphql/mutations/update_user.rb +2 -4
- data/spec/dummy/app/graphql/types/admin_type.rb +1 -1
- data/spec/dummy/app/graphql/types/custom_admin_type.rb +1 -1
- data/spec/dummy/app/graphql/types/mutation_type.rb +3 -1
- data/spec/dummy/app/graphql/types/query_type.rb +3 -1
- data/spec/dummy/app/graphql/types/user_type.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/config/routes.rb +5 -9
- data/spec/graphql_devise/model/with_email_updater_spec.rb +17 -35
- data/spec/rails_helper.rb +5 -5
- data/spec/requests/mutations/resend_confirmation_with_token_spec.rb +2 -3
- data/spec/requests/user_controller_spec.rb +1 -33
- data/spec/services/resource_loader_spec.rb +14 -3
- metadata +55 -48
- data/app/controllers/graphql_devise/concerns/additional_controller_methods.rb +0 -72
- data/app/controllers/graphql_devise/concerns/set_user_by_token.rb +0 -21
- data/app/helpers/graphql_devise/mailer_helper.rb +0 -37
- data/app/models/graphql_devise/concerns/additional_model_methods.rb +0 -21
- data/app/models/graphql_devise/concerns/model.rb +0 -25
- data/lib/graphql_devise/default_operations/mutations.rb +0 -32
- data/lib/graphql_devise/default_operations/resolvers.rb +0 -14
- data/lib/graphql_devise/mutations/resend_confirmation.rb +0 -45
- data/lib/graphql_devise/mutations/send_password_reset.rb +0 -38
- data/lib/graphql_devise/mutations/sign_up.rb +0 -61
- data/lib/graphql_devise/mutations/update_password.rb +0 -46
- data/lib/graphql_devise/rails/routes.rb +0 -15
- data/lib/graphql_devise/resolvers/check_password_token.rb +0 -43
- data/lib/graphql_devise/resolvers/confirm_account.rb +0 -42
- data/spec/dummy/app/graphql/mutations/sign_up.rb +0 -14
- data/spec/dummy/app/graphql/resolvers/confirm_admin_account.rb +0 -13
- data/spec/requests/mutations/resend_confirmation_spec.rb +0 -153
- data/spec/requests/mutations/send_password_reset_spec.rb +0 -103
- data/spec/requests/mutations/sign_up_spec.rb +0 -170
- data/spec/requests/mutations/update_password_spec.rb +0 -116
- data/spec/requests/queries/check_password_token_spec.rb +0 -149
- data/spec/requests/queries/confirm_account_spec.rb +0 -137
data/lib/graphql_devise.rb
CHANGED
@@ -1,13 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rails'
|
4
|
+
require 'rails/generators'
|
4
5
|
require 'graphql'
|
5
6
|
require 'devise_token_auth'
|
7
|
+
require 'zeitwerk'
|
8
|
+
|
9
|
+
if Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
|
10
|
+
GraphQL::Field.accepts_definitions(authenticate: GraphQL::Define.assign_metadata_key(:authenticate))
|
11
|
+
GraphQL::Schema::Field.accepts_definition(:authenticate)
|
12
|
+
end
|
13
|
+
|
14
|
+
loader = Zeitwerk::Loader.for_gem
|
15
|
+
|
16
|
+
loader.collapse("#{__dir__}/graphql_devise/concerns")
|
17
|
+
loader.collapse("#{__dir__}/graphql_devise/errors")
|
18
|
+
loader.collapse("#{__dir__}/generators")
|
19
|
+
|
20
|
+
loader.inflector.inflect('error_codes' => 'ERROR_CODES')
|
21
|
+
loader.inflector.inflect('supported_options' => 'SUPPORTED_OPTIONS')
|
22
|
+
|
23
|
+
loader.setup
|
6
24
|
|
7
25
|
module GraphqlDevise
|
8
26
|
class Error < StandardError; end
|
9
27
|
|
10
|
-
class InvalidMountOptionsError < GraphqlDevise::Error; end
|
28
|
+
class InvalidMountOptionsError < ::GraphqlDevise::Error; end
|
11
29
|
|
12
30
|
@schema_loaded = false
|
13
31
|
@mounted_resources = []
|
@@ -52,32 +70,6 @@ module GraphqlDevise
|
|
52
70
|
end
|
53
71
|
end
|
54
72
|
|
73
|
+
ActionDispatch::Routing::Mapper.include(GraphqlDevise::RouteMounter)
|
74
|
+
|
55
75
|
require 'graphql_devise/engine'
|
56
|
-
require 'graphql_devise/version'
|
57
|
-
require 'graphql_devise/errors/error_codes'
|
58
|
-
require 'graphql_devise/errors/execution_error'
|
59
|
-
require 'graphql_devise/errors/user_error'
|
60
|
-
require 'graphql_devise/errors/authentication_error'
|
61
|
-
require 'graphql_devise/errors/detailed_user_error'
|
62
|
-
|
63
|
-
# TODO: Remove when merged into master
|
64
|
-
require 'graphql_devise/concerns/authenticatable'
|
65
|
-
require 'graphql_devise/concerns/set_user_by_token.rb'
|
66
|
-
|
67
|
-
require 'graphql_devise/concerns/controller_methods'
|
68
|
-
require 'graphql_devise/schema'
|
69
|
-
require 'graphql_devise/types/authenticatable_type'
|
70
|
-
require 'graphql_devise/types/credential_type'
|
71
|
-
require 'graphql_devise/types/mutation_type'
|
72
|
-
require 'graphql_devise/types/query_type'
|
73
|
-
require 'graphql_devise/default_operations/mutations'
|
74
|
-
require 'graphql_devise/default_operations/resolvers'
|
75
|
-
require 'graphql_devise/resolvers/dummy'
|
76
|
-
|
77
|
-
require 'graphql_devise/mount_method/option_sanitizer'
|
78
|
-
require 'graphql_devise/mount_method/options_validator'
|
79
|
-
require 'graphql_devise/mount_method/operation_preparer'
|
80
|
-
require 'graphql_devise/mount_method/operation_sanitizer'
|
81
|
-
|
82
|
-
require 'graphql_devise/resource_loader'
|
83
|
-
require 'graphql_devise/schema_plugin'
|
@@ -15,28 +15,13 @@ module Api
|
|
15
15
|
render json: InterpreterSchema.execute(params[:query], **execute_params(params))
|
16
16
|
end
|
17
17
|
|
18
|
-
def failing_resource_name
|
19
|
-
render json: DummySchema.execute(params[:query], context: graphql_context([:user, :fail]))
|
20
|
-
end
|
21
|
-
|
22
|
-
def controller_auth
|
23
|
-
result = DummySchema.execute(
|
24
|
-
params[:query],
|
25
|
-
operation_name: params[:operationName],
|
26
|
-
variables: ensure_hash(params[:variables]),
|
27
|
-
context: gql_devise_context(SchemaUser, User)
|
28
|
-
)
|
29
|
-
|
30
|
-
render json: result unless performed?
|
31
|
-
end
|
32
|
-
|
33
18
|
private
|
34
19
|
|
35
20
|
def execute_params(item)
|
36
21
|
{
|
37
22
|
operation_name: item[:operationName],
|
38
23
|
variables: ensure_hash(item[:variables]),
|
39
|
-
context:
|
24
|
+
context: gql_devise_context(SchemaUser, User)
|
40
25
|
}
|
41
26
|
end
|
42
27
|
|
@@ -10,11 +10,7 @@ class DummySchema < GraphQL::Schema
|
|
10
10
|
User,
|
11
11
|
only: [
|
12
12
|
:login,
|
13
|
-
:
|
14
|
-
:send_password_reset,
|
15
|
-
:resend_confirmation,
|
16
|
-
:resend_confirmation_with_token,
|
17
|
-
:check_password_token
|
13
|
+
:resend_confirmation_with_token
|
18
14
|
]
|
19
15
|
),
|
20
16
|
GraphqlDevise::ResourceLoader.new(Guest, only: [:logout]),
|
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class InterpreterSchema < GraphQL::Schema
|
4
|
-
|
5
|
-
|
4
|
+
if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.9.0') && Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
|
5
|
+
use GraphQL::Execution::Interpreter
|
6
|
+
end
|
7
|
+
if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('1.10.0') && Gem::Version.new(GraphQL::VERSION) < Gem::Version.new('2.0')
|
8
|
+
use GraphQL::Analysis::AST
|
9
|
+
end
|
6
10
|
|
7
11
|
use GraphqlDevise::SchemaPlugin.new(query: Types::QueryType, authenticate_default: false)
|
8
12
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Mutations
|
4
|
-
class UpdateUser <
|
4
|
+
class UpdateUser < BaseMutation
|
5
5
|
field :user, Types::UserType, null: false
|
6
6
|
|
7
7
|
argument :email, String, required: false
|
@@ -10,10 +10,8 @@ module Mutations
|
|
10
10
|
def resolve(**attrs)
|
11
11
|
user = context[:current_resource]
|
12
12
|
|
13
|
-
schema_url = context[:controller].full_url_without_params
|
14
|
-
|
15
13
|
user.update_with_email(
|
16
|
-
attrs.merge(
|
14
|
+
attrs.merge(confirmation_url: 'https://google.com')
|
17
15
|
)
|
18
16
|
|
19
17
|
{ user: user }
|
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Types
|
4
|
-
class MutationType <
|
4
|
+
class MutationType < BaseObject
|
5
|
+
field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
|
6
|
+
|
5
7
|
field :dummy_mutation, String, null: false, authenticate: true
|
6
8
|
field :update_user, mutation: Mutations::UpdateUser
|
7
9
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Types
|
4
|
-
class QueryType <
|
4
|
+
class QueryType < BaseObject
|
5
|
+
field_class GraphqlDevise::Types::BaseField if Gem::Version.new(GraphQL::VERSION) >= Gem::Version.new('2.0')
|
6
|
+
|
5
7
|
field :user, resolver: Resolvers::UserShow
|
6
8
|
field :public_field, String, null: false, authenticate: false
|
7
9
|
field :private_field, String, null: false, authenticate: true
|
@@ -43,5 +43,5 @@ Rails.application.configure do
|
|
43
43
|
config.active_support.deprecation = :stderr
|
44
44
|
|
45
45
|
# Raises error for missing translations
|
46
|
-
config.action_view.raise_on_missing_translations = true
|
46
|
+
config.action_view.raise_on_missing_translations = true if Rails::VERSION::MAJOR < 7
|
47
47
|
end
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Rails.application.routes.draw do
|
4
|
-
mount_graphql_devise_for
|
4
|
+
mount_graphql_devise_for User, at: '/api/v1/graphql_auth', operations: {
|
5
5
|
login: Mutations::Login,
|
6
|
-
sign_up: Mutations::SignUp,
|
7
6
|
register: Mutations::Register
|
8
7
|
}, additional_mutations: {
|
9
8
|
register_confirmed_user: Mutations::RegisterConfirmedUser
|
@@ -14,22 +13,21 @@ Rails.application.routes.draw do
|
|
14
13
|
mount_graphql_devise_for(
|
15
14
|
Admin,
|
16
15
|
authenticatable_type: Types::CustomAdminType,
|
17
|
-
skip: [:
|
16
|
+
skip: [:register],
|
18
17
|
operations: {
|
19
|
-
confirm_account: Resolvers::ConfirmAdminAccount,
|
20
18
|
update_password_with_token: Mutations::ResetAdminPasswordWithToken
|
21
19
|
},
|
22
20
|
at: '/api/v1/admin/graphql_auth'
|
23
21
|
)
|
24
22
|
|
25
23
|
mount_graphql_devise_for(
|
26
|
-
|
27
|
-
only: [:login, :logout, :
|
24
|
+
Guest,
|
25
|
+
only: [:login, :logout, :register],
|
28
26
|
at: '/api/v1/guest/graphql_auth'
|
29
27
|
)
|
30
28
|
|
31
29
|
mount_graphql_devise_for(
|
32
|
-
|
30
|
+
Users::Customer,
|
33
31
|
only: [:login],
|
34
32
|
at: '/api/v1/user_customer/graphql_auth'
|
35
33
|
)
|
@@ -37,6 +35,4 @@ Rails.application.routes.draw do
|
|
37
35
|
get '/api/v1/graphql', to: 'api/v1/graphql#graphql'
|
38
36
|
post '/api/v1/graphql', to: 'api/v1/graphql#graphql'
|
39
37
|
post '/api/v1/interpreter', to: 'api/v1/graphql#interpreter'
|
40
|
-
post '/api/v1/failing', to: 'api/v1/graphql#failing_resource_name'
|
41
|
-
post '/api/v1/controller_auth', to: 'api/v1/graphql#controller_auth'
|
42
38
|
end
|
@@ -61,7 +61,7 @@ RSpec.describe GraphqlDevise::Model::WithEmailUpdater do
|
|
61
61
|
let(:resource) { create(:admin, :confirmed) }
|
62
62
|
|
63
63
|
context 'when attributes contain email' do
|
64
|
-
let(:attributes) { { email: 'new@gmail.com',
|
64
|
+
let(:attributes) { { email: 'new@gmail.com', confirmation_url: 'https://google.com' } }
|
65
65
|
|
66
66
|
it 'does not postpone email update' do
|
67
67
|
expect do
|
@@ -78,7 +78,7 @@ RSpec.describe GraphqlDevise::Model::WithEmailUpdater do
|
|
78
78
|
let(:resource) { create(:user, :confirmed) }
|
79
79
|
|
80
80
|
context 'when attributes do not contain email' do
|
81
|
-
let(:attributes) { { name: 'Updated Name',
|
81
|
+
let(:attributes) { { name: 'Updated Name', confirmation_url: 'https://google.com' } }
|
82
82
|
|
83
83
|
it 'updates resource, ignores url params' do
|
84
84
|
expect do
|
@@ -89,11 +89,15 @@ RSpec.describe GraphqlDevise::Model::WithEmailUpdater do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
context 'when attributes contain email' do
|
92
|
-
context 'when
|
93
|
-
it_behaves_like 'all required arguments are provided',
|
92
|
+
context 'when confirmation_url is used' do
|
93
|
+
it_behaves_like 'all required arguments are provided', confirmation_url: 'https://google.com'
|
94
|
+
|
95
|
+
context 'when arguments hash has strings as keys' do
|
96
|
+
it_behaves_like 'all required arguments are provided', 'confirmation_url' => 'https://google.com'
|
97
|
+
end
|
94
98
|
|
95
|
-
context 'when
|
96
|
-
let(:attributes) { { email: 'new@gmail.com', name: 'Updated Name'
|
99
|
+
context 'when confirmation_url is missing and no default is set' do
|
100
|
+
let(:attributes) { { email: 'new@gmail.com', name: 'Updated Name' } }
|
97
101
|
|
98
102
|
before { allow(DeviseTokenAuth).to receive(:default_confirm_success_url).and_return(nil) }
|
99
103
|
|
@@ -105,7 +109,7 @@ RSpec.describe GraphqlDevise::Model::WithEmailUpdater do
|
|
105
109
|
end
|
106
110
|
|
107
111
|
context 'when email will not change' do
|
108
|
-
let(:attributes) { { email: resource.email, name: 'changed'
|
112
|
+
let(:attributes) { { email: resource.email, name: 'changed' } }
|
109
113
|
|
110
114
|
it 'updates name and does not raise an error' do
|
111
115
|
expect do
|
@@ -121,37 +125,15 @@ RSpec.describe GraphqlDevise::Model::WithEmailUpdater do
|
|
121
125
|
end
|
122
126
|
end
|
123
127
|
|
124
|
-
context 'when confirm_url is used' do
|
125
|
-
it_behaves_like 'all required arguments are provided', confirmation_url: 'https://google.com'
|
126
|
-
|
127
|
-
context 'when arguments hash has strings as keys' do
|
128
|
-
it_behaves_like 'all required arguments are provided', 'confirmation_url' => 'https://google.com'
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
128
|
context 'when no confirmation url is provided is provided' do
|
133
|
-
|
134
|
-
let(:attributes) { { email: 'new@gmail.com', name: 'Updated Name', schema_url: 'http://localhost/test' } }
|
135
|
-
|
136
|
-
it 'uses DTA default_confirm_success_url on the email with redirect flow' do
|
137
|
-
expect { updater }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
138
|
-
|
139
|
-
email = ActionMailer::Base.deliveries.first
|
140
|
-
expect(email.body.decoded).to include(CGI.escape('https://google.com'))
|
141
|
-
expect(email.body.decoded).to include(CGI.escape('ConfirmAccount('))
|
142
|
-
end
|
143
|
-
end
|
129
|
+
let(:attributes) { { email: 'new@gmail.com', name: 'Updated Name' } }
|
144
130
|
|
145
|
-
|
146
|
-
|
131
|
+
it 'uses DTA default_confirm_success_url on the email and new confirmation flow' do
|
132
|
+
expect { updater }.to change(ActionMailer::Base.deliveries, :count).by(1)
|
147
133
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
email = ActionMailer::Base.deliveries.first
|
152
|
-
expect(email.body.decoded).to include(CGI.escape('https://google.com'))
|
153
|
-
expect(email.body.decoded).to include('?confirmationToken=')
|
154
|
-
end
|
134
|
+
email = ActionMailer::Base.deliveries.first
|
135
|
+
expect(email.body.decoded).to include('https://google.com')
|
136
|
+
expect(email.body.decoded).to include('?confirmationToken=')
|
155
137
|
end
|
156
138
|
end
|
157
139
|
end
|
data/spec/rails_helper.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
ENV['RAILS_ENV'] ||= 'test'
|
6
|
-
|
6
|
+
GQL_DEVISE_ROOT = File.join(File.dirname(__FILE__), '../')
|
7
7
|
|
8
8
|
require File.expand_path('dummy/config/environment.rb', __dir__)
|
9
9
|
|
@@ -16,12 +16,12 @@ require 'faker'
|
|
16
16
|
require 'generator_spec'
|
17
17
|
|
18
18
|
# Load RSpec helpers.
|
19
|
-
Dir[File.join(
|
19
|
+
Dir[File.join(GQL_DEVISE_ROOT, 'spec/support/**/*.rb')].each { |f| require f }
|
20
20
|
|
21
21
|
begin
|
22
22
|
ActiveRecord::Migrator.migrations_paths = [
|
23
|
-
File.join(
|
24
|
-
File.join(
|
23
|
+
File.join(GQL_DEVISE_ROOT, 'spec/dummy/db/migrate'),
|
24
|
+
File.join(GQL_DEVISE_ROOT, 'spec/db/migrate')
|
25
25
|
]
|
26
26
|
ActiveRecord::Migration.maintain_test_schema!
|
27
27
|
rescue ActiveRecord::PendingMigrationError => e
|
@@ -29,7 +29,7 @@ rescue ActiveRecord::PendingMigrationError => e
|
|
29
29
|
exit 1
|
30
30
|
end
|
31
31
|
RSpec.configure do |config|
|
32
|
-
config.fixture_path = "#{
|
32
|
+
config.fixture_path = "#{GQL_DEVISE_ROOT}/spec/fixtures"
|
33
33
|
|
34
34
|
config.use_transactional_fixtures = true
|
35
35
|
|
@@ -105,9 +105,8 @@ RSpec.describe 'Resend confirmation with token' do
|
|
105
105
|
|
106
106
|
before do
|
107
107
|
user.update_with_email(
|
108
|
-
email:
|
109
|
-
|
110
|
-
confirmation_success_url: 'https://google.com'
|
108
|
+
email: new_email,
|
109
|
+
confirmation_url: 'https://google.com'
|
111
110
|
)
|
112
111
|
end
|
113
112
|
|
@@ -50,22 +50,6 @@ RSpec.describe "Integrations with the user's controller" do
|
|
50
50
|
GRAPHQL
|
51
51
|
end
|
52
52
|
|
53
|
-
context 'when authenticating before using the GQL schema' do
|
54
|
-
before { post_request('/api/v1/controller_auth') }
|
55
|
-
|
56
|
-
context 'when user is authenticated' do
|
57
|
-
let(:headers) { create(:schema_user).create_new_auth_token }
|
58
|
-
|
59
|
-
it 'allows authentication at the controller level' do
|
60
|
-
expect(json_response[:data][:privateField]).to eq('Field will always require authentication')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'when user is not authenticated' do
|
65
|
-
it_behaves_like 'returns a must authenticate error', 'privateField'
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
53
|
context 'when using a regular schema' do
|
70
54
|
before { post_request('/api/v1/graphql') }
|
71
55
|
|
@@ -88,15 +72,6 @@ RSpec.describe "Integrations with the user's controller" do
|
|
88
72
|
context 'when user is not authenticated' do
|
89
73
|
it_behaves_like 'returns a must authenticate error', 'privateField'
|
90
74
|
end
|
91
|
-
|
92
|
-
context 'when using the failing route' do
|
93
|
-
it 'raises an invalid resource_name error' do
|
94
|
-
expect { post_request('/api/v1/failing') }.to raise_error(
|
95
|
-
GraphqlDevise::Error,
|
96
|
-
'Invalid resource_name `fail` provided to `graphql_context`. Possible values are: [:user, :admin, :guest, :users_customer, :schema_user].'
|
97
|
-
)
|
98
|
-
end
|
99
|
-
end
|
100
75
|
end
|
101
76
|
|
102
77
|
context 'when using an interpreter schema' do
|
@@ -245,14 +220,7 @@ RSpec.describe "Integrations with the user's controller" do
|
|
245
220
|
|
246
221
|
email = Nokogiri::HTML(ActionMailer::Base.deliveries.last.body.encoded)
|
247
222
|
link = email.css('a').first
|
248
|
-
expect(link['href']).to include('
|
249
|
-
|
250
|
-
expect do
|
251
|
-
get link['href']
|
252
|
-
user.reload
|
253
|
-
end.to change(user, :email).from(original_email).to('updated@gmail.com').and(
|
254
|
-
change(user, :uid).from(original_email).to('updated@gmail.com')
|
255
|
-
)
|
223
|
+
expect(link['href']).to include('https://google.com')
|
256
224
|
end
|
257
225
|
end
|
258
226
|
|
@@ -10,8 +10,8 @@ RSpec.describe GraphqlDevise::ResourceLoader do
|
|
10
10
|
let(:mutation) { class_double(GraphQL::Schema::Object) }
|
11
11
|
let(:routing) { false }
|
12
12
|
let(:mounted) { false }
|
13
|
-
let(:resource) {
|
14
|
-
let(:options) { { only: [:login, :
|
13
|
+
let(:resource) { User }
|
14
|
+
let(:options) { { only: [:login], additional_queries: { public_user: Class.new(GraphQL::Schema::Resolver) } } }
|
15
15
|
|
16
16
|
before do
|
17
17
|
allow(GraphqlDevise).to receive(:add_mapping).with(:user, resource)
|
@@ -20,7 +20,7 @@ RSpec.describe GraphqlDevise::ResourceLoader do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'loads operations into the provided types' do
|
23
|
-
expect(query).to receive(:field).with(:
|
23
|
+
expect(query).to receive(:field).with(:public_user, resolver: instance_of(Class), authenticate: false)
|
24
24
|
expect(mutation).to receive(:field).with(:user_login, mutation: instance_of(Class), authenticate: false)
|
25
25
|
expect(GraphqlDevise).to receive(:add_mapping).with(:user, resource)
|
26
26
|
expect(GraphqlDevise).not_to receive(:mount_resource)
|
@@ -30,6 +30,17 @@ RSpec.describe GraphqlDevise::ResourceLoader do
|
|
30
30
|
expect(returned).to be_a(Struct)
|
31
31
|
end
|
32
32
|
|
33
|
+
context 'when resource is not class' do
|
34
|
+
let(:resource) { 'User' }
|
35
|
+
|
36
|
+
it 'raises an error' do
|
37
|
+
expect { loader }.to raise_error(
|
38
|
+
GraphqlDevise::Error,
|
39
|
+
'A class must be provided when mounting a model. String values are no longer supported.'
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
33
44
|
context 'when mutation is nil' do
|
34
45
|
let(:mutation) { nil }
|
35
46
|
|