tms-cli 0.0.pre.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|