diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index fa498afc..5a1fde91 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -38,7 +38,6 @@ config.include(Requests::JsonHelpers, type: :request) config.include(Requests::AuthHelpers, type: :request) config.include(ActiveSupport::Testing::TimeHelpers) - config.include(Generators::FileHelpers, type: :generator) config.before(:suite) do ActionController::Base.allow_forgery_protection = true diff --git a/spec/requests/graphql_controller_spec.rb b/spec/requests/graphql_controller_spec.rb new file mode 100644 index 00000000..53fadf10 --- /dev/null +++ b/spec/requests/graphql_controller_spec.rb @@ -0,0 +1,80 @@ +require 'rails_helper' + +RSpec.describe GraphqlDevise::GraphqlController do + let(:password) { 'password123' } + let(:user) { create(:user, :confirmed, password: password) } + let(:params) { { query: query, variables: variables } } + let(:request_params) do + if Rails::VERSION::MAJOR >= 5 + { params: params } + else + params + end + end + + context 'when variables are a string' do + let(:variables) { "{\"email\": \"#{user.email}\"}" } + let(:query) { "mutation($email: String!) { userLogin(email: $email, password: \"#{password}\") { user { email name signInCount } } }" } + + it 'parses the string variables' do + post '/api/v1/graphql_auth', request_params + + expect(json_response).to match( + data: { userLogin: { user: { email: user.email, name: user.name, signInCount: 1 } } } + ) + end + + context 'when variables is an empty string' do + let(:variables) { '' } + let(:query) { "mutation { userLogin(email: \"#{user.email}\", password: \"#{password}\") { user { email name signInCount } } }" } + + it 'returns an empty hash as variables' do + post '/api/v1/graphql_auth', request_params + + expect(json_response).to match( + data: { userLogin: { user: { email: user.email, name: user.name, signInCount: 1 } } } + ) + end + end + end + + context 'when variables are not a string or hash' do + let(:variables) { 1 } + let(:query) { "mutation($email: String!) { userLogin(email: $email, password: \"#{password}\") { user { email name signInCount } } }" } + + it 'raises an error' do + expect do + post '/api/v1/graphql_auth', request_params + end.to raise_error(ArgumentError) + end + end + + context 'when multiplexing queries' do + let(:params) do + { + _json: [ + { query: "mutation { userLogin(email: \"#{user.email}\", password: \"#{password}\") { user { email name signInCount } } }" }, + { query: "mutation { userLogin(email: \"#{user.email}\", password: \"wrong password\") { user { email name signInCount } } }" } + ] + } + end + + it 'executes multiple queries in the same request' do + post '/api/v1/graphql_auth', request_params + + expect(json_response).to match( + [ + { data: { userLogin: { user: { email: user.email, name: user.name, signInCount: 1 } } } }, + { + data: { userLogin: nil }, + errors: [ + hash_including( + message: 'Invalid login credentials. Please try again.', extensions: { code: 'USER_ERROR' } + ) + ] + } + ] + ) + end + end +end diff --git a/spec/support/generators/file_helpers.rb b/spec/support/generators/file_helpers.rb deleted file mode 100644 index 84a8f0be..00000000 --- a/spec/support/generators/file_helpers.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'fileutils' - -module Generators - module FileHelpers - def create_file_with_content(path, content) - FileUtils.mkdir(File.dirname(path)) - File.open(path, 'w') do |f| - f.write(content) - end - end - end -end