class TestRail::APIClient

Attributes

password[RW]
user[RW]

Public Class Methods

new(base_url) click to toggle source
# File lib/testrail.rb, line 26
def initialize(base_url)
  if !base_url.match(/\/$/)
    base_url += '/'
  end
  @url = base_url + 'index.php?/api/v2/'
end

Public Instance Methods

add_milestone(project_id, ms_name) click to toggle source
# File lib/testrail.rb, line 166
def add_milestone(project_id, ms_name)
  data = {"name"=> ms_name + Time.now.strftime("_%H/%M/%S_%d/%m/%Y")}
  response = send_post("add_milestone/#{project_id}", data)
  response['id']
end
add_result_for_case(run_id, case_id, data) click to toggle source
# File lib/testrail.rb, line 151
def add_result_for_case(run_id, case_id, data)
  send_post("add_result_for_case/#{run_id}/#{case_id}", data)
end
add_results_for_cases(run_id, test_rail_results) click to toggle source
# File lib/testrail.rb, line 76
def add_results_for_cases(run_id, test_rail_results)
  data = {}
  data[:results] = test_rail_results
  send_post("add_results_for_cases/#{run_id}", data)
end
add_run(project_id, suite_id, test_run_name, section_id=nil) click to toggle source
# File lib/testrail.rb, line 33
def add_run(project_id, suite_id, test_run_name, section_id=nil)
  cases_ids = section_id ? get_all_cases(project_id, suite_id, section_id) : get_cases_for_suite(project_id, suite_id).map {|item| item['id']}
  data = {'suite_id'=> suite_id, 'name' => test_run_name,'include_all'=>false, 'case_ids' => cases_ids }
  send_post("add_run/#{project_id}", data)
end
build_hash(node, array) click to toggle source
# File lib/testrail.rb, line 120
def build_hash(node, array)
  nodes_to_proceed = array.select do |section|
    section['parent_id'] == node['id']
  end

  nodes_to_proceed.each do |n|
    node['entries'] << n
    array.delete n
    build_hash(n, array)
  end
end
close_milestone(ms_id) click to toggle source
# File lib/testrail.rb, line 172
def close_milestone(ms_id)
  data = {'is_completed' => true}
  send_post("update_milestone/#{ms_id}", data)
end
close_run(run_id, data) click to toggle source
# File lib/testrail.rb, line 155
def close_run(run_id, data)
  send_post("close_run/#{run_id}", data)
end
full_title(case_hash, sections) click to toggle source
# File lib/testrail.rb, line 82
def full_title(case_hash, sections)
  parent_section_id = case_hash['section_id']
  results = []
  section = sections.find do |sec|
    sec['id'] == parent_section_id
  end

  get_full_sections_title_for(section, sections, results)
  results.push(case_hash['title']).join(' ')
end
get_all_cases(project_id, suite_id, section_id) click to toggle source
# File lib/testrail.rb, line 39
def get_all_cases(project_id, suite_id, section_id)
  all_sections = get_all_inherited_sections(project_id, suite_id, section_id)
  cases_ids = []
  all_sections.uniq!
  all_sections.each do |section|
    cases_ids += get_cases_for_section(project_id, suite_id, section)
  end
  cases_ids
end
get_all_inherited_sections(project_id, suite_id, section_id) click to toggle source
# File lib/testrail.rb, line 57
def get_all_inherited_sections(project_id, suite_id, section_id)
  hash = sections_hash(project_id, suite_id)
  to_preceed = hash['entries'].find{|el| el['id'] == section_id}
  results = []
  get_entries_array to_preceed, results
  results.map { |el| el['id']}
end
get_cases_for_section(project_id, suite_id, section_id) click to toggle source
# File lib/testrail.rb, line 53
def get_cases_for_section(project_id, suite_id, section_id)
  send_get("get_cases/#{project_id}&suite_id=#{suite_id}&section_id=#{section_id}").map {|item| item['id']}
end
get_cases_for_suite(project_id, suite_id) click to toggle source
# File lib/testrail.rb, line 49
def get_cases_for_suite(project_id, suite_id)
  send_get("get_cases/#{project_id}&suite_id=#{suite_id}")
end
get_cases_titles(cases, project_id, suite_id) click to toggle source
# File lib/testrail.rb, line 65
def get_cases_titles(cases, project_id, suite_id)
  sections = get_sections(project_id, suite_id)
  full_cases = []
  cases.each do |c|
    c['title'] = full_title(c, sections)
    full_cases << c
  end

  full_cases
end
get_entries_array(node, results) click to toggle source
# File lib/testrail.rb, line 106
def get_entries_array(node, results)
  results << node
  node['entries'].each do |entry|
    results << entry
    unless entry['entries'].empty?
      get_entries_array(entry, results)
    end
  end
end
get_full_sections_title_for(section, sections, results) click to toggle source
# File lib/testrail.rb, line 97
def get_full_sections_title_for(section, sections, results)
  results.unshift(section['name'])
  unless section['depth'] == 0
    parent_section = parent_section(section, sections)
    get_full_sections_title_for(parent_section, sections, results)
  end
end
get_section(section_id) click to toggle source
# File lib/testrail.rb, line 93
def get_section(section_id)
  send_get("get_section/#{section_id}")
end
get_section_id(project_id, suite_id, section_title) click to toggle source
# File lib/testrail.rb, line 142
def get_section_id(project_id, suite_id, section_title)
  all_sections = get_sections(project_id, suite_id)
  all_sections.find{|section| section['name'] == section_title}['id']
end
get_sections(project_id, suite_id) click to toggle source
# File lib/testrail.rb, line 147
def get_sections(project_id, suite_id)
  send_get("get_sections/#{project_id}&suite_id=#{suite_id}")
end
get_untested_tests(run_id) click to toggle source
# File lib/testrail.rb, line 186
def get_untested_tests(run_id)
  send_get("get_tests/#{run_id}&status_id=3")
end
mark_failed_tests_for_run(run_id, tests_ids) click to toggle source
# File lib/testrail.rb, line 177
def mark_failed_tests_for_run(run_id, tests_ids)
  data = {}
  data['results'] = []
  tests_ids.each do |id|
    data['results'] << {'test_id'=>id, 'status_id'=>5}
  end
  send_post("add_results/#{run_id}", data)
end
mark_untested_tests_failed(run_id) click to toggle source
# File lib/testrail.rb, line 159
def mark_untested_tests_failed(run_id)
  tests = get_untested_tests(run_id)
  return if tests.empty?
  tests_ids = tests.map {|t| t['id']}
  mark_failed_tests_for_run(run_id, tests_ids)
end
parent_section(section, sections) click to toggle source
# File lib/testrail.rb, line 116
def parent_section(section, sections)
  sections.find { |sec| sec['id'] == section['parent_id'] }
end
sections_hash(project_id, suite_id) click to toggle source
# File lib/testrail.rb, line 133
def sections_hash(project_id, suite_id)
  all_sections = get_sections(project_id, suite_id)
  all_sections.map! {|el| el['entries'] =[]; el}
  main = all_sections.find {|el| el['depth'] == 0}
  all_sections.delete(main)
  build_hash(main, all_sections)
  main
end
send_get(uri) click to toggle source

Send Get

Issues a GET request (read) against the API and returns the result (as Ruby hash).

Arguments:

uri The API method to call including parameters

(e.g. get_case/1)
# File lib/testrail.rb, line 202
def send_get(uri)
  _send_request('GET', uri, nil)
end
send_post(uri, data) click to toggle source

Send POST

Issues a POST request (write) against the API and returns the result (as Ruby hash).

Arguments:

uri The API method to call including parameters

(e.g. add_case/1)

data The data to submit as part of the request (as

Ruby hash, strings must be UTF-8 encoded)
# File lib/testrail.rb, line 219
def send_post(uri, data)
  _send_request('POST', uri, data)
end

Private Instance Methods

_send_request(method, uri, data) click to toggle source
# File lib/testrail.rb, line 224
def _send_request(method, uri, data)
  url = URI.parse(@url + uri)
  if method == 'POST'
    request = Net::HTTP::Post.new(url.path + '?' + url.query)
    request.body = JSON.dump(data)
  else
    request = Net::HTTP::Get.new(url.path + '?' + url.query)
  end
  request.basic_auth(@user, @password)
  request.add_field('Content-Type', 'application/json')

  conn = Net::HTTP.new(url.host, url.port)
  if url.scheme == 'https'
    conn.use_ssl = true
    conn.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  response = conn.request(request)

  if response.body && !response.body.empty?
    result = JSON.parse(response.body)
  else
    result = {}
  end

  if response.code != '200'
    if result && result.key?('error')
      error = '"' + result['error'] + '"'
    else
      error = 'No additional error message received'
    end
    raise APIError.new('TestRail API returned HTTP %s (%s)' %
                           [response.code, error])
  end

  result
end