onlyoffice_testrail_wrapper 0.3.0 → 0.4.0
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 +4 -4
- data/lib/onlyoffice_testrail_wrapper/helpers/rspec_helper.rb +2 -0
- data/lib/onlyoffice_testrail_wrapper/helpers/ruby_helper.rb +2 -0
- data/lib/onlyoffice_testrail_wrapper/helpers/string_helper.rb +4 -0
- data/lib/onlyoffice_testrail_wrapper/mock/rspec_example_mock.rb +8 -3
- data/lib/onlyoffice_testrail_wrapper/testrail/requests_helper.rb +52 -0
- data/lib/onlyoffice_testrail_wrapper/testrail.rb +29 -70
- data/lib/onlyoffice_testrail_wrapper/testrail_api_object.rb +26 -0
- data/lib/onlyoffice_testrail_wrapper/testrail_case.rb +12 -6
- data/lib/onlyoffice_testrail_wrapper/testrail_helper/example_failed_got_expected_exception.rb +26 -0
- data/lib/onlyoffice_testrail_wrapper/testrail_helper/example_lpv_exception.rb +20 -0
- data/lib/onlyoffice_testrail_wrapper/testrail_helper/example_service_unavailable_exception.rb +20 -0
- data/lib/onlyoffice_testrail_wrapper/testrail_helper.rb +28 -51
- data/lib/onlyoffice_testrail_wrapper/testrail_milestone.rb +22 -4
- data/lib/onlyoffice_testrail_wrapper/testrail_plan.rb +10 -4
- data/lib/onlyoffice_testrail_wrapper/testrail_plan_entry.rb +3 -1
- data/lib/onlyoffice_testrail_wrapper/testrail_project/testrail_project_milestone_methods.rb +23 -4
- data/lib/onlyoffice_testrail_wrapper/testrail_project/testrail_project_plan_helper.rb +14 -11
- data/lib/onlyoffice_testrail_wrapper/testrail_project/testrail_project_runs_methods.rb +9 -6
- data/lib/onlyoffice_testrail_wrapper/testrail_project/testrail_project_suite_methods.rb +9 -7
- data/lib/onlyoffice_testrail_wrapper/testrail_project.rb +7 -6
- data/lib/onlyoffice_testrail_wrapper/testrail_result.rb +2 -1
- data/lib/onlyoffice_testrail_wrapper/testrail_run.rb +12 -7
- data/lib/onlyoffice_testrail_wrapper/testrail_section.rb +14 -8
- data/lib/onlyoffice_testrail_wrapper/testrail_suite.rb +19 -11
- data/lib/onlyoffice_testrail_wrapper/testrail_test.rb +19 -7
- data/lib/onlyoffice_testrail_wrapper/testrail_tools/testrail_tools.rb +4 -2
- data/lib/onlyoffice_testrail_wrapper/version.rb +1 -1
- data/lib/onlyoffice_testrail_wrapper.rb +1 -1
- metadata +17 -131
- data/lib/onlyoffice_testrail_wrapper/helpers/hash_helper.rb +0 -21
- data/lib/onlyoffice_testrail_wrapper/testrail_helper/testrail_status_helper.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28a07c822b81f13247f293f80bbf56d168dbac499ef4db825e15ce5d1eaea9f7
|
4
|
+
data.tar.gz: 21517abd525275abe30d8c669009e3291b88bea94925746baf4e07bdc2d24717
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efbd5f01fb0cd7b6e5c0b44a213798117baa87ea844bf5928eba793f0364f6b7b317f3c013b6b7ef1c687f4b9963f33214e72f60a05530ea79bffe72eb0611a6
|
7
|
+
data.tar.gz: 4e207968afb4e535077cb46f431ff12666d078aa8247b23b0ab8fc70e8b4072856c80e7e498727965d3ebff06585f43ccfd4fbc0027a55428ffa0f3dea46a1d8
|
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module OnlyofficeTestrailWrapper
|
4
|
+
# Helper for working with strings
|
4
5
|
class StringHelper
|
5
6
|
class << self
|
7
|
+
# Check if string is have spaces in begin or end and remove them
|
8
|
+
# @param [String] string to check
|
9
|
+
# @return [String] string without spaces in begin or end
|
6
10
|
def warnstrip!(string)
|
7
11
|
warn "Beginning or end of string has spaces! In: #{string}" unless string == string.strip
|
8
12
|
string.strip
|
@@ -5,8 +5,13 @@ module OnlyofficeTestrailWrapper
|
|
5
5
|
class RspecExceptionMock
|
6
6
|
attr_accessor :backtrace
|
7
7
|
|
8
|
-
def initialize
|
9
|
-
@backtrace =
|
8
|
+
def initialize(backtrace = %w[TestBackTraceLine1 TestBackTraceLine2])
|
9
|
+
@backtrace = backtrace
|
10
|
+
end
|
11
|
+
|
12
|
+
# @return [String] string version of exception
|
13
|
+
def to_s
|
14
|
+
@backtrace
|
10
15
|
end
|
11
16
|
end
|
12
17
|
|
@@ -31,7 +36,7 @@ module OnlyofficeTestrailWrapper
|
|
31
36
|
def initialize(description: 'MockDescription',
|
32
37
|
exception: RspecExceptionMock.new)
|
33
38
|
@exception = exception
|
34
|
-
@metadata = { execution_result: RspecExceptionResultMock.new }
|
39
|
+
@metadata = { execution_result: RspecExceptionResultMock.new, absolute_file_path: __FILE__ }
|
35
40
|
@pending = false
|
36
41
|
@description = description
|
37
42
|
@section = ''
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeTestrailWrapper
|
4
|
+
# Module for working with requests
|
5
|
+
module RequestsHelper
|
6
|
+
# Send request to Testrail
|
7
|
+
# @param [URI] uri uri to send request
|
8
|
+
# @param [Net::HTTP::Get, Net::HTTP::Post] request request to send
|
9
|
+
# @return [Net::HTTPResponse] response from Testrail
|
10
|
+
def send_request(uri, request)
|
11
|
+
request.basic_auth admin_user, admin_pass
|
12
|
+
request.delete 'content-type'
|
13
|
+
request.add_field 'content-type', 'application/json'
|
14
|
+
is_ssl = (uri.scheme == 'https')
|
15
|
+
@connection ||= Net::HTTP.start(uri.host, uri.port, use_ssl: is_ssl)
|
16
|
+
@connection.start unless @connection.started?
|
17
|
+
attempts = 0
|
18
|
+
begin
|
19
|
+
response = @connection.request(request)
|
20
|
+
rescue Timeout::Error
|
21
|
+
attempts += 1
|
22
|
+
retry if attempts < 3
|
23
|
+
raise 'Timeout error after 3 attempts'
|
24
|
+
end
|
25
|
+
response
|
26
|
+
end
|
27
|
+
|
28
|
+
# Perform http get on address
|
29
|
+
# @param [String] request_url to perform http get
|
30
|
+
# @return [Hash] Json with result data in hash form
|
31
|
+
def http_get(request_url)
|
32
|
+
uri = URI get_testrail_address + request_url
|
33
|
+
request = Net::HTTP::Get.new uri.request_uri
|
34
|
+
response = send_request(uri, request)
|
35
|
+
JSON.parse response.body
|
36
|
+
end
|
37
|
+
|
38
|
+
# Perform http post on address
|
39
|
+
# @param [String] request_url to perform http get
|
40
|
+
# @param [Hash] data_hash headers to add to post query
|
41
|
+
# @return [Hash] Json with result data in hash form
|
42
|
+
def http_post(request_url, data_hash = {})
|
43
|
+
uri = URI get_testrail_address + request_url
|
44
|
+
request = Net::HTTP::Post.new uri.request_uri
|
45
|
+
request.body = data_hash.to_json
|
46
|
+
response = send_request(uri, request)
|
47
|
+
return if response.body == ''
|
48
|
+
|
49
|
+
JSON.parse response.body
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -7,6 +7,7 @@ require 'net/http'
|
|
7
7
|
require 'json'
|
8
8
|
require 'yaml'
|
9
9
|
require_relative 'testrail_project'
|
10
|
+
require_relative 'testrail/requests_helper'
|
10
11
|
|
11
12
|
module OnlyofficeTestrailWrapper
|
12
13
|
# Main class for working with testrail
|
@@ -20,7 +21,8 @@ module OnlyofficeTestrailWrapper
|
|
20
21
|
# current_test.add_result(Testrail2::TEST_RESULT_OK, 'description','version')
|
21
22
|
# incomplete_test = test_run_from_api.get_incomplete_tests()
|
22
23
|
# end1
|
23
|
-
class Testrail2
|
24
|
+
class Testrail2 < TestrailApiObject
|
25
|
+
extend RequestsHelper
|
24
26
|
# @return [String] address of testrail
|
25
27
|
@testrail_url = nil
|
26
28
|
# @return [String] login for admin user
|
@@ -28,13 +30,6 @@ module OnlyofficeTestrailWrapper
|
|
28
30
|
# @return [String] password for admin user
|
29
31
|
@admin_pass = nil
|
30
32
|
|
31
|
-
# @return [Hash] project information
|
32
|
-
attr_accessor :projects_names
|
33
|
-
|
34
|
-
def initialize
|
35
|
-
@projects_names = {}
|
36
|
-
end
|
37
|
-
|
38
33
|
class << self
|
39
34
|
attr_accessor :testrail_url
|
40
35
|
# Attribute to write admin_user
|
@@ -46,9 +41,9 @@ module OnlyofficeTestrailWrapper
|
|
46
41
|
CONFIG_LOCATION = "#{Dir.home}/.gem-onlyoffice_testrail_wrapper/config.yml"
|
47
42
|
|
48
43
|
def read_keys
|
49
|
-
@testrail_url = ENV
|
50
|
-
@admin_user = ENV
|
51
|
-
@admin_pass = ENV
|
44
|
+
@testrail_url = ENV.fetch('TESTRAIL_URL', 'http://unknown.url')
|
45
|
+
@admin_user = ENV.fetch('TESTRAIL_USER', nil)
|
46
|
+
@admin_pass = ENV.fetch('TESTRAIL_PASSWORD', nil)
|
52
47
|
return unless @admin_user.nil? && @admin_pass.nil?
|
53
48
|
|
54
49
|
begin
|
@@ -62,12 +57,12 @@ module OnlyofficeTestrailWrapper
|
|
62
57
|
end
|
63
58
|
|
64
59
|
def admin_user
|
65
|
-
read_keys
|
60
|
+
read_keys unless @admin_user
|
66
61
|
@admin_user
|
67
62
|
end
|
68
63
|
|
69
64
|
def admin_pass
|
70
|
-
read_keys
|
65
|
+
read_keys unless @admin_pass
|
71
66
|
@admin_pass
|
72
67
|
end
|
73
68
|
|
@@ -75,30 +70,6 @@ module OnlyofficeTestrailWrapper
|
|
75
70
|
read_keys unless testrail_url
|
76
71
|
testrail_url
|
77
72
|
end
|
78
|
-
|
79
|
-
# Perform http get on address
|
80
|
-
# @param [String] request_url to perform http get
|
81
|
-
# @return [Hash] Json with result data in hash form
|
82
|
-
def http_get(request_url)
|
83
|
-
uri = URI get_testrail_address + request_url
|
84
|
-
request = Net::HTTP::Get.new uri.request_uri
|
85
|
-
response = send_request(uri, request)
|
86
|
-
JSON.parse response.body
|
87
|
-
end
|
88
|
-
|
89
|
-
# Perform http post on address
|
90
|
-
# @param [String] request_url to perform http get
|
91
|
-
# @param [Hash] data_hash headers to add to post query
|
92
|
-
# @return [Hash] Json with result data in hash form
|
93
|
-
def http_post(request_url, data_hash = {})
|
94
|
-
uri = URI get_testrail_address + request_url
|
95
|
-
request = Net::HTTP::Post.new uri.request_uri
|
96
|
-
request.body = data_hash.to_json
|
97
|
-
response = send_request(uri, request)
|
98
|
-
return if response.body == ''
|
99
|
-
|
100
|
-
JSON.parse response.body
|
101
|
-
end
|
102
73
|
end
|
103
74
|
|
104
75
|
# region PROJECT
|
@@ -115,19 +86,22 @@ module OnlyofficeTestrailWrapper
|
|
115
86
|
end
|
116
87
|
|
117
88
|
# Get all projects on testrail
|
118
|
-
# @return [Array
|
89
|
+
# @return [Array<TestrailProject>] array of projects data
|
119
90
|
def get_projects
|
120
|
-
projects =
|
121
|
-
|
91
|
+
projects = []
|
92
|
+
Testrail2.http_get('index.php?/api/v2/get_projects').each do |project|
|
93
|
+
projects << TestrailProject.new.init_from_hash(project)
|
94
|
+
end
|
122
95
|
projects
|
123
96
|
end
|
124
97
|
|
125
98
|
def create_new_project(name, announcement = '', show_announcement = true)
|
126
|
-
new_project =
|
127
|
-
|
99
|
+
new_project = TestrailProject.new.init_from_hash(Testrail2.http_post('index.php?/api/v2/add_project',
|
100
|
+
name: StringHelper.warnstrip!(name.to_s),
|
101
|
+
announcement: announcement,
|
102
|
+
show_announcement: show_announcement))
|
128
103
|
OnlyofficeLoggerHelper.log "Created new project: #{new_project.name}"
|
129
|
-
new_project.instance_variable_set(
|
130
|
-
@projects_names[new_project.name] = new_project.id
|
104
|
+
new_project.instance_variable_set(:@testrail, self)
|
131
105
|
new_project
|
132
106
|
end
|
133
107
|
|
@@ -142,15 +116,22 @@ module OnlyofficeTestrailWrapper
|
|
142
116
|
# Get all projects on testrail
|
143
117
|
# @return [Array, ProjectTestrail] array of projects
|
144
118
|
def get_project_by_id(id)
|
145
|
-
project =
|
119
|
+
project = TestrailProject.new.init_from_hash(Testrail2.http_get("index.php?/api/v2/get_project/#{id}"))
|
146
120
|
OnlyofficeLoggerHelper.log("Initialized project: #{project.name}")
|
147
|
-
project.instance_variable_set(
|
121
|
+
project.instance_variable_set(:@testrail, self)
|
148
122
|
project
|
149
123
|
end
|
150
124
|
|
125
|
+
# Get Testrail project by it's name
|
126
|
+
# @param [String] name name of project
|
127
|
+
# @return [TestrailProject, nil] project with this name or nil if not found
|
151
128
|
def get_project_by_name(name)
|
152
|
-
|
153
|
-
|
129
|
+
projects = get_projects
|
130
|
+
project_name = StringHelper.warnstrip!(name.to_s)
|
131
|
+
project = projects.find { |current_project| current_project.name == project_name }
|
132
|
+
return nil unless project
|
133
|
+
|
134
|
+
project
|
154
135
|
end
|
155
136
|
|
156
137
|
# Check if Testrail connection is available
|
@@ -161,27 +142,5 @@ module OnlyofficeTestrailWrapper
|
|
161
142
|
rescue StandardError
|
162
143
|
false
|
163
144
|
end
|
164
|
-
|
165
|
-
# endregion
|
166
|
-
|
167
|
-
def self.send_request(uri, request)
|
168
|
-
request.basic_auth admin_user, admin_pass
|
169
|
-
request.delete 'content-type'
|
170
|
-
request.add_field 'content-type', 'application/json'
|
171
|
-
is_ssl = (uri.scheme == 'https')
|
172
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: is_ssl) do |http|
|
173
|
-
attempts = 0
|
174
|
-
begin
|
175
|
-
response = http.request(request)
|
176
|
-
rescue Timeout::Error
|
177
|
-
attempts += 1
|
178
|
-
retry if attempts < 3
|
179
|
-
raise 'Timeout error after 3 attempts'
|
180
|
-
rescue StandardError => e
|
181
|
-
raise e
|
182
|
-
end
|
183
|
-
return response
|
184
|
-
end
|
185
|
-
end
|
186
145
|
end
|
187
146
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeTestrailWrapper
|
4
|
+
# Base class for all Testrail API objects
|
5
|
+
class TestrailApiObject
|
6
|
+
# Fill object data from hash with data
|
7
|
+
# @param [Hash] hash with data
|
8
|
+
# @return
|
9
|
+
def init_from_hash(hash)
|
10
|
+
hash.each { |key, value| instance_variable_set("@#{key}", value) }
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
# Generate hash wih pars of name:id
|
15
|
+
# @param [Array<Hash>] array of raw data
|
16
|
+
# @param [String, Symbol] name_key how name key is called in hash
|
17
|
+
# @return [Hash] result hash data
|
18
|
+
def name_id_pairs(array, name_key = 'name')
|
19
|
+
raise 'First argument must be Array!' unless array.is_a?(Array)
|
20
|
+
|
21
|
+
result_hash = {}
|
22
|
+
array.reverse_each { |element| result_hash[element[name_key]] = element['id'] }
|
23
|
+
result_hash
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module OnlyofficeTestrailWrapper
|
4
4
|
# @author Roman.Zagudaev
|
5
5
|
# Class for description of test case
|
6
|
-
class TestrailCase
|
6
|
+
class TestrailCase < TestrailApiObject
|
7
7
|
# @return [Integer] Id of test case
|
8
8
|
attr_accessor :id
|
9
9
|
# @return [String] title of test case
|
@@ -25,6 +25,7 @@ module OnlyofficeTestrailWrapper
|
|
25
25
|
# @param [Integer] id Id of test case
|
26
26
|
# @return [TestCaseTestrail] new test case
|
27
27
|
def initialize(title = nil, type_id = 3, priority_id = 4, custom_steps = nil, id = nil)
|
28
|
+
super()
|
28
29
|
@id = id
|
29
30
|
@title = title
|
30
31
|
@type_id = type_id
|
@@ -35,8 +36,11 @@ module OnlyofficeTestrailWrapper
|
|
35
36
|
def update(title = @title, type_id = @type_id, priority_id = @priority_id, custom_steps = @custom_steps)
|
36
37
|
@section.cases_names.delete @title
|
37
38
|
@section.cases_names[StringHelper.warnstrip!(title.to_s)] = @id
|
38
|
-
|
39
|
-
|
39
|
+
TestrailCase.new.init_from_hash(Testrail2.http_post("index.php?/api/v2/update_case/#{@id}",
|
40
|
+
title: title,
|
41
|
+
type_id: type_id,
|
42
|
+
priority_id: priority_id,
|
43
|
+
custom_steps: custom_steps))
|
40
44
|
end
|
41
45
|
|
42
46
|
def delete
|
@@ -47,13 +51,15 @@ module OnlyofficeTestrailWrapper
|
|
47
51
|
|
48
52
|
def get_results(run_id)
|
49
53
|
case_results = Testrail2.http_get "index.php?/api/v2/get_results_for_case/#{run_id}/#{@id}"
|
50
|
-
case_results.each_with_index { |test_case, index| case_results[index] =
|
54
|
+
case_results.each_with_index { |test_case, index| case_results[index] = TestrailResult.new.init_from_hash(test_case) }
|
51
55
|
case_results
|
52
56
|
end
|
53
57
|
|
54
58
|
def add_result(run_id, result, comment = '', custom_fields = {}, version = '')
|
55
|
-
response =
|
56
|
-
|
59
|
+
response = TestrailResult.new.init_from_hash(Testrail2.http_post("index.php?/api/v2/add_result_for_case/#{run_id}/#{@id}",
|
60
|
+
{ status_id: TestrailResult::RESULT_STATUSES[result],
|
61
|
+
comment: comment,
|
62
|
+
version: version }.merge(custom_fields)))
|
57
63
|
OnlyofficeLoggerHelper.log "Set test case result: #{result}. URL: #{Testrail2.get_testrail_address}index.php?/tests/view/#{response.test_id}", output_colors[result]
|
58
64
|
response
|
59
65
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeTestrailWrapper
|
4
|
+
# Class for exception then result contains `got` and `expected`
|
5
|
+
class ExampleFailedGotExpectedException
|
6
|
+
def initialize(example)
|
7
|
+
@example = example
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Symbol] result of this exception
|
11
|
+
def result
|
12
|
+
:failed
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String] comment for this exception
|
16
|
+
def comment
|
17
|
+
return @comment if @comment
|
18
|
+
|
19
|
+
failed_line = RspecHelper.find_failed_line(@example)
|
20
|
+
@comment = "\n#{@example.exception
|
21
|
+
.to_s
|
22
|
+
.gsub('got:', "got:\n")
|
23
|
+
.gsub('expected:', "expected:\n")}\nIn line:\n#{failed_line}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeTestrailWrapper
|
4
|
+
# Class for example with LPV exception
|
5
|
+
class ExampleLPVException
|
6
|
+
def initialize(example)
|
7
|
+
@example = example
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Symbol] result of this exception
|
11
|
+
def result
|
12
|
+
:lpv
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String] comment for this exception
|
16
|
+
def comment
|
17
|
+
"\n#{@example.exception}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeTestrailWrapper
|
4
|
+
# Class for example with exception `Service Unavailable`
|
5
|
+
class ExampleServiceUnavailableException
|
6
|
+
def initialize(example)
|
7
|
+
@example = example
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Symbol] result of this exception
|
11
|
+
def result
|
12
|
+
:service_unavailable
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [String] comment for this exception
|
16
|
+
def comment
|
17
|
+
"\n#{@example.exception}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'onlyoffice_bugzilla_helper'
|
4
4
|
require_relative 'testrail_helper/testrail_helper_rspec_metadata'
|
5
|
-
require_relative 'testrail_helper/
|
5
|
+
require_relative 'testrail_helper/example_failed_got_expected_exception'
|
6
|
+
require_relative 'testrail_helper/example_lpv_exception'
|
7
|
+
require_relative 'testrail_helper/example_service_unavailable_exception'
|
6
8
|
require_relative 'testrail'
|
7
9
|
require_relative 'helpers/ruby_helper'
|
8
10
|
require_relative 'helpers/system_helper'
|
@@ -12,9 +14,8 @@ module OnlyofficeTestrailWrapper
|
|
12
14
|
class TestrailHelper
|
13
15
|
include RubyHelper
|
14
16
|
include TestrailHelperRspecMetadata
|
15
|
-
include TestrailStatusHelper
|
16
17
|
attr_reader :project, :plan, :suite, :run
|
17
|
-
attr_accessor :add_all_suites, :
|
18
|
+
attr_accessor :add_all_suites, :suites_to_add, :in_debug, :version
|
18
19
|
|
19
20
|
def initialize(project_name, suite_name = nil, plan_name = nil, run_name = nil)
|
20
21
|
@in_debug = debug?
|
@@ -23,7 +24,7 @@ module OnlyofficeTestrailWrapper
|
|
23
24
|
rescue Errno::ENOENT
|
24
25
|
@bugzilla_helper = nil
|
25
26
|
end
|
26
|
-
if
|
27
|
+
if skip_testrail_connection?
|
27
28
|
OnlyofficeLoggerHelper.log 'Do not initialize Testrail, because spec run in debug'
|
28
29
|
@run = TestrailRun.new
|
29
30
|
return
|
@@ -31,11 +32,10 @@ module OnlyofficeTestrailWrapper
|
|
31
32
|
OnlyofficeLoggerHelper.log 'Begin initializing Testrail...'
|
32
33
|
@suites_to_add = []
|
33
34
|
@add_all_suites = true
|
34
|
-
@search_plan_by_substring = false
|
35
35
|
yield(self) if block_given?
|
36
36
|
@project = Testrail2.new.project project_name.to_s.dup
|
37
37
|
if plan_name
|
38
|
-
@plan = @project.get_plan_by_name(
|
38
|
+
@plan = @project.get_plan_by_name(plan_name.to_s)
|
39
39
|
@plan ||= @project.create_new_plan(plan_name, suites_to_add_hash(@add_all_suites ? all_suites_names : @suites_to_add))
|
40
40
|
end
|
41
41
|
return if suite_name.nil?
|
@@ -71,10 +71,7 @@ module OnlyofficeTestrailWrapper
|
|
71
71
|
end
|
72
72
|
exception = example.exception
|
73
73
|
custom_fields = init_custom_fields(example)
|
74
|
-
if
|
75
|
-
comment += "\nTest ignored by #{ignored_hash}"
|
76
|
-
result = :blocked
|
77
|
-
elsif example.pending
|
74
|
+
if example.pending
|
78
75
|
result, comment, bug_id = parse_pending_comment(example.execution_result.pending_message)
|
79
76
|
if example.exception.to_s == 'Expected example to fail since it is pending, but it passed.'
|
80
77
|
result = :failed
|
@@ -84,18 +81,20 @@ module OnlyofficeTestrailWrapper
|
|
84
81
|
example.add_custom_exception(comment) if result == :failed
|
85
82
|
result = :lpv if comment.downcase.include?('limited program version')
|
86
83
|
elsif exception.to_s.include?('got:') || exception.to_s.include?('expected:')
|
87
|
-
|
88
|
-
|
89
|
-
comment +=
|
84
|
+
testrail_exception = ExampleFailedGotExpectedException.new(example)
|
85
|
+
result = testrail_exception.result
|
86
|
+
comment += testrail_exception.comment
|
90
87
|
elsif exception.to_s.include?('to return') || exception.to_s.include?('expected')
|
91
88
|
result = :failed
|
92
89
|
comment += "\n#{exception.to_s.gsub('to return ', "to return:\n").gsub(', got ', "\ngot:\n")}"
|
93
90
|
elsif exception.to_s.include?('Service Unavailable')
|
94
|
-
|
95
|
-
|
91
|
+
testrail_exception = ExampleServiceUnavailableException.new(example)
|
92
|
+
result = testrail_exception.result
|
93
|
+
comment += testrail_exception.comment
|
96
94
|
elsif exception.to_s.include?('Limited program version')
|
97
|
-
|
98
|
-
|
95
|
+
testrail_exception = ExampleLPVException.new(exception)
|
96
|
+
result = testrail_exception.result
|
97
|
+
comment += testrail_exception.comment
|
99
98
|
elsif exception.nil?
|
100
99
|
result = if @last_case == example.description
|
101
100
|
:passed_2
|
@@ -114,29 +113,8 @@ module OnlyofficeTestrailWrapper
|
|
114
113
|
@suite.section(section_name).case(example.description).add_result @run.id, result, comment, custom_fields
|
115
114
|
end
|
116
115
|
|
117
|
-
def add_result_by_case_name(name, result, comment = 'ok', section_name = 'All Test Cases')
|
118
|
-
@suite.section(section_name).case(name.to_s).add_result(@run.id, result, comment)
|
119
|
-
end
|
120
|
-
|
121
116
|
def get_incomplete_tests
|
122
|
-
@run.get_tests.
|
123
|
-
end
|
124
|
-
|
125
|
-
# @param [Array] result. Example: [:retest, :passed]
|
126
|
-
def get_tests_by_result(result)
|
127
|
-
check_status_exist(result)
|
128
|
-
result = [result] unless result.is_a?(Array)
|
129
|
-
@run.get_tests.map { |test| test['title'] if result.include?(TestrailResult::RESULT_STATUSES.key(test['status_id'])) }.compact
|
130
|
-
end
|
131
|
-
|
132
|
-
def delete_plan(plan_name)
|
133
|
-
@project.plan(get_plan_name_by_substring(plan_name.to_s)).delete
|
134
|
-
end
|
135
|
-
|
136
|
-
def mark_rest_environment_dependencies(supported_test_list, status_to_mark = :lpv)
|
137
|
-
get_incomplete_tests.each do |current_test|
|
138
|
-
add_result_by_case_name(current_test, status_to_mark, 'Not supported on this test environment') unless supported_test_list.include?(current_test)
|
139
|
-
end
|
117
|
+
@run.get_tests.filter_map { |test| test['title'] if test['status_id'] == 3 || test['status_id'] == 4 }
|
140
118
|
end
|
141
119
|
|
142
120
|
private
|
@@ -147,11 +125,6 @@ module OnlyofficeTestrailWrapper
|
|
147
125
|
OnlyofficeLoggerHelper.log("Initialized run: #{@run.name}")
|
148
126
|
end
|
149
127
|
|
150
|
-
def get_plan_name_by_substring(string)
|
151
|
-
@project.get_plans.each { |plan| return plan['name'] if plan['name'].include?(string) }
|
152
|
-
string
|
153
|
-
end
|
154
|
-
|
155
128
|
def all_suites_names
|
156
129
|
@suites ? (return @suites) : @suites = []
|
157
130
|
@project.get_suites
|
@@ -159,15 +132,19 @@ module OnlyofficeTestrailWrapper
|
|
159
132
|
@suites.sort!
|
160
133
|
end
|
161
134
|
|
162
|
-
def ignore_case?(example_metadata)
|
163
|
-
raise 'Ignore parameters must be Hash!!' unless @ignore_parameters.instance_of?(Hash)
|
164
|
-
|
165
|
-
@ignore_parameters.each { |key, value| return { key => value } if example_metadata[key] == value }
|
166
|
-
false
|
167
|
-
end
|
168
|
-
|
169
135
|
def suites_to_add_hash(suites_names)
|
170
136
|
suites_names.map { |suite| all_suites_names.include?(suite) ? { 'suite_id' => @project.suites_names[suite] } : { 'suite_id' => @project.create_new_suite(suite).id } }
|
171
137
|
end
|
138
|
+
|
139
|
+
# Check if we should skip connecting to testrail
|
140
|
+
# In debug mode (except when `TESTRAIL_IN_DEBUG` env is set)
|
141
|
+
# we do not do that for easy debugging E2E tests
|
142
|
+
# @return [Boolean]
|
143
|
+
def skip_testrail_connection?
|
144
|
+
return false unless @in_debug
|
145
|
+
return false if ENV['TESTRAIL_IN_DEBUG']
|
146
|
+
|
147
|
+
true
|
148
|
+
end
|
172
149
|
end
|
173
150
|
end
|
@@ -1,21 +1,39 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module OnlyofficeTestrailWrapper
|
4
|
-
|
5
|
-
|
4
|
+
# Class for describing milestone data
|
5
|
+
class TestrailMilestone < TestrailApiObject
|
6
|
+
# @return [Integer] id of milestone
|
7
|
+
attr_accessor :id
|
8
|
+
# @return [String] name of milestone
|
9
|
+
attr_accessor :name
|
10
|
+
# @return [String] description of milestone
|
11
|
+
attr_accessor :description
|
12
|
+
# @return [Boolean] is this milestone completed
|
13
|
+
attr_accessor :is_completed
|
6
14
|
|
7
15
|
def initialize(name = '', description = '', is_completed = false, id = nil)
|
16
|
+
super()
|
8
17
|
@id = id.to_i
|
9
18
|
@name = name
|
10
19
|
@description = description
|
11
20
|
@is_completed = is_completed
|
12
21
|
end
|
13
22
|
|
23
|
+
# Update current milestone
|
24
|
+
# @param [Boolean] is_completed is milestone should be completed
|
25
|
+
# @param [String] name new name of milestone
|
26
|
+
# @param [String] description new description of milestone
|
27
|
+
# @return [TestrailMilestone] updated milestone data
|
14
28
|
def update(is_completed = false, name = @name, description = @description)
|
15
|
-
|
16
|
-
|
29
|
+
TestrailMilestone.new.init_from_hash(Testrail2.http_post("index.php?/api/v2/update_milestone/#{@id}",
|
30
|
+
name: name,
|
31
|
+
description: description,
|
32
|
+
is_completed: is_completed))
|
17
33
|
end
|
18
34
|
|
35
|
+
# Delete current milestone
|
36
|
+
# @return [Hash] result of http request
|
19
37
|
def delete
|
20
38
|
Testrail2.http_post "index.php?/api/v2/delete_milestone/#{@id}", {}
|
21
39
|
end
|