Skip to content

Commit ef45044

Browse files
authored
Merge pull request #149 from graphql-devise/allow_setting_resources_directly_into_schema_during_tests
Allow setting current resource in tests
2 parents 5e4b908 + ab716ff commit ef45044

4 files changed

Lines changed: 153 additions & 19 deletions

File tree

lib/graphql_devise/schema_plugin.rb

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@ def trace(event, trace_data)
2424
# Authenticate only root level queries
2525
return yield unless event == 'execute_field' && path(trace_data).count == 1
2626

27-
field = traced_field(trace_data)
28-
provided_value = authenticate_option(field, trace_data)
29-
context = set_current_resource(context_from_data(trace_data))
27+
field = traced_field(trace_data)
28+
auth_required = authenticate_option(field, trace_data)
29+
context = context_from_data(trace_data)
3030

31-
if !provided_value.nil?
32-
raise_on_missing_resource(context, field) if provided_value
33-
elsif @authenticate_default
31+
if auth_required
32+
context = set_current_resource(context)
3433
raise_on_missing_resource(context, field)
3534
end
3635

@@ -40,9 +39,10 @@ def trace(event, trace_data)
4039
private
4140

4241
def set_current_resource(context)
43-
controller = context[:controller]
44-
resource_names = Array(context[:resource_name])
45-
context[:current_resource] = resource_names.find do |resource_name|
42+
controller = context[:controller]
43+
resource_names = Array(context[:resource_name])
44+
45+
context[:current_resource] ||= resource_names.find do |resource_name|
4646
unless Devise.mappings.key?(resource_name)
4747
raise(
4848
GraphqlDevise::Error,
@@ -88,11 +88,13 @@ def traced_field(trace_data)
8888
end
8989

9090
def authenticate_option(field, trace_data)
91-
if trace_data[:context]
91+
auth_required = if trace_data[:context]
9292
field.metadata[:authenticate]
9393
else
9494
field.graphql_definition.metadata[:authenticate]
9595
end
96+
97+
auth_required.nil? ? @authenticate_default : auth_required
9698
end
9799

98100
def reconfigure_warden!

spec/graphql/user_queries_spec.rb

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
# frozen_string_literal: true
2+
3+
require 'rails_helper'
4+
5+
RSpec.describe 'Users controller specs' do
6+
include_context 'with graphql schema test'
7+
8+
let(:schema) { DummySchema }
9+
let(:user) { create(:user, :confirmed) }
10+
let(:field) { 'privateField' }
11+
let(:public_message) { 'Field does not require authentication' }
12+
let(:private_message) { 'Field will always require authentication' }
13+
let(:private_error) do
14+
{
15+
message: "#{field} field requires authentication",
16+
extensions: { code: 'AUTHENTICATION_ERROR' }
17+
}
18+
end
19+
20+
describe 'publicField' do
21+
let(:query) do
22+
<<-GRAPHQL
23+
query {
24+
publicField
25+
}
26+
GRAPHQL
27+
end
28+
29+
context 'when using a regular schema' do
30+
it 'does not require authentication' do
31+
expect(response[:data][:publicField]).to eq(public_message)
32+
end
33+
end
34+
end
35+
36+
describe 'privateField' do
37+
let(:query) do
38+
<<-GRAPHQL
39+
query {
40+
privateField
41+
}
42+
GRAPHQL
43+
end
44+
45+
context 'when using a regular schema' do
46+
context 'when user is authenticated' do
47+
let(:resource) { user }
48+
49+
it 'allows to perform the query' do
50+
expect(response[:data][:privateField]).to eq(private_message)
51+
end
52+
53+
context 'when using a SchemaUser' do
54+
let(:resource) { create(:schema_user, :confirmed) }
55+
56+
it 'allows to perform the query' do
57+
expect(response[:data][:privateField]).to eq(private_message)
58+
end
59+
end
60+
end
61+
end
62+
63+
context 'when using an interpreter schema' do
64+
let(:schema) { InterpreterSchema }
65+
66+
context 'when user is authenticated' do
67+
let(:resource) { user }
68+
69+
it 'allows to perform the query' do
70+
expect(response[:data][:privateField]).to eq(private_message)
71+
end
72+
end
73+
end
74+
end
75+
76+
describe 'user' do
77+
let(:user_data) { { email: user.email, id: user.id } }
78+
let(:query) do
79+
<<-GRAPHQL
80+
query {
81+
user(id: #{user.id}) {
82+
id
83+
email
84+
}
85+
}
86+
GRAPHQL
87+
end
88+
89+
context 'when using a regular schema' do
90+
context 'when user is authenticated' do
91+
let(:resource) { user }
92+
93+
it 'allows to perform the query' do
94+
expect(response[:data][:user]).to match(**user_data)
95+
end
96+
end
97+
end
98+
99+
context 'when using an interpreter schema' do
100+
let(:schema) { InterpreterSchema }
101+
102+
context 'when user is authenticated' do
103+
let(:resource) { user }
104+
105+
it 'allows to perform the query' do
106+
expect(response[:data][:user]).to match(**user_data)
107+
end
108+
end
109+
110+
context 'when user is not authenticated' do
111+
# Interpreter schema fields are public unless specified otherwise (plugin setting)
112+
it 'allows to perform the query' do
113+
expect(response[:data][:user]).to match(**user_data)
114+
end
115+
end
116+
end
117+
end
118+
end

spec/requests/user_controller_spec.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,6 @@
3131
expect(json_response[:data][:publicField]).to eq('Field does not require authentication')
3232
end
3333
end
34-
35-
context 'when using the failing route' do
36-
it 'raises an invalid resource_name error' do
37-
expect { post_request('/api/v1/failing') }.to raise_error(
38-
GraphqlDevise::Error,
39-
'Invalid resource_name `fail` provided to `graphql_context`. Possible values are: [:user, :admin, :guest, :users_customer, :schema_user].'
40-
)
41-
end
42-
end
4334
end
4435

4536
describe 'privateField' do
@@ -77,6 +68,15 @@
7768
)
7869
end
7970
end
71+
72+
context 'when using the failing route' do
73+
it 'raises an invalid resource_name error' do
74+
expect { post_request('/api/v1/failing') }.to raise_error(
75+
GraphqlDevise::Error,
76+
'Invalid resource_name `fail` provided to `graphql_context`. Possible values are: [:user, :admin, :guest, :users_customer, :schema_user].'
77+
)
78+
end
79+
end
8080
end
8181

8282
context 'when using an interpreter schema' do
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# frozen_string_literal: true
2+
3+
RSpec.shared_context 'with graphql schema test' do
4+
let(:variables) { {} }
5+
let(:resource_names) { [:user] }
6+
let(:resource) { nil }
7+
let(:controller) { instance_double(GraphqlDevise::GraphqlController) }
8+
let(:context) do
9+
{ current_resource: resource, controller: controller, resource_name: resource_names }
10+
end
11+
let(:response) do
12+
schema.execute(query, context: context, variables: variables).deep_symbolize_keys
13+
end
14+
end

0 commit comments

Comments
 (0)