Skip to content

Commit 5ff3a54

Browse files
authored
Handle empty prepared queries
2 parents 163f991 + 448ca52 commit 5ff3a54

File tree

3 files changed

+90
-6
lines changed

3 files changed

+90
-6
lines changed

lib/shopify_custom_data_graphql/prepared_query.rb

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module ShopifyCustomDataGraphQL
44
class PreparedQuery
55
DEFAULT_TRACER = Tracer.new
6+
EMPTY_HASH= {}
67

78
class Result
89
attr_reader :query, :tracer, :result
@@ -22,14 +23,12 @@ def to_h
2223

2324
def initialize(params)
2425
@query = params["query"]
25-
@transforms = params["transforms"]
26-
27-
unless @query && @transforms
28-
raise ArgumentError, "PreparedQuery requires params `query` and `transforms`"
29-
end
26+
@transforms = params["transforms"] || EMPTY_HASH
3027
end
3128

3229
def as_json
30+
return EMPTY_HASH if base_query?
31+
3332
{
3433
"query" => @query,
3534
"transforms" => @transforms,
@@ -41,7 +40,9 @@ def to_json
4140
end
4241

4342
def perform(tracer = DEFAULT_TRACER, source_query: nil)
44-
query = source_query && @transforms.none? ? source_query : @query
43+
query = source_query && base_query? ? source_query : @query
44+
raise ArgumentError, "A source_query is required with empty transformations" if query.nil?
45+
4546
raw_result = tracer.span("proxy") { yield(query) }
4647

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

5556
Result.new(query: query, tracer: tracer, result: result)
5657
end
58+
59+
private
60+
61+
def base_query?
62+
@transforms.none?
63+
end
5764
end
5865
end
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
describe "PreparedQuery" do
6+
def setup
7+
@query = "{ product { id extensions { toggle } } }"
8+
@transformed_query = %|{ product { id ___extensions_boolean: metafield(key: "toggle") { jsonValue } } }|
9+
@transforms = { "f" => { "extensions" => { "fx" => { "t" => "custom_scope" } } } }
10+
end
11+
12+
def test_builds_from_and_serializes_to_json
13+
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
14+
"query" => @query,
15+
"transforms" => @transforms,
16+
})
17+
18+
expected = {
19+
"query" => @query,
20+
"transforms" => @transforms,
21+
}
22+
23+
assert_equal expected, prepared_query.as_json
24+
end
25+
26+
def test_omits_query_when_transforms_are_empty
27+
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
28+
"query" => @query,
29+
"transforms" => {},
30+
})
31+
32+
expected = {}
33+
34+
assert_equal expected, prepared_query.as_json
35+
end
36+
37+
def test_performs_transformed_query_when_available
38+
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({
39+
"query" => @transformed_query,
40+
"transforms" => @transforms,
41+
})
42+
43+
prepared_query.perform(source_query: @query) do |query|
44+
assert_equal @transformed_query, query
45+
{ "product" => { "id" => "1", "___extensions_boolean" => { "jsonValue" => true } } }
46+
end
47+
end
48+
49+
def test_performs_source_query_when_not_transformed
50+
prepared_query = ShopifyCustomDataGraphQL::PreparedQuery.new({})
51+
52+
prepared_query.perform(source_query: @query) do |query|
53+
assert_equal @query, query
54+
{ "product" => { "id" => "1" } }
55+
end
56+
end
57+
58+
def test_raises_for_empty_prepared_query_with_source_query
59+
assert_raises(ArgumentError) do
60+
ShopifyCustomDataGraphQL::PreparedQuery.new({}).perform(source_query: nil)
61+
end
62+
end
63+
end

test/shopify_custom_data_graphql/request_transformer_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33
require "test_helper"
44

55
describe "RequestTransformer" do
6+
def test_requests_with_no_custom_data_have_no_transforms
7+
expected_query = %|query {
8+
product(id: "1") {
9+
title
10+
}
11+
}|
12+
13+
expected_transforms = {}
14+
result = transform_request(expected_query)
15+
16+
assert_equal expected_query.squish, result.query.squish
17+
assert_equal expected_transforms, result.transforms
18+
end
19+
620
def test_transforms_extensions_scalar_fields
721
result = transform_request(%|query {
822
product(id: "1") {

0 commit comments

Comments
 (0)