From d06957c162ef8c034f72e8262729538024a01177 Mon Sep 17 00:00:00 2001 From: Chris <33081107+cdavis-personal@users.noreply.github.com> Date: Tue, 13 Aug 2024 22:04:18 -0400 Subject: [PATCH] Updated support for sending files to the automations endpoint (#2) * added new endpoint for updating test executions * updated ownership * updated supported for sending files to the automations endpoint * added new endpoints for executions and updated readme * updated minor version given all the recent changes --------- Co-authored-by: Chris Davis Co-authored-by: Chris Davis --- .rubocop.yml | 6 ++++++ README.md | 4 +++- lib/zephyr_ruby/client.rb | 7 ++++++- lib/zephyr_ruby/connection.rb | 17 +++++++++++++++-- lib/zephyr_ruby/resource/test_executions.rb | 20 ++++++++++++++++++++ lib/zephyr_ruby/version.rb | 2 +- zephyr_ruby-0.3.0.gem | Bin 8192 -> 0 bytes zephyr_ruby-0.4.0.gem | Bin 0 -> 13824 bytes zephyr_ruby.gemspec | 9 ++------- 9 files changed, 53 insertions(+), 12 deletions(-) create mode 100644 .rubocop.yml delete mode 100644 zephyr_ruby-0.3.0.gem create mode 100644 zephyr_ruby-0.4.0.gem diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000..806badf --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,6 @@ +Metrics/MethodLength: + Max: 13 + +AllCops: + NewCops: disable + TargetRubyVersion: 3.0 diff --git a/README.md b/README.md index a2966ac..2f71d3c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ If bundler is not being used to manage dependencies, install the gem by executin ## Usage -This gem provides access to the Zephyr Scale REST API. +To get started all you need to do is set your zephyr API access token and instantiate the client. + +For API endpoint usage see the official REST API documentation [here](https://support.smartbear.com/zephyr-scale-cloud/api-docs/#section/Introduction). ```ruby require 'zephyr_ruby' diff --git a/lib/zephyr_ruby/client.rb b/lib/zephyr_ruby/client.rb index ad14317..a261d2a 100644 --- a/lib/zephyr_ruby/client.rb +++ b/lib/zephyr_ruby/client.rb @@ -16,6 +16,7 @@ require_relative 'connection' require 'faraday' +require 'faraday/multipart' require 'json' module ZephyrRuby @@ -39,7 +40,11 @@ class Client def initialize(api_token) @base_url = 'https://api.zephyrscale.smartbear.com/v2' @api_token = api_token - @client = Faraday.new(@base_url, builder: build_middleware) + @client = Faraday.new(@base_url) do |f| + f.request :multipart + f.request :url_encoded + f.adapter Faraday.default_adapter + end @headers = { 'Authorization' => "Bearer #{@api_token}", 'Content-Type' => 'application/json' diff --git a/lib/zephyr_ruby/connection.rb b/lib/zephyr_ruby/connection.rb index 069b515..51c655b 100644 --- a/lib/zephyr_ruby/connection.rb +++ b/lib/zephyr_ruby/connection.rb @@ -8,8 +8,21 @@ def get(path, params = {}) request :get, path, params end - def post(path, body) - body = body.to_json if body.is_a?(Hash) + def post(path, body, file_path = nil) + if file_path + mime_type = case File.extname(file_path).downcase + when '.json' then 'application/json' + when '.xml' then 'application/xml' + when '.zip' then 'application/zip' + else 'application/octet-stream' + end + + file = Faraday::UploadIO.new(file_path, mime_type) + body = { file: file }.merge(body) if body.is_a?(Hash) + elsif body.is_a?(Hash) + body = body.to_json + end + request :post, path, body end diff --git a/lib/zephyr_ruby/resource/test_executions.rb b/lib/zephyr_ruby/resource/test_executions.rb index 95941af..d71d3a3 100644 --- a/lib/zephyr_ruby/resource/test_executions.rb +++ b/lib/zephyr_ruby/resource/test_executions.rb @@ -28,6 +28,26 @@ def create_test_execution_link(test_execution_id, body) def update_test_execution(test_execution_id, body) put "/testexecutions/#{test_execution_id}", body end + + def get_test_steps(test_execution_id) + get "/testexecutions/#{test_execution_id}/teststeps" + end + + def update_test_steps(test_execution_id, body) + put "/testexecutions/#{test_execution_id}/teststeps", body + end + + def sync_test_execution(test_execution_id) + post "/testexecutions/#{test_execution_id}/teststeps/sync" + end + + def get_test_execution_links(test_execution_id) + get "/testexecutions/#{test_execution_id}/links" + end + + def create_test_execution_issue_link(test_execution_id, body) + post "/testexecutions/#{test_execution_id}/links/issues", body + end end end end diff --git a/lib/zephyr_ruby/version.rb b/lib/zephyr_ruby/version.rb index cc58d67..d01f517 100644 --- a/lib/zephyr_ruby/version.rb +++ b/lib/zephyr_ruby/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module ZephyrRuby - VERSION = '0.4.0' + VERSION = '0.5.0' end diff --git a/zephyr_ruby-0.3.0.gem b/zephyr_ruby-0.3.0.gem deleted file mode 100644 index f9d55f575008e102b9a1b508bc9f338d703ae8e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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%0DX|SahOe5kBCnqF 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 1.7', '>= 1.7.0' spec.add_dependency 'json', '~> 2.3', '>= 2.3.0' spec.add_dependency 'rspec', '~> 3.7', '>= 3.7.0' - - # For more information and examples about making a new gem, check out our - # guide at: https://bundler.io/guides/creating_gem.html end