Welcome to mirror list, hosted at ThFree Co, Russian Federation.

test_cases_service.rb « ci « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3139b567571c54116c0d81f69711876a6d012d31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# frozen_string_literal: true

module Ci
  class TestCasesService
    MAX_TRACKABLE_FAILURES = 200

    def execute(build)
      return unless Feature.enabled?(:test_failure_history, build.project)
      return unless build.has_test_reports?
      return unless build.project.default_branch_or_master == build.ref

      test_suite = generate_test_suite_report(build)

      track_failures(build, test_suite)
    end

    private

    def generate_test_suite_report(build)
      build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
    end

    def track_failures(build, test_suite)
      return if test_suite.failed_count > MAX_TRACKABLE_FAILURES

      test_suite.failed.keys.each_slice(100) do |keys|
        Ci::TestCase.transaction do
          test_cases = Ci::TestCase.find_or_create_by_batch(build.project, keys)
          Ci::TestCaseFailure.insert_all(test_case_failures(test_cases, build))
        end
      end
    end

    def test_case_failures(test_cases, build)
      test_cases.map do |test_case|
        {
          test_case_id: test_case.id,
          build_id: build.id,
          failed_at: build.finished_at
        }
      end
    end
  end
end