tms-cli 0.0.pre.beta
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/tms +5 -0
- data/lib/.env +11 -0
- data/lib/cucumber.rb +369 -0
- data/lib/db/mysql.rb +107 -0
- data/lib/import/importcucumber.rb +123 -0
- data/lib/import/importfeature.rb +34 -0
- data/lib/import/importflutter.rb +40 -0
- data/lib/import/importgolang.rb +47 -0
- data/lib/import/importjest.rb +81 -0
- data/lib/import/importjunit.rb +76 -0
- data/lib/import/importrspec.rb +36 -0
- data/lib/jira/jira_api.rb +37 -0
- data/lib/jira/jira_issues.rb +48 -0
- data/lib/preprocessing.rb +334 -0
- data/lib/regression.rb +232 -0
- data/lib/testrail/attachment.rb +17 -0
- data/lib/testrail/cleanup.rb +64 -0
- data/lib/testrail/dataprep.rb +169 -0
- data/lib/testrail/log.rb +15 -0
- data/lib/testrail/milestone.rb +136 -0
- data/lib/testrail/projects.rb +39 -0
- data/lib/testrail/report.rb +61 -0
- data/lib/testrail/results.rb +20 -0
- data/lib/testrail/sections.rb +32 -0
- data/lib/testrail/testbdd.rb +72 -0
- data/lib/testrail/testcase.rb +196 -0
- data/lib/testrail/testplan.rb +93 -0
- data/lib/testrail/testrail.rb +136 -0
- data/lib/testrail/testrun.rb +184 -0
- data/lib/testrail/testsuite.rb +49 -0
- data/lib/tms.rb +337 -0
- data/util/script/generate-password.rb +47 -0
- data/util/script/generatereport.rb +90 -0
- data/util/script/mergerequest.rb +38 -0
- metadata +300 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../testrail/testrail'
|
4
|
+
require_relative '../testrail/testcase'
|
5
|
+
|
6
|
+
module Tms
|
7
|
+
module Flutter
|
8
|
+
module_function
|
9
|
+
|
10
|
+
include Testcase
|
11
|
+
|
12
|
+
# This method will collect test title, refs, and test status from json report
|
13
|
+
# and then validate the test title and refs
|
14
|
+
# On Flutter, the data able to get from json object 'testResults'
|
15
|
+
def import_data(client, project_id, suite_id, section_id, report_data_hash, tr_version)
|
16
|
+
report_data_hash['testResults'].map do |test_results|
|
17
|
+
test_results['testResults'].map do |test_result|
|
18
|
+
title = test_result['title'].tr('"', "'")[0..249]
|
19
|
+
next if title.eql? 'placeholder'
|
20
|
+
|
21
|
+
if title.include?(':')
|
22
|
+
group_name = title.split(':')[0].split(' ')
|
23
|
+
group_name.pop
|
24
|
+
tc_name = title.split(':')[1].strip
|
25
|
+
test_title = "[#{group_name.join(' ')}] #{tc_name}"
|
26
|
+
refs = title.split(':')[0].split(' ').last.strip
|
27
|
+
else
|
28
|
+
test_title = title
|
29
|
+
refs = ''
|
30
|
+
end
|
31
|
+
test_status = test_result['status']
|
32
|
+
test_status_id = Testcase.get_status_id(test_status)
|
33
|
+
error_comment = test_result['failureMessages']
|
34
|
+
|
35
|
+
Testcase.validate_testcase(client, section_id, test_title, test_status_id, refs, tr_version, error_comment)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../testrail/testrail'
|
4
|
+
require_relative '../testrail/testcase'
|
5
|
+
|
6
|
+
module Tms
|
7
|
+
module Golang
|
8
|
+
module_function
|
9
|
+
|
10
|
+
include Testcase
|
11
|
+
|
12
|
+
def import_data(client, project_id, suite_id, section_id, report_data_hash, tr_version)
|
13
|
+
report_data_hash.map do |test_result|
|
14
|
+
next if test_result['Elapsed'].nil? || test_result['Test'].nil?
|
15
|
+
|
16
|
+
next if test_result['Test'].split('/').size.eql?(1)
|
17
|
+
|
18
|
+
test_title = test_result['Test'].split('/').last.gsub('_', ' ').split(':')
|
19
|
+
refs = ''
|
20
|
+
test_status = test_result['Action']
|
21
|
+
if test_title.size.eql?(1)
|
22
|
+
tc_title = test_title.first.strip
|
23
|
+
else
|
24
|
+
tc_title = test_title.last.strip
|
25
|
+
tmp_refs = test_title.first.strip
|
26
|
+
refs = tmp_refs if Testcase.validate_refs(tmp_refs)
|
27
|
+
end
|
28
|
+
|
29
|
+
case test_status
|
30
|
+
when 'pass'
|
31
|
+
test_status = test_status.gsub('pass', 'passed')
|
32
|
+
error_comment = ''
|
33
|
+
when 'fail'
|
34
|
+
test_status = test_status.gsub('fail', 'failed')
|
35
|
+
report_data_hash.map do |err|
|
36
|
+
next unless (err['Test'].to_s.include? test_result['Test']) && err['Output'].to_s.include?('Error:')
|
37
|
+
error_comment = err['Output'].split('Error:').last.gsub('\\', ' ')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
test_status_id = Testcase.get_status_id(test_status)
|
42
|
+
|
43
|
+
Testcase.validate_testcase(client, section_id, tc_title, test_status_id, refs, tr_version, error_comment)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../testrail/testrail'
|
4
|
+
require_relative '../testrail/testcase'
|
5
|
+
|
6
|
+
module Tms
|
7
|
+
module Jest
|
8
|
+
module_function
|
9
|
+
|
10
|
+
include Testcase
|
11
|
+
|
12
|
+
def import_data(client, project_id, suite_id, section_id, report_data_hash, tr_version)
|
13
|
+
if !report_data_hash['testResults'][0]['assertionResults'].nil?
|
14
|
+
jest_from_cli(client, section_id, report_data_hash, tr_version)
|
15
|
+
else
|
16
|
+
jest_from_module(client, section_id, report_data_hash, tr_version)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def jest_from_cli(client, section_id, report_data_hash, tr_version)
|
21
|
+
report_data_hash['testResults'].map do |test_results|
|
22
|
+
test_results['assertionResults'].map do |test_result|
|
23
|
+
refs = ''
|
24
|
+
if test_result['ancestorTitles'].size == 1
|
25
|
+
refs_validation = test_result['ancestorTitles'][0].include?(':') && test_result['ancestorTitles'][0].include?('-')
|
26
|
+
refs = test_result['ancestorTitles'][0].split(':')[0].strip if refs_validation
|
27
|
+
else
|
28
|
+
tmp_ref = []
|
29
|
+
test_result['ancestorTitles'].map do |str|
|
30
|
+
tmp_ref.push(str.split(':')[0].strip) if str.include?(':') && str.split(':')[0].strip.include?('-')
|
31
|
+
end
|
32
|
+
refs = if tmp_ref.size == 1
|
33
|
+
tmp_ref[0]
|
34
|
+
elsif tmp_ref.size > 1
|
35
|
+
tmp_ref.uniq.join(',')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
test_title = test_result['title'].tr('"', "'")
|
40
|
+
test_title = test_result['fullName'] if test_title == ''
|
41
|
+
test_title = test_title.gsub("\n", '').gsub(/[{}<>=]/, '')[0..249]
|
42
|
+
test_status = test_result['status']
|
43
|
+
error_comment = test_result['failureMessages']
|
44
|
+
test_status_id = Testcase.get_status_id(test_status)
|
45
|
+
|
46
|
+
Testcase.validate_testcase(client, section_id, test_title, test_status_id, refs, tr_version, error_comment)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def jest_from_module(client, section_id, report_data_hash, tr_version)
|
52
|
+
report_data_hash['testResults'].map do |test_results|
|
53
|
+
test_results['testResults'].map do |result|
|
54
|
+
refs = ''
|
55
|
+
if result['ancestorTitles'].size == 1
|
56
|
+
refs_validation = result['ancestorTitles'][0].include?(':') && result['ancestorTitles'][0].include?('-')
|
57
|
+
refs = result['ancestorTitles'][0].split(':')[0].strip if refs_validation
|
58
|
+
else
|
59
|
+
tmp_ref = []
|
60
|
+
result['ancestorTitles'].map do |str|
|
61
|
+
tmp_ref.push(str.split(':')[0].strip) if str.include?(':') && Testcase.validate_refs(str.split(':')[0].strip)
|
62
|
+
end
|
63
|
+
refs = if tmp_ref.size == 1
|
64
|
+
tmp_ref[0]
|
65
|
+
elsif tmp_ref.size > 1
|
66
|
+
tmp_ref.uniq.join(',')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
test_title = result['title'].tr('"', "'")
|
70
|
+
test_title = test_result['fullName'] if test_title == ''
|
71
|
+
test_title = test_title.gsub("\n", '').gsub(/[{}<>=]/, '')[0..249]
|
72
|
+
test_status = result['status']
|
73
|
+
test_status_id = Testcase.get_status_id(test_status)
|
74
|
+
error_comment = result['failureMessages']
|
75
|
+
|
76
|
+
Testcase.validate_testcase(client, section_id, test_title, test_status_id, refs, tr_version, error_comment)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../testrail/testrail'
|
4
|
+
require_relative '../testrail/testcase'
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
module Tms
|
8
|
+
module JUnit
|
9
|
+
module_function
|
10
|
+
|
11
|
+
include Testcase
|
12
|
+
|
13
|
+
def convert_to_hash(xml_file)
|
14
|
+
# Parse the XML file using Nokogiri
|
15
|
+
doc = Nokogiri::XML(File.open(xml_file))
|
16
|
+
|
17
|
+
# Create a new array
|
18
|
+
results = []
|
19
|
+
|
20
|
+
# Iterate over the <testcase> elements in the XML document
|
21
|
+
doc.xpath("//testcase").each do |testcase|
|
22
|
+
# New Hashmap
|
23
|
+
test_result = {}
|
24
|
+
|
25
|
+
# Extract the test case name and add it to the hash map
|
26
|
+
suite_name = testcase.attributes["classname"]
|
27
|
+
test_name = testcase.attributes["name"].value
|
28
|
+
|
29
|
+
# Get jira id in the test class name if any
|
30
|
+
# Pattern: keyid_testname (ex: intnl_778_validateRegistrationPage)
|
31
|
+
# Can't use "-" in the test class name of kotlin
|
32
|
+
# TODO: Get better implemantation and support multiple jira id
|
33
|
+
parts = test_name.split("_")
|
34
|
+
|
35
|
+
if parts.length > 2
|
36
|
+
test_result["jiraId"] = "#{parts[0]}-#{parts[1]}"
|
37
|
+
test_name = parts[2]
|
38
|
+
end
|
39
|
+
|
40
|
+
test_result["name"] = "#{suite_name} #{test_name}"
|
41
|
+
|
42
|
+
# Default value for test status
|
43
|
+
test_result["status"] = "passed"
|
44
|
+
|
45
|
+
# Iterate over the child elements of the <testcase> element
|
46
|
+
# and add their contents to the hash map
|
47
|
+
testcase.children.each do |child|
|
48
|
+
# Remap status according to child element
|
49
|
+
if child.name == "failure"
|
50
|
+
test_result["status"] = "failed"
|
51
|
+
test_result[child.name] = child.text
|
52
|
+
elsif child.name == "skipped"
|
53
|
+
test_result["status"] = "pending"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
results.push(test_result)
|
58
|
+
end
|
59
|
+
|
60
|
+
return results
|
61
|
+
end
|
62
|
+
|
63
|
+
def import_data(client, project_id, suite_id, section_id, xml_file, tr_version)
|
64
|
+
report_data_hash = self.convert_to_hash(xml_file)
|
65
|
+
report_data_hash.map do |result|
|
66
|
+
test_title = result['name']
|
67
|
+
test_status = result['status']
|
68
|
+
test_status_id = Testcase.get_status_id(test_status)
|
69
|
+
error_comment = result['failure'] || ''
|
70
|
+
refs = result['jiraId'] || ''
|
71
|
+
|
72
|
+
Testcase.validate_testcase(client, section_id, test_title, test_status_id, refs, tr_version, error_comment)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../testrail/testrail'
|
4
|
+
require_relative '../testrail/testcase'
|
5
|
+
|
6
|
+
module Tms
|
7
|
+
module Rspec
|
8
|
+
module_function
|
9
|
+
|
10
|
+
include Testcase
|
11
|
+
|
12
|
+
def import_data(client, project_id, suite_id, section_id, report_data_hash, tr_version)
|
13
|
+
report_data_hash['examples'].map do |test_result|
|
14
|
+
full_description = test_result['full_description']
|
15
|
+
next if full_description.split(' ').nil? || full_description.split(' ').size < 2
|
16
|
+
|
17
|
+
refs = ''
|
18
|
+
tmp_ref = full_description.split(' ')[1].strip.gsub(':', '')
|
19
|
+
if tmp_ref.split(',').size > 1
|
20
|
+
tmp = []
|
21
|
+
tmp_ref.split(',').each do |ref|
|
22
|
+
tmp.push(ref) if Testcase.validate_refs(ref)
|
23
|
+
end
|
24
|
+
refs = tmp.uniq.join(',')
|
25
|
+
else
|
26
|
+
refs = tmp_ref if Testcase.validate_refs(tmp_ref)
|
27
|
+
end
|
28
|
+
test_title = full_description.gsub(refs, '').tr('"', "'")[0..249].gsub(/\p{So}/, '').strip
|
29
|
+
test_status = test_result['status']
|
30
|
+
test_status_id = Testcase.get_status_id(test_status)
|
31
|
+
error_comment = test_result['exception']
|
32
|
+
Testcase.validate_testcase(client, section_id, test_title, test_status_id, refs, tr_version, error_comment)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'jira-ruby'
|
2
|
+
require 'rest-client'
|
3
|
+
|
4
|
+
module Tms
|
5
|
+
module JiraAPI
|
6
|
+
module_function
|
7
|
+
|
8
|
+
def jira_auth
|
9
|
+
{
|
10
|
+
username: ENV['ATLASSIAN_EMAIL'],
|
11
|
+
password: ENV['ATLASSIAN_TOKEN'],
|
12
|
+
site: 'https://tutuplapak.atlassian.net',
|
13
|
+
context_path: '',
|
14
|
+
auth_type: :basic,
|
15
|
+
read_timeout: 120
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_issue_details(issue_key)
|
20
|
+
client = JIRA::Client.new(jira_auth)
|
21
|
+
client.Issue.find(issue_key)
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_attachment_content(attachment_url)
|
25
|
+
client = JIRA::Client.new(jira_auth)
|
26
|
+
|
27
|
+
response = RestClient::Request.execute(
|
28
|
+
method: :get,
|
29
|
+
url: attachment_url,
|
30
|
+
headers: {
|
31
|
+
Authorization: "Basic #{Base64.strict_encode64("#{jira_auth[:username]}:#{jira_auth[:password]}")}"
|
32
|
+
}
|
33
|
+
)
|
34
|
+
response.body
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module JiraIssues
|
2
|
+
module_function
|
3
|
+
|
4
|
+
def get_hash_ac(ac_field)
|
5
|
+
# Join each row and remove extra spaces
|
6
|
+
markdown_table = ac_field.gsub(/\n\s*/, '')
|
7
|
+
|
8
|
+
# Extract headers
|
9
|
+
headers = markdown_table.split("||")[0..4].reject(&:empty?).map { |element| element.gsub("*", "") }
|
10
|
+
|
11
|
+
# Split the table into rows based on "*[" as delimiter of each line
|
12
|
+
rows = markdown_table.split("|*[")
|
13
|
+
|
14
|
+
# Create an array to store the hash representation of each row
|
15
|
+
table_data = []
|
16
|
+
|
17
|
+
# Process each row and convert it to a hash
|
18
|
+
rows.each_with_index do |row, index|
|
19
|
+
row_values = row.split(/\|(?!width=)/)
|
20
|
+
|
21
|
+
next if row_values.empty?
|
22
|
+
|
23
|
+
# Ensure each row has the symbol | five times
|
24
|
+
row_values = row_values[0..4]
|
25
|
+
|
26
|
+
row_hash = Hash[headers.zip(row_values)]
|
27
|
+
table_data << row_hash
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return the hash AC
|
31
|
+
return table_data.drop(1)
|
32
|
+
end
|
33
|
+
|
34
|
+
def hash_to_feature(hash, ref)
|
35
|
+
test_title = hash["Title"]
|
36
|
+
project_name = test_title.split("][").first.gsub(/\s+/, '_')
|
37
|
+
steps = hash["Steps"].split(/(?=\*Given\*|\*When\*|\*Then\*|\*And\*)/).map(&:strip)
|
38
|
+
steps.map! { |step| step.gsub(/\*(Given|When|Then|And)\*/, '\1') }
|
39
|
+
|
40
|
+
has_attachments = !hash["Attachments"].nil? && !hash["Attachments"].empty?
|
41
|
+
|
42
|
+
feature_file = "@#{ref}\nFeature: #{test_title[/\bAC.*\b/]}\n\t"
|
43
|
+
feature_file += "@#{ref} \n\tScenario: #{test_title[/\bAC.*\b/]}\n\t\t"
|
44
|
+
feature_file += steps.join("\n\t\t")
|
45
|
+
|
46
|
+
return feature_file, project_name
|
47
|
+
end
|
48
|
+
end
|