Skip to content

Commit

Permalink
More refactor on operation preparer
Browse files Browse the repository at this point in the history
  • Loading branch information
mcelicalderon committed Apr 11, 2020
1 parent cd29258 commit d9c0918
Show file tree
Hide file tree
Showing 18 changed files with 291 additions and 178 deletions.
2 changes: 0 additions & 2 deletions lib/graphql_devise.rb
Expand Up @@ -26,6 +26,4 @@ class InvalidMountOptionsError < GraphqlDevise::Error; end
require 'graphql_devise/mount_method/option_sanitizer'
require 'graphql_devise/mount_method/options_validator'
require 'graphql_devise/mount_method/operation_preparer'
require 'graphql_devise/mount_method/queries_preparer'
require 'graphql_devise/mount_method/mutations_preparer'
require 'graphql_devise/mount_method/operation_sanitizer'
27 changes: 0 additions & 27 deletions lib/graphql_devise/mount_method/mutations_preparer.rb

This file was deleted.

41 changes: 20 additions & 21 deletions lib/graphql_devise/mount_method/operation_preparer.rb
@@ -1,38 +1,37 @@
require_relative 'operation_preparers/default_operation_creator'
require_relative 'operation_preparers/gql_name_setter'
require_relative 'operation_preparers/mutation_field_setter'
require_relative 'operation_preparers/resolver_type_setter'
require_relative 'operation_preparers/resource_name_setter'
require_relative 'operation_preparers/default_operation_preparer'
require_relative 'operation_preparers/custom_operation_preparer'

module GraphqlDevise
module MountMethod
class OperationPreparer
def initialize(resource:, selected_operations:, preparer:, custom:, additional_operations:)
@selected_operations = selected_operations
@preparer = preparer
@mapping_name = resource.underscore.tr('/', '_')
@custom = custom
@selected_operations = selected_operations
@preparer = preparer
@mapping_name = resource.underscore.tr('/', '_')
@custom = custom
@additional_operations = additional_operations
end

def call
default_operations = @selected_operations.except(*@custom.keys).each_with_object({}) do |(action, operation), result|
mapped_action = "#{@mapping_name}_#{action}"

prepared_operation = OperationPreparers::DefaultOperationCreator.new(operation, mapped_action.to_s.camelize(:upper)).call
prepared_operation = @preparer.call(prepared_operation)
prepared_operation = OperationPreparers::ResourceNameSetter.new(prepared_operation, @mapping_name).call

result[mapped_action.to_sym] = prepared_operation
end

custom_operations = @custom.slice(*@selected_operations.keys).each_with_object({}) do |(action, operation), result|
mapped_action = "#{@mapping_name}_#{action}"

result[mapped_action.to_sym] = OperationPreparers::ResourceNameSetter.new(operation, @mapping_name).call
end
default_operations = OperationPreparers::DefaultOperationPreparer.new(
selected_operations: @selected_operations,
custom_keys: @custom.keys,
mapping_name: @mapping_name,
preparer: @preparer
).call

custom_operations = OperationPreparers::CustomOperationPreparer.new(
selected_keys: @selected_operations.keys,
custom_operations: @custom,
mapping_name: @mapping_name
).call

additional_operations = @additional_operations.each_with_object({}) do |(action, operation), result|
result[action] = OperationPreparers::ResourceNameSetter.new(operation, @mapping_name).call
result[action] = OperationPreparers::ResourceNameSetter.new(@mapping_name).call(operation)
end

default_operations.merge(custom_operations).merge(additional_operations)
Expand Down
@@ -0,0 +1,24 @@
module GraphqlDevise
module MountMethod
module OperationPreparers
class CustomOperationPreparer
def initialize(selected_keys:, custom_operations:, mapping_name:)
@selected_keys = selected_keys
@custom_operations = custom_operations
@mapping_name = mapping_name
end

def call
@custom_operations.slice(*@selected_keys).each_with_object({}) do |(action, operation), result|
mapped_action = "#{@mapping_name}_#{action}"

result[mapped_action.to_sym] = [
OperationPreparers::GqlNameSetter.new(mapped_action),
OperationPreparers::ResourceNameSetter.new(@mapping_name)
].reduce(operation) { |prepared_operation, preparer| preparer.call(prepared_operation) }
end
end
end
end
end
end

This file was deleted.

@@ -0,0 +1,32 @@
module GraphqlDevise
module MountMethod
module OperationPreparers
class DefaultOperationPreparer
def initialize(selected_operations:, custom_keys:, mapping_name:, preparer:)
@selected_operations = selected_operations
@custom_keys = custom_keys
@mapping_name = mapping_name
@preparer = preparer
end

def call
@selected_operations.except(*@custom_keys).each_with_object({}) do |(action, operation), result|
mapped_action = "#{@mapping_name}_#{action}"

result[mapped_action.to_sym] = [
OperationPreparers::GqlNameSetter.new(mapped_action),
@preparer,
OperationPreparers::ResourceNameSetter.new(@mapping_name)
].reduce(child_class(operation)) { |prepared_operation, preparer| preparer.call(prepared_operation) }
end
end

private

def child_class(operation)
Class.new(operation)
end
end
end
end
end
@@ -0,0 +1,23 @@
module GraphqlDevise
module MountMethod
module OperationPreparers
class GqlNameSetter
def initialize(mapping_name)
@mapping_name = mapping_name
end

def call(operation)
operation.graphql_name(graphql_name)

operation
end

private

def graphql_name
@mapping_name.camelize(:upper)
end
end
end
end
end
Expand Up @@ -2,15 +2,14 @@ module GraphqlDevise
module MountMethod
module OperationPreparers
class ResourceNameSetter
def initialize(operation, name)
@operation = operation
@name = name
def initialize(name)
@name = name
end

def call
@operation.instance_variable_set(:@resource_name, @name.to_sym)
def call(operation)
operation.instance_variable_set(:@resource_name, @name.to_sym)

@operation
operation
end
end
end
Expand Down
27 changes: 0 additions & 27 deletions lib/graphql_devise/mount_method/queries_preparer.rb

This file was deleted.

38 changes: 0 additions & 38 deletions spec/services/mount_method/mutations_preparer_spec.rb

This file was deleted.

23 changes: 22 additions & 1 deletion spec/services/mount_method/operation_preparer_spec.rb
Expand Up @@ -2,8 +2,29 @@

RSpec.describe GraphqlDevise::MountMethod::OperationPreparer do
describe '#call' do
subject { described_class.new(default_operations: default_operations).call }
subject(:prepared_operations) do
described_class.new(
resource: resource,
selected_operations: selected,
preparer: preparer,
custom: custom,
additional_operations: additional
).call
end

let(:logout_class) { Class.new(GraphQL::Schema::Resolver) }
let(:resource) { 'User' }
let(:selected) { { login: double(:login_default), logout: logout_class } }
let(:preparer) { double(:preparer, call: logout_class) }
let(:custom) { { login: double(:custom_login, graphql_name: nil) } }
let(:additional) { { user_additional: double(:user_additional) } }

it 'is expected to return all provided operation keys' do
expect(prepared_operations.keys).to contain_exactly(
:user_login,
:user_logout,
:user_additional
)
end
end
end
@@ -0,0 +1,43 @@
require 'spec_helper'

RSpec.describe GraphqlDevise::MountMethod::OperationPreparers::CustomOperationPreparer do
describe '#call' do
subject(:prepared) { described_class.new(selected_keys: selected_keys, custom_operations: operations, mapping_name: mapping_name).call }

let(:login_operation) { double(:confirm_operation, graphql_name: nil) }
let(:logout_operation) { double(:sign_up_operation, graphql_name: nil) }
let(:mapping_name) { 'user' }
let(:operations) { { login: login_operation, logout: logout_operation, invalid: double(:invalid) } }
let(:selected_keys) { [:login, :logout, :sign_up, :confirm] }

it 'returns only those operations with no custom operation provided' do
expect(prepared.keys).to contain_exactly(:user_login, :user_logout)
end

it 'prepares custom operations' do
expect(login_operation).to receive(:graphql_name).with('UserLogin')
expect(logout_operation).to receive(:graphql_name).with('UserLogout')

prepared

expect(login_operation.instance_variable_get(:@resource_name)).to eq(:user)
expect(logout_operation.instance_variable_get(:@resource_name)).to eq(:user)
end

context 'when no selected keys are provided' do
let(:selected_keys) { [] }

it 'returns no operations' do
expect(prepared).to eq({})
end
end

context 'when no custom operations are provided' do
let(:operations) { {} }

it 'returns no operations' do
expect(prepared).to eq({})
end
end
end
end

0 comments on commit d9c0918

Please sign in to comment.