Skip to content

Commit

Permalink
Move transformation to http client
Browse files Browse the repository at this point in the history
  • Loading branch information
lizkenyon committed Nov 29, 2023
1 parent fa1f205 commit 97421ab
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 18 deletions.
1 change: 1 addition & 0 deletions lib/shopify_api/clients/graphql/client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ def query(query:, variables: nil, headers: nil, tries: 1)
body_type: "application/json",
tries: tries,
),
graphql_response_object: Context.graphql_response_object || false,
)
end
end
Expand Down
9 changes: 7 additions & 2 deletions lib/shopify_api/clients/http_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ def initialize(base_path:, session: nil)
end
end

sig { params(request: HttpRequest).returns(HttpResponse) }
def request(request)
sig { params(request: HttpRequest, graphql_response_object: T::Boolean).returns(HttpResponse) }
def request(request, graphql_response_object: false)
request.verify

headers = @headers
Expand All @@ -60,6 +60,11 @@ def request(request)
body = res.body
end

if graphql_response_object && body.is_a?(Hash)
json_body = body.to_json
body = JSON.parse(json_body, object_class: OpenStruct)
end

response = HttpResponse.new(code: res.code.to_i, headers: res.headers.to_h, body: body)

if response.headers["x-shopify-api-deprecated-reason"]
Expand Down
9 changes: 2 additions & 7 deletions lib/shopify_api/clients/http_response.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,13 @@ class HttpResponse
params(
code: Integer,
headers: T::Hash[String, T::Array[String]],
body: T.any(T::Hash[String, T.untyped], String),
body: T.any(T::Hash[String, T.untyped], String, OpenStruct),
).void
end
def initialize(code:, headers:, body:)
@code = code
@headers = headers
@body = T.let(body, T.any(OpenStruct, T::Hash[String, T.untyped], String))

if Context.graphql_response_object && body.is_a?(Hash)
json_body = body.to_json
+ @body = JSON.parse(json_body, object_class: OpenStruct)
end
@body = body

@prev_page_info = T.let(nil, T.nilable(String))
@next_page_info = T.let(nil, T.nilable(String))
Expand Down
11 changes: 11 additions & 0 deletions test/clients/http_client_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,17 @@ def test_json_parser_error
assert_equal(502, error.code)
end

def test_graphql_response_object
stub_request(@request.http_method, "https://#{@shop}#{@base_path}/#{@request.path}")
.with(body: @request.body.to_json, query: @request.query, headers: @expected_headers)
.to_return(body: { "key" => { "nested_key" => "nested_value" }}.to_json, headers: @response_headers)

response = @client.request(@request, graphql_response_object: true)
assert_kind_of(OpenStruct, response.body)
assert_equal("nested_value", response.body.key.nested_key)

end

private

def simple_http_test(http_method)
Expand Down
9 changes: 0 additions & 9 deletions test/clients/http_response_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,6 @@ def test_next_and_prev
assert_equal("page-info", response.prev_page_info)
assert_equal("other-page-info", response.next_page_info)
end

def test_object_response
modify_context(graphql_response_object: true)

# We need to verify that the response body is an OpenStruct object
response = ShopifyAPI::Clients::HttpResponse.new(code: 200, headers: {}, body: { "key" => { "nested_key" => "nested_value" }})
assert_kind_of(OpenStruct, response.body)
assert_equal("nested_value", response.body.key.nested_key)
end
end
end
end

0 comments on commit 97421ab

Please sign in to comment.