gitlab_quality-test_tooling 0.1.0 → 0.2.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/.rubocop.yml +9 -4
- data/Gemfile.lock +1 -1
- data/Guardfile +0 -22
- data/exe/generate-test-session +49 -0
- data/exe/post-to-slack +57 -0
- data/exe/prepare-stage-reports +38 -0
- data/exe/relate-failure-issue +59 -0
- data/exe/report-results +56 -0
- data/exe/update-screenshot-paths +38 -0
- data/lib/gitlab_quality/test_tooling/gitlab_issue_client.rb +194 -0
- data/lib/gitlab_quality/test_tooling/gitlab_issue_dry_client.rb +26 -0
- data/lib/gitlab_quality/test_tooling/report/concerns/find_set_dri.rb +51 -0
- data/lib/gitlab_quality/test_tooling/report/concerns/results_reporter.rb +75 -0
- data/lib/gitlab_quality/test_tooling/report/concerns/utils.rb +49 -0
- data/lib/gitlab_quality/test_tooling/report/generate_test_session.rb +275 -0
- data/lib/gitlab_quality/test_tooling/report/prepare_stage_reports.rb +79 -0
- data/lib/gitlab_quality/test_tooling/report/relate_failure_issue.rb +377 -0
- data/lib/gitlab_quality/test_tooling/report/report_as_issue.rb +134 -0
- data/lib/gitlab_quality/test_tooling/report/report_results.rb +83 -0
- data/lib/gitlab_quality/test_tooling/report/results_in_issues.rb +130 -0
- data/lib/gitlab_quality/test_tooling/report/results_in_testcases.rb +113 -0
- data/lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb +81 -0
- data/lib/gitlab_quality/test_tooling/runtime/env.rb +113 -0
- data/lib/gitlab_quality/test_tooling/runtime/logger.rb +92 -0
- data/lib/gitlab_quality/test_tooling/runtime/token_finder.rb +44 -0
- data/lib/gitlab_quality/test_tooling/slack/post_to_slack.rb +36 -0
- data/lib/gitlab_quality/test_tooling/summary_table.rb +41 -0
- data/lib/gitlab_quality/test_tooling/support/http_request.rb +34 -0
- data/lib/gitlab_quality/test_tooling/system_logs/finders/json_log_finder.rb +65 -0
- data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/api_log_finder.rb +21 -0
- data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/application_log_finder.rb +21 -0
- data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/exception_log_finder.rb +21 -0
- data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/graphql_log_finder.rb +21 -0
- data/lib/gitlab_quality/test_tooling/system_logs/log_types/log.rb +38 -0
- data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/api_log.rb +34 -0
- data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/application_log.rb +27 -0
- data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/exception_log.rb +23 -0
- data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/graphql_log.rb +30 -0
- data/lib/gitlab_quality/test_tooling/system_logs/shared_fields.rb +29 -0
- data/lib/gitlab_quality/test_tooling/system_logs/system_logs_formatter.rb +65 -0
- data/lib/gitlab_quality/test_tooling/test_results/base_test_results.rb +39 -0
- data/lib/gitlab_quality/test_tooling/test_results/builder.rb +35 -0
- data/lib/gitlab_quality/test_tooling/test_results/j_unit_test_results.rb +27 -0
- data/lib/gitlab_quality/test_tooling/test_results/json_test_results.rb +29 -0
- data/lib/gitlab_quality/test_tooling/test_results/test_result.rb +184 -0
- data/lib/gitlab_quality/test_tooling/version.rb +1 -1
- data/lib/gitlab_quality/test_tooling.rb +11 -2
- metadata +51 -3
@@ -0,0 +1,184 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/core_ext/object/blank'
|
4
|
+
|
5
|
+
module GitlabQuality
|
6
|
+
module TestTooling
|
7
|
+
module TestResults
|
8
|
+
class TestResult
|
9
|
+
def self.from_json(report)
|
10
|
+
JsonTestResult.new(report)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.from_junit(report)
|
14
|
+
JUnitTestResult.new(report)
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :report, :failures
|
18
|
+
|
19
|
+
def initialize(report)
|
20
|
+
self.report = report
|
21
|
+
self.failures = failures_from_exceptions
|
22
|
+
end
|
23
|
+
|
24
|
+
def stage
|
25
|
+
@stage ||= file[%r{(?:api|browser_ui)/(?:(?:\d+_)?(\w+))}, 1]
|
26
|
+
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
raise NotImplementedError
|
30
|
+
end
|
31
|
+
|
32
|
+
def file
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
def skipped
|
37
|
+
raise NotImplementedError
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def failures_from_exceptions
|
43
|
+
raise NotImplementedError
|
44
|
+
end
|
45
|
+
|
46
|
+
class JsonTestResult < TestResult
|
47
|
+
def name
|
48
|
+
report['full_description']
|
49
|
+
end
|
50
|
+
|
51
|
+
def file
|
52
|
+
report['file_path'].delete_prefix('./')
|
53
|
+
end
|
54
|
+
|
55
|
+
def status
|
56
|
+
report['status']
|
57
|
+
end
|
58
|
+
|
59
|
+
def ci_job_url
|
60
|
+
report['ci_job_url']
|
61
|
+
end
|
62
|
+
|
63
|
+
def skipped
|
64
|
+
status == 'pending'
|
65
|
+
end
|
66
|
+
|
67
|
+
def testcase
|
68
|
+
report['testcase']
|
69
|
+
end
|
70
|
+
|
71
|
+
def testcase=(new_testcase)
|
72
|
+
report['testcase'] = new_testcase
|
73
|
+
end
|
74
|
+
|
75
|
+
def failure_issue
|
76
|
+
report['failure_issue']
|
77
|
+
end
|
78
|
+
|
79
|
+
def failure_issue=(new_failure_issue)
|
80
|
+
report['failure_issue'] = new_failure_issue
|
81
|
+
end
|
82
|
+
|
83
|
+
def quarantine?
|
84
|
+
# The value for 'quarantine' could be nil, a hash, a string,
|
85
|
+
# or true (if the test just has the :quarantine tag)
|
86
|
+
# But any non-nil or false value should means the test is in quarantine
|
87
|
+
report['quarantine'].present?
|
88
|
+
end
|
89
|
+
|
90
|
+
def quarantine_type
|
91
|
+
report['quarantine']['type'] if quarantine?
|
92
|
+
end
|
93
|
+
|
94
|
+
def quarantine_issue
|
95
|
+
report['quarantine']['issue'] if quarantine?
|
96
|
+
end
|
97
|
+
|
98
|
+
def screenshot?
|
99
|
+
report['screenshot'].present?
|
100
|
+
end
|
101
|
+
|
102
|
+
def failure_screenshot
|
103
|
+
report['screenshot']['image'] if screenshot?
|
104
|
+
end
|
105
|
+
|
106
|
+
def product_group?
|
107
|
+
report['product_group'].present?
|
108
|
+
end
|
109
|
+
|
110
|
+
def product_group
|
111
|
+
report['product_group'] if product_group?
|
112
|
+
end
|
113
|
+
|
114
|
+
private
|
115
|
+
|
116
|
+
# rubocop:disable Metrics/AbcSize
|
117
|
+
def failures_from_exceptions
|
118
|
+
return [] unless report.key?('exceptions')
|
119
|
+
|
120
|
+
report['exceptions'].map do |exception|
|
121
|
+
spec_file_first_index = exception['backtrace'].rindex do |line|
|
122
|
+
line.include?(File.basename(report['file_path']))
|
123
|
+
end
|
124
|
+
|
125
|
+
exception['message'].gsub!(/(private_token=)[\w-]+/, '********')
|
126
|
+
Array(exception['message_lines']).each { |line| line.gsub!(/(private_token=)([\w-]+)/, '********') }
|
127
|
+
|
128
|
+
{
|
129
|
+
'message' => "#{exception['class']}: #{exception['message']}",
|
130
|
+
'message_lines' => exception['message_lines'],
|
131
|
+
'stacktrace' => "#{format_message_lines(exception['message_lines'])}\n#{exception['backtrace'].slice(0..spec_file_first_index).join("\n")}",
|
132
|
+
'correlation_id' => exception['correlation_id']
|
133
|
+
}
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def format_message_lines(message_lines)
|
138
|
+
message_lines.is_a?(Array) ? message_lines.join("\n") : message_lines
|
139
|
+
end
|
140
|
+
# rubocop:enable Metrics/AbcSize
|
141
|
+
end
|
142
|
+
|
143
|
+
class JUnitTestResult < TestResult
|
144
|
+
def name
|
145
|
+
report['name']
|
146
|
+
end
|
147
|
+
|
148
|
+
def file
|
149
|
+
report['file'].delete_prefix('./')
|
150
|
+
end
|
151
|
+
|
152
|
+
def skipped
|
153
|
+
report.search('skipped').any?
|
154
|
+
end
|
155
|
+
|
156
|
+
attr_accessor :testcase # Ignore it for now
|
157
|
+
|
158
|
+
private
|
159
|
+
|
160
|
+
# rubocop:disable Metrics/AbcSize
|
161
|
+
def failures_from_exceptions
|
162
|
+
failures = report.search('failure')
|
163
|
+
return [] if failures.empty?
|
164
|
+
|
165
|
+
failures.map do |exception|
|
166
|
+
trace = exception.content.split("\n").map(&:strip)
|
167
|
+
spec_file_first_index = trace.rindex do |line|
|
168
|
+
line.include?(File.basename(report['file']))
|
169
|
+
end
|
170
|
+
|
171
|
+
exception['message'].gsub!(/(private_token=)[\w-]+/, '********')
|
172
|
+
|
173
|
+
{
|
174
|
+
'message' => "#{exception['type']}: #{exception['message']}",
|
175
|
+
'stacktrace' => trace.slice(0..spec_file_first_index).join("\n")
|
176
|
+
}
|
177
|
+
end
|
178
|
+
end
|
179
|
+
# rubocop:enable Metrics/AbcSize
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -1,10 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'rainbow/refinement'
|
4
|
+
require 'zeitwerk'
|
4
5
|
|
5
6
|
module GitlabQuality
|
6
7
|
module TestTooling
|
7
8
|
Error = Class.new(StandardError)
|
8
|
-
|
9
|
+
loader = Zeitwerk::Loader.new
|
10
|
+
loader.push_dir("#{__dir__}/test_tooling", namespace: GitlabQuality::TestTooling)
|
11
|
+
loader.ignore("#{__dir__}/test_tooling/version.rb")
|
12
|
+
|
13
|
+
loader.inflector.inflect(
|
14
|
+
'results_in_testcases' => 'ResultsInTestCases'
|
15
|
+
)
|
16
|
+
|
17
|
+
loader.setup
|
9
18
|
end
|
10
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitlab_quality-test_tooling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GitLab Quality
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -311,7 +311,13 @@ dependencies:
|
|
311
311
|
description: A collection of test-related tools.
|
312
312
|
email:
|
313
313
|
- quality@gitlab.com
|
314
|
-
executables:
|
314
|
+
executables:
|
315
|
+
- generate-test-session
|
316
|
+
- post-to-slack
|
317
|
+
- prepare-stage-reports
|
318
|
+
- relate-failure-issue
|
319
|
+
- report-results
|
320
|
+
- update-screenshot-paths
|
315
321
|
extensions: []
|
316
322
|
extra_rdoc_files: []
|
317
323
|
files:
|
@@ -328,8 +334,50 @@ files:
|
|
328
334
|
- LICENSE.txt
|
329
335
|
- README.md
|
330
336
|
- Rakefile
|
337
|
+
- exe/generate-test-session
|
338
|
+
- exe/post-to-slack
|
339
|
+
- exe/prepare-stage-reports
|
340
|
+
- exe/relate-failure-issue
|
341
|
+
- exe/report-results
|
342
|
+
- exe/update-screenshot-paths
|
331
343
|
- lefthook.yml
|
332
344
|
- lib/gitlab_quality/test_tooling.rb
|
345
|
+
- lib/gitlab_quality/test_tooling/gitlab_issue_client.rb
|
346
|
+
- lib/gitlab_quality/test_tooling/gitlab_issue_dry_client.rb
|
347
|
+
- lib/gitlab_quality/test_tooling/report/concerns/find_set_dri.rb
|
348
|
+
- lib/gitlab_quality/test_tooling/report/concerns/results_reporter.rb
|
349
|
+
- lib/gitlab_quality/test_tooling/report/concerns/utils.rb
|
350
|
+
- lib/gitlab_quality/test_tooling/report/generate_test_session.rb
|
351
|
+
- lib/gitlab_quality/test_tooling/report/prepare_stage_reports.rb
|
352
|
+
- lib/gitlab_quality/test_tooling/report/relate_failure_issue.rb
|
353
|
+
- lib/gitlab_quality/test_tooling/report/report_as_issue.rb
|
354
|
+
- lib/gitlab_quality/test_tooling/report/report_results.rb
|
355
|
+
- lib/gitlab_quality/test_tooling/report/results_in_issues.rb
|
356
|
+
- lib/gitlab_quality/test_tooling/report/results_in_testcases.rb
|
357
|
+
- lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb
|
358
|
+
- lib/gitlab_quality/test_tooling/runtime/env.rb
|
359
|
+
- lib/gitlab_quality/test_tooling/runtime/logger.rb
|
360
|
+
- lib/gitlab_quality/test_tooling/runtime/token_finder.rb
|
361
|
+
- lib/gitlab_quality/test_tooling/slack/post_to_slack.rb
|
362
|
+
- lib/gitlab_quality/test_tooling/summary_table.rb
|
363
|
+
- lib/gitlab_quality/test_tooling/support/http_request.rb
|
364
|
+
- lib/gitlab_quality/test_tooling/system_logs/finders/json_log_finder.rb
|
365
|
+
- lib/gitlab_quality/test_tooling/system_logs/finders/rails/api_log_finder.rb
|
366
|
+
- lib/gitlab_quality/test_tooling/system_logs/finders/rails/application_log_finder.rb
|
367
|
+
- lib/gitlab_quality/test_tooling/system_logs/finders/rails/exception_log_finder.rb
|
368
|
+
- lib/gitlab_quality/test_tooling/system_logs/finders/rails/graphql_log_finder.rb
|
369
|
+
- lib/gitlab_quality/test_tooling/system_logs/log_types/log.rb
|
370
|
+
- lib/gitlab_quality/test_tooling/system_logs/log_types/rails/api_log.rb
|
371
|
+
- lib/gitlab_quality/test_tooling/system_logs/log_types/rails/application_log.rb
|
372
|
+
- lib/gitlab_quality/test_tooling/system_logs/log_types/rails/exception_log.rb
|
373
|
+
- lib/gitlab_quality/test_tooling/system_logs/log_types/rails/graphql_log.rb
|
374
|
+
- lib/gitlab_quality/test_tooling/system_logs/shared_fields.rb
|
375
|
+
- lib/gitlab_quality/test_tooling/system_logs/system_logs_formatter.rb
|
376
|
+
- lib/gitlab_quality/test_tooling/test_results/base_test_results.rb
|
377
|
+
- lib/gitlab_quality/test_tooling/test_results/builder.rb
|
378
|
+
- lib/gitlab_quality/test_tooling/test_results/j_unit_test_results.rb
|
379
|
+
- lib/gitlab_quality/test_tooling/test_results/json_test_results.rb
|
380
|
+
- lib/gitlab_quality/test_tooling/test_results/test_result.rb
|
333
381
|
- lib/gitlab_quality/test_tooling/version.rb
|
334
382
|
- sig/gitlab_quality/test_tooling.rbs
|
335
383
|
homepage: https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling
|