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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +9 -4
  3. data/Gemfile.lock +1 -1
  4. data/Guardfile +0 -22
  5. data/exe/generate-test-session +49 -0
  6. data/exe/post-to-slack +57 -0
  7. data/exe/prepare-stage-reports +38 -0
  8. data/exe/relate-failure-issue +59 -0
  9. data/exe/report-results +56 -0
  10. data/exe/update-screenshot-paths +38 -0
  11. data/lib/gitlab_quality/test_tooling/gitlab_issue_client.rb +194 -0
  12. data/lib/gitlab_quality/test_tooling/gitlab_issue_dry_client.rb +26 -0
  13. data/lib/gitlab_quality/test_tooling/report/concerns/find_set_dri.rb +51 -0
  14. data/lib/gitlab_quality/test_tooling/report/concerns/results_reporter.rb +75 -0
  15. data/lib/gitlab_quality/test_tooling/report/concerns/utils.rb +49 -0
  16. data/lib/gitlab_quality/test_tooling/report/generate_test_session.rb +275 -0
  17. data/lib/gitlab_quality/test_tooling/report/prepare_stage_reports.rb +79 -0
  18. data/lib/gitlab_quality/test_tooling/report/relate_failure_issue.rb +377 -0
  19. data/lib/gitlab_quality/test_tooling/report/report_as_issue.rb +134 -0
  20. data/lib/gitlab_quality/test_tooling/report/report_results.rb +83 -0
  21. data/lib/gitlab_quality/test_tooling/report/results_in_issues.rb +130 -0
  22. data/lib/gitlab_quality/test_tooling/report/results_in_testcases.rb +113 -0
  23. data/lib/gitlab_quality/test_tooling/report/update_screenshot_path.rb +81 -0
  24. data/lib/gitlab_quality/test_tooling/runtime/env.rb +113 -0
  25. data/lib/gitlab_quality/test_tooling/runtime/logger.rb +92 -0
  26. data/lib/gitlab_quality/test_tooling/runtime/token_finder.rb +44 -0
  27. data/lib/gitlab_quality/test_tooling/slack/post_to_slack.rb +36 -0
  28. data/lib/gitlab_quality/test_tooling/summary_table.rb +41 -0
  29. data/lib/gitlab_quality/test_tooling/support/http_request.rb +34 -0
  30. data/lib/gitlab_quality/test_tooling/system_logs/finders/json_log_finder.rb +65 -0
  31. data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/api_log_finder.rb +21 -0
  32. data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/application_log_finder.rb +21 -0
  33. data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/exception_log_finder.rb +21 -0
  34. data/lib/gitlab_quality/test_tooling/system_logs/finders/rails/graphql_log_finder.rb +21 -0
  35. data/lib/gitlab_quality/test_tooling/system_logs/log_types/log.rb +38 -0
  36. data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/api_log.rb +34 -0
  37. data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/application_log.rb +27 -0
  38. data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/exception_log.rb +23 -0
  39. data/lib/gitlab_quality/test_tooling/system_logs/log_types/rails/graphql_log.rb +30 -0
  40. data/lib/gitlab_quality/test_tooling/system_logs/shared_fields.rb +29 -0
  41. data/lib/gitlab_quality/test_tooling/system_logs/system_logs_formatter.rb +65 -0
  42. data/lib/gitlab_quality/test_tooling/test_results/base_test_results.rb +39 -0
  43. data/lib/gitlab_quality/test_tooling/test_results/builder.rb +35 -0
  44. data/lib/gitlab_quality/test_tooling/test_results/j_unit_test_results.rb +27 -0
  45. data/lib/gitlab_quality/test_tooling/test_results/json_test_results.rb +29 -0
  46. data/lib/gitlab_quality/test_tooling/test_results/test_result.rb +184 -0
  47. data/lib/gitlab_quality/test_tooling/version.rb +1 -1
  48. data/lib/gitlab_quality/test_tooling.rb +11 -2
  49. 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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module GitlabQuality
4
4
  module TestTooling
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -1,10 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "test_tooling/version"
3
+ require 'rainbow/refinement'
4
+ require 'zeitwerk'
4
5
 
5
6
  module GitlabQuality
6
7
  module TestTooling
7
8
  Error = Class.new(StandardError)
8
- # Your code goes here...
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.1.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-04 00:00:00.000000000 Z
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