gitlab_quality-test_tooling 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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