Class: GitlabQuality::TestTooling::TestResult::BaseTestResult

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

Direct Known Subclasses

JUnitTestResult, JsonTestResult

Constant Summary collapse

IGNORED_FAILURES =
[
  "Net::ReadTimeout",
  "403 Forbidden - Your account has been blocked",
  "API failed (502) with `GitLab is not responding",
  "Error Code: 502",
  "unexpected token at 'GitLab is not responding'",
  "GitLab: Internal API error (502).",
  "could not be found (502)",
  "Error reference number: 502",
  "(502): `GitLab is not responding`",
  "<head><title>502 Bad Gateway</title></head>",
  "14:connections to all backends failing",
  "gitlab_canary=true cookie was set in browser but 'Next' badge was not shown on UI"
].freeze
SHARED_EXAMPLES_CALLERS =
%w[include_examples it_behaves_like].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(report:, token: '', project: Runtime::Env.ci_project_path, ref: Runtime::Env.ci_commit_ref_name) ⇒ BaseTestResult

Returns a new instance of BaseTestResult.



26
27
28
29
30
31
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 26

def initialize(report:, token: '', project: Runtime::Env.ci_project_path, ref: Runtime::Env.ci_commit_ref_name)
  @report = report
  @token = token
  @project = project
  @ref = ref
end

Instance Attribute Details

#reportObject (readonly)

Returns the value of attribute report.



24
25
26
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 24

def report
  @report
end

Instance Method Details

#calls_shared_examples?Boolean

Returns:

  • (Boolean)


153
154
155
156
157
158
159
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 153

def calls_shared_examples?
  reported_line = files_client.file_contents_at_line(line_number)

  return false unless reported_line

  SHARED_EXAMPLES_CALLERS.any? { |caller_method| reported_line.strip.start_with?(caller_method) }
end

#categoryObject

Raises:

  • (NotImplementedError)


49
50
51
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 49

def category
  raise NotImplementedError
end

#conditional_quarantine?Boolean

Returns:

  • (Boolean)


112
113
114
115
116
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 112

def conditional_quarantine?
  return true if quarantine? && quarantine.is_a?(Hash) && quarantine.has_key?('only')

  false
end

#failure_issueObject



81
82
83
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 81

def failure_issue
  report['failure_issue']
end

#failure_issue=(new_failure_issue) ⇒ Object



85
86
87
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 85

def failure_issue=(new_failure_issue)
  report['failure_issue'] = new_failure_issue
end

#failuresObject

Raises:

  • (NotImplementedError)


57
58
59
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 57

def failures
  raise NotImplementedError
end

#failures?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 69

def failures?
  failures.any?
end

#feature_categoryObject



65
66
67
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 65

def feature_category
  report['feature_category']
end

#feature_category?Boolean

Returns:

  • (Boolean)


77
78
79
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 77

def feature_category?
  feature_category && !feature_category.empty?
end

#fileObject



118
119
120
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 118

def file
  @file ||= relative_file.start_with?('qa/') ? "qa/#{relative_file}" : relative_file
end

#file_base_urlObject



122
123
124
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 122

def file_base_url
  @file_base_url ||= "https://gitlab.com/#{mapped_project}/-/blob/#{ref}/"
end

#files_clientObject



161
162
163
164
165
166
167
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 161

def files_client
  @files_client ||= GitlabClient::RepositoryFilesClient.new(
    token: token,
    project: mapped_project,
    file_path: file,
    ref: ref.nil? || ref.empty? ? 'master' : ref)
end

#full_stacktraceObject



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 130

def full_stacktrace
  page_error_failure = ""
  first_non_ignored_failure = ""

  failures.each do |failure|
    message = failure['message'] || ""
    message_lines = failure['message_lines'] || []

    next if IGNORED_FAILURES.any? { |e| message.include?(e) }

    formatted_failure = message_lines.empty? ? message : message_lines.join("\n")

    if message.include?("PageErrorChecker")
      page_error_failure = formatted_failure
    elsif first_non_ignored_failure.empty?
      first_non_ignored_failure = formatted_failure
    end
  end

  # Return PageErrorChecker failure if found, otherwise first non-ignored failure
  page_error_failure.empty? ? first_non_ignored_failure : page_error_failure
end

#levelObject



93
94
95
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 93

def level
  report['level']
end

#line_numberObject



89
90
91
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 89

def line_number
  report['line_number']
end

#nameObject

Raises:

  • (NotImplementedError)


37
38
39
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 37

def name
  raise NotImplementedError
end

#product_groupObject



61
62
63
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 61

def product_group
  report['product_group'].to_s
end

#product_group?Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 73

def product_group?
  product_group != ''
end

#quarantine?Boolean

Returns:

  • (Boolean)


105
106
107
108
109
110
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 105

def quarantine?
  # The value for 'quarantine' could be nil, a hash, a string,
  # or true (if the test just has the :quarantine tag)
  # But any non-nil or false value should means the test is in quarantine
  !!quarantine
end

#relative_fileObject

Raises:

  • (NotImplementedError)


41
42
43
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 41

def relative_file
  raise NotImplementedError
end

#run_timeObject



97
98
99
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 97

def run_time
  report['run_time'].to_f.round(2)
end

#screenshot?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 101

def screenshot?
  !!screenshot
end

#sectionObject

Raises:

  • (NotImplementedError)


45
46
47
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 45

def section
  raise NotImplementedError
end

#skipped?Boolean

Returns:

  • (Boolean)

Raises:

  • (NotImplementedError)


53
54
55
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 53

def skipped?
  raise NotImplementedError
end

#stageObject



33
34
35
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 33

def stage
  @stage ||= file[%r{(?:api|browser_ui)/(?:(?:\d+_)?(\w+))}, 1] || category
end


126
127
128
# File 'lib/gitlab_quality/test_tooling/test_result/base_test_result.rb', line 126

def test_file_link
  "[`#{file}#L#{line_number}`](#{file_base_url}#{file}#L#{line_number})"
end