diff --git a/lib/shopify_custom_data_graphql/prepared_query.rb b/lib/shopify_custom_data_graphql/prepared_query.rb index 304d5aa..70ce2d5 100644 --- a/lib/shopify_custom_data_graphql/prepared_query.rb +++ b/lib/shopify_custom_data_graphql/prepared_query.rb @@ -3,6 +3,7 @@ module ShopifyCustomDataGraphQL class PreparedQuery DEFAULT_TRACER = Tracer.new + EMPTY_HASH= {} class Result attr_reader :query, :tracer, :result @@ -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, @@ -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? @@ -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 diff --git a/test/shopify_custom_data_graphql/prepared_query_test.rb b/test/shopify_custom_data_graphql/prepared_query_test.rb new file mode 100644 index 0000000..f5207f3 --- /dev/null +++ b/test/shopify_custom_data_graphql/prepared_query_test.rb @@ -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 diff --git a/test/shopify_custom_data_graphql/request_transformer_test.rb b/test/shopify_custom_data_graphql/request_transformer_test.rb index 6576149..62c3cf6 100644 --- a/test/shopify_custom_data_graphql/request_transformer_test.rb +++ b/test/shopify_custom_data_graphql/request_transformer_test.rb @@ -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") {