Class: GitlabQuality::TestTooling::TestResult::JsonTestResult

Inherits:
BaseTestResult
  • Object
show all
Defined in:
lib/gitlab_quality/test_tooling/test_result/json_test_result.rb

Defined Under Namespace

Classes: TestLevelSpecification

Constant Summary collapse

PRIVATE_TOKEN_REGEX =
/(private_token=)[\w-]+/
AUTHENTICATION_TOKEN_REGEX =
/("Authorization": \[\n\s*"token )([\w-]+)/
OTHER_TESTS_MAX_DURATION =

seconds

45.40
TEST_LEVEL_SPECIFICATIONS =
[
  TestLevelSpecification.new(%r{spec/features/}, 50.13),
  TestLevelSpecification.new(%r{spec/(controllers|requests)/}, 19.20),
  TestLevelSpecification.new(%r{spec/lib/}, 27.12),
  TestLevelSpecification.new(%r{qa/specs/features/}, 240)
].freeze

Constants inherited from BaseTestResult

BaseTestResult::IGNORED_FAILURES, BaseTestResult::SHARED_EXAMPLES_CALLERS

Instance Attribute Summary

Attributes inherited from BaseTestResult

#report

Instance Method Summary collapse

Methods inherited from BaseTestResult

#calls_shared_examples?, #conditional_quarantine?, #failure_issue, #failure_issue=, #failures?, #feature_category, #feature_category?, #file, #file_base_url, #files_client, #full_stacktrace, #initialize, #level, #line_number, #product_group, #product_group?, #quarantine?, #run_time, #screenshot?, #stage, #test_file_link

Constructor Details

This class inherits a constructor from GitlabQuality::TestTooling::TestResult::BaseTestResult

Instance Method Details

#allowed_to_be_slow?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 121

def allowed_to_be_slow?
  !!report['allowed_to_be_slow']
end

#categoryObject



87
88
89
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 87

def category
  report['category']
end

#ci_job_idObject



95
96
97
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 95

def ci_job_id
  report['ci_job_url'].split('/').last
end

#ci_job_urlObject



59
60
61
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 59

def ci_job_url
  report.fetch('ci_job_url', '')
end

#example_idObject



91
92
93
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 91

def example_id
  report['id']
end

#failed?Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 55

def failed?
  status == 'failed'
end

#failuresObject

rubocop:disable Metrics/AbcSize



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 99

def failures # rubocop:disable Metrics/AbcSize
  @failures ||=
    report.fetch('exceptions', []).filter_map do |exception|
      backtrace = exception['backtrace']
      next unless backtrace.respond_to?(:rindex)

      spec_file_first_index = backtrace.rindex do |line|
        line.include?(File.basename(report['file_path']))
      end

      message = redact_private_and_auth_tokens(exception['message'])
      message_lines = Array(exception['message_lines']).map { |line| redact_private_and_auth_tokens(line) }

      {
        'message' => "#{exception['class']}: #{message}",
        'message_lines' => message_lines,
        'stacktrace' => "#{format_message_lines(message_lines)}\n#{backtrace.slice(0..spec_file_first_index).join("\n")}",
        'correlation_id' => exception['correlation_id']
      }
    end
end

#max_duration_for_testObject



129
130
131
132
133
134
135
136
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 129

def max_duration_for_test
  test_level_specification = TEST_LEVEL_SPECIFICATIONS.find do |test_level_specification|
    example_id =~ test_level_specification.regex
  end
  return OTHER_TESTS_MAX_DURATION unless test_level_specification

  test_level_specification.max_duration
end

#nameObject



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 21

def name
  # If we see a string representation of an object in a test full_description, we discard it.
  #
  # This is to ensure that tests would have a reproducible name, in case they don't have a name.
  #
  # Test example:
  #
  # it { is_expected.to eq(secondary_node) }
  #
  # Would have its full_description as follows:
  #
  # Gitlab::Geo.proxied_site on a primary for a proxied request with a proxy extra data header
  # for an existing site is expected to eq #<GeoNode id: 116, primary: false, oauth_application_id: 97
  # , enabled: true, access_key: [FILTERED], e...pdated_at: "2023-10-10 08:49:49.797128469 +0000",
  # sync_object_storage: true, secret_access_key: nil>
  #
  # Which would change for every test run due to the timestamps.
  #
  # See https://gitlab.com/gitlab-org/ruby/gems/gitlab_quality-test_tooling/-/merge_requests/77#note_1608793804
  report.fetch('full_description').split('#<').first
end

#quarantine_issueObject



75
76
77
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 75

def quarantine_issue
  quarantine['issue'] if quarantine?
end

#quarantine_typeObject



71
72
73
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 71

def quarantine_type
  quarantine['type'] if quarantine?
end

#relative_fileObject



43
44
45
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 43

def relative_file
  report.fetch('file_path').delete_prefix('./')
end

#screenshot_imageObject



79
80
81
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 79

def screenshot_image
  screenshot['image'] if screenshot?
end

#sectionObject



83
84
85
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 83

def section
  report['section']
end

#skipped?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 51

def skipped?
  status == 'pending'
end

#slow_test?Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 125

def slow_test?
  !allowed_to_be_slow? && run_time > max_duration_for_test
end

#statusObject



47
48
49
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 47

def status
  report.fetch('status')
end

#testcaseObject



63
64
65
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 63

def testcase
  report.fetch('testcase', '')
end

#testcase=(new_testcase) ⇒ Object



67
68
69
# File 'lib/gitlab_quality/test_tooling/test_result/json_test_result.rb', line 67

def testcase=(new_testcase)
  report['testcase'] = new_testcase
end