diff options
Diffstat (limited to 'qa/qa/resource/api_fabricator.rb')
-rw-r--r-- | qa/qa/resource/api_fabricator.rb | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/qa/qa/resource/api_fabricator.rb b/qa/qa/resource/api_fabricator.rb index d0cbab70983..034feb4e90f 100644 --- a/qa/qa/resource/api_fabricator.rb +++ b/qa/qa/resource/api_fabricator.rb @@ -96,15 +96,38 @@ module QA end def api_post - response = post( - Runtime::API::Request.new(api_client, api_post_path).url, - api_post_body) + if api_post_path == "/graphql" + graphql_response = post( + Runtime::API::Request.new(api_client, api_post_path).url, + query: api_post_body) - unless response.code == HTTP_STATUS_CREATED - raise ResourceFabricationFailedError, "Fabrication of #{self.class.name} using the API failed (#{response.code}) with `#{response}`." + flattened_response = flatten_hash(parse_body(graphql_response)) + + unless graphql_response.code == HTTP_STATUS_OK && flattened_response[:errors].empty? + raise ResourceFabricationFailedError, "Fabrication of #{self.class.name} using the API failed (#{graphql_response.code}) with `#{graphql_response}`." + end + + flattened_response[:web_url] = flattened_response.delete(:webUrl) + flattened_response[:id] = flattened_response.fetch(:id).split('/')[-1] + + process_api_response(flattened_response) + else + response = post( + Runtime::API::Request.new(api_client, api_post_path).url, + api_post_body) + + unless response.code == HTTP_STATUS_CREATED + raise ResourceFabricationFailedError, "Fabrication of #{self.class.name} using the API failed (#{response.code}) with `#{response}`." + end + + process_api_response(parse_body(response)) end + end - process_api_response(parse_body(response)) + def flatten_hash(param) + param.each_pair.reduce({}) do |a, (k, v)| + v.is_a?(Hash) ? a.merge(flatten_hash(v)) : a.merge(k.to_sym => v) + end end def api_delete |