Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions lib/shopify_custom_data_graphql/prepared_query.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
module ShopifyCustomDataGraphQL
class PreparedQuery
DEFAULT_TRACER = Tracer.new
EMPTY_HASH= {}

class Result
attr_reader :query, :tracer, :result
Expand All @@ -22,14 +23,12 @@ def to_h

def initialize(params)
@query = params["query"]
@transforms = params["transforms"]

unless @query && @transforms
raise ArgumentError, "PreparedQuery requires params `query` and `transforms`"
end
@transforms = params["transforms"] || EMPTY_HASH
end

def as_json
return EMPTY_HASH if base_query?

{
"query" => @query,
"transforms" => @transforms,
Expand All @@ -41,7 +40,9 @@ def to_json
end

def perform(tracer = DEFAULT_TRACER, source_query: nil)
query = source_query && @transforms.none? ? source_query : @query
query = source_query && base_query? ? source_query : @query
raise ArgumentError, "A source_query is required with empty transformations" if query.nil?

raw_result = tracer.span("proxy") { yield(query) }

result = if @transforms.any?
Expand All @@ -54,5 +55,11 @@ def perform(tracer = DEFAULT_TRACER, source_query: nil)

Result.new(query: query, tracer: tracer, result: result)
end

private

def base_query?
@transforms.none?
end
end
end
63 changes: 63 additions & 0 deletions test/shopify_custom_data_graphql/prepared_query_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# frozen_string_literal: true

require "test_helper"

describe "PreparedQuery" do
def setup
@query = "{ product { id extensions { toggle } } }"
@transformed_query = %|{ product { id ___extensions_boolean: metafield(key: "toggle") { jsonValue } } }|
@transforms = { "f" => { "extensions" => { "fx" => { "t" => "custom_scope" } } } }
end

def test_builds_from_and_serializes_to_json
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
"query" => @query,
"transforms" => @transforms,
})

expected = {
"query" => @query,
"transforms" => @transforms,
}

assert_equal expected, prepared_query.as_json
end

def test_omits_query_when_transforms_are_empty
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
"query" => @query,
"transforms" => {},
})

expected = {}

assert_equal expected, prepared_query.as_json
end

def test_performs_transformed_query_when_available
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
"query" => @transformed_query,
"transforms" => @transforms,
})

prepared_query.perform(source_query: @query) do |query|
assert_equal @transformed_query, query
{ "product" => { "id" => "1", "___extensions_boolean" => { "jsonValue" => true } } }
end
end

def test_performs_source_query_when_not_transformed
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({})

prepared_query.perform(source_query: @query) do |query|
assert_equal @query, query
{ "product" => { "id" => "1" } }
end
end

def test_raises_for_empty_prepared_query_with_source_query
assert_raises(ArgumentError) do
ShopifyCustomDataGraphQL::PreparedQuery.new({}).perform(source_query: nil)
end
end
end
14 changes: 14 additions & 0 deletions test/shopify_custom_data_graphql/request_transformer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,20 @@
require "test_helper"

describe "RequestTransformer" do
def test_requests_with_no_custom_data_have_no_transforms
expected_query = %|query {
product(id: "1") {
title
}
}|

expected_transforms = {}
result = transform_request(expected_query)

assert_equal expected_query.squish, result.query.squish
assert_equal expected_transforms, result.transforms
end

def test_transforms_extensions_scalar_fields
result = transform_request(%|query {
product(id: "1") {
Expand Down