add createUser mutation

This commit is contained in:
João Geonizeli
2021-08-04 23:06:28 -03:00
parent 30b290514f
commit 964ae85d46
12 changed files with 121 additions and 7 deletions

View File

@@ -10,3 +10,9 @@ AllCops:
Exclude: Exclude:
- db/schema.rb - db/schema.rb
- bin/**/* - bin/**/*
RSpec/ExampleLength:
Enabled: false
RSpec/MultipleExpectations:
Enabled: false

View File

@@ -48,4 +48,5 @@ end
group :test do group :test do
gem "shoulda-matchers", "~> 5.0" gem "shoulda-matchers", "~> 5.0"
gem "rspec-graphql_matchers", "~> 1.3"
end end

View File

@@ -233,6 +233,8 @@ GEM
rspec-expectations (3.10.1) rspec-expectations (3.10.1)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0) rspec-support (~> 3.10.0)
rspec-graphql_matchers (1.3.0)
graphql (>= 1.8, < 2.0)
rspec-mocks (3.10.2) rspec-mocks (3.10.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.10.0) rspec-support (~> 3.10.0)
@@ -343,6 +345,7 @@ DEPENDENCIES
puma (~> 5.0) puma (~> 5.0)
pundit pundit
rails (~> 6.1.4) rails (~> 6.1.4)
rspec-graphql_matchers (~> 1.3)
rspec-rails rspec-rails
rubocop-rails rubocop-rails
rubocop-rspec rubocop-rspec

View File

@@ -9,8 +9,8 @@ class GraphqlController < ApplicationController
query = params[:query] query = params[:query]
operation_name = params[:operationName] operation_name = params[:operationName]
context = { context = {
current_user: current_admin_user, # || current_auth.current_user,
current_auth: current_auth, current_auth: current_auth,
current_user: current_admin_user, # || current_auth.current_user,
} }
result = XStakeSchema.execute(query, variables: variables, context: context, operation_name: operation_name) result = XStakeSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
render(json: result) render(json: result)

View File

@@ -0,0 +1,9 @@
# frozen_string_literal: true
module Inputs
class UserAttributesInput < Types::BaseInputObject
graphql_name "UserAttributesInput"
argument :first_name, String, required: true
argument :last_name, String, required: true
end
end

View File

@@ -5,5 +5,9 @@ module Mutations
field_class Types::BaseField field_class Types::BaseField
input_object_class Types::BaseInputObject input_object_class Types::BaseInputObject
object_class Types::BaseObject object_class Types::BaseObject
field :errors, [String],
null: true,
description: "Errors encountered during execution of the mutation."
end end
end end

View File

@@ -0,0 +1,16 @@
# frozen_string_literal: true
module Mutations
class CreateUser < BaseMutation
field :success, Boolean, null: false
argument :user, Inputs::UserAttributesInput, required: true
def resolve(user:)
User.create!({ **user, email: context[:current_auth].email })
{ success: true }
rescue ActiveRecord::RecordInvalid => e
{ success: false, errors: [e.message] }
end
end
end

View File

@@ -1,11 +1,6 @@
# frozen_string_literal: true # frozen_string_literal: true
module Types module Types
class MutationType < Types::BaseObject class MutationType < Types::BaseObject
# TODO: remove me field :create_user, mutation: Mutations::CreateUser
field :test_field, String, null: false,
description: "An example field added by the generator"
def test_field
"Hello World"
end
end end
end end

View File

@@ -19,6 +19,7 @@ class User < ApplicationRecord
has_many :documents, class_name: "UserDocument", dependent: :destroy has_many :documents, class_name: "UserDocument", dependent: :destroy
validates :first_name, :last_name, :email, presence: true validates :first_name, :last_name, :email, presence: true
validates :email, uniqueness: true
def full_name def full_name
"#{first_name} #{last_name}" "#{first_name} #{last_name}"

View File

@@ -8,6 +8,8 @@ module Auth
end end
def profile def profile
return nil if jwt_token.blank?
Auth0Client.find_profile(jwt_token) Auth0Client.find_profile(jwt_token)
end end
end end

View File

@@ -0,0 +1,11 @@
# frozen_string_literal: true
require "rails_helper"
RSpec.describe(Inputs::UserAttributesInput) do
subject { described_class }
describe "arguments" do
it { is_expected.to(accept_argument(:first_name).of_type("String!")) }
it { is_expected.to(accept_argument(:last_name).of_type("String!")) }
end
end

View File

@@ -0,0 +1,66 @@
# frozen_string_literal: true
require "rails_helper"
RSpec.describe(Mutations::CreateUser) do
describe "#resolve" do
let(:mutation_string) do
<<~GQL
mutation($input: CreateUserInput!) {
createUser(input: $input) {
success
errors
}
}
GQL
end
let(:context) do
{
current_auth: Auth::Profile.new({
id: "_",
email: "user@example.com",
}),
}
end
let(:variables) do
{
input: { user: {
firstName: "First Name",
lastName: "Last Name",
} },
}
end
context "when current_auth is not being used by any user" do
it "create a user to auth" do
result = XStakeSchema.execute(
mutation_string,
variables: variables,
context: context
).to_h
expect(result["data"]["createUser"]["success"]).to(eq(true))
end
end
context "when auth is being used by no users" do
it "returns error" do
User.create(
first_name: "First Name",
last_name: "Last Name",
email: "user@example.com"
)
result = XStakeSchema.execute(
mutation_string,
variables: variables,
context: context
).to_h
expect(result["data"]["createUser"]["success"]).to(eq(false))
expect(result["data"]["createUser"]["errors"]).to(eq(["Validation failed: Email has already been taken"]))
end
end
end
end