summaryrefslogtreecommitdiff
path: root/spec/controllers/projects/pipelines/tests_controller_spec.rb
blob: 113781bab7c2a20ba57a4d4184f6945e7ac9b6fc (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe Projects::Pipelines::TestsController do
  let(:user) { create(:user) }
  let(:project) { create(:project, :public, :repository) }
  let(:pipeline) { create(:ci_pipeline, project: project) }

  before do
    sign_in(user)
  end

  describe 'GET #summary.json' do
    context 'when pipeline has build report results' do
      let(:pipeline) { create(:ci_pipeline, :with_report_results, project: project) }

      it 'renders test report summary data' do
        get_tests_summary_json

        expect(response).to have_gitlab_http_status(:ok)
        expect(json_response.dig('total', 'count')).to eq(2)
      end
    end

    context 'when pipeline does not have build report results' do
      it 'renders test report summary data' do
        get_tests_summary_json

        expect(response).to have_gitlab_http_status(:ok)
        expect(json_response.dig('total', 'count')).to eq(0)
      end
    end
  end

  describe 'GET #show.json' do
    context 'when pipeline has builds with test reports' do
      let(:main_pipeline) { create(:ci_pipeline, :with_test_reports_with_three_failures, project: project) }
      let(:pipeline) { create(:ci_pipeline, :with_test_reports_with_three_failures, project: project, ref: 'new-feature') }
      let(:suite_name) { 'test' }
      let(:build_ids) { pipeline.latest_builds.pluck(:id) }

      context 'when artifacts are expired' do
        before do
          pipeline.job_artifacts.first.update!(expire_at: Date.yesterday)
        end

        it 'renders not_found errors', :aggregate_failures do
          get_tests_show_json(build_ids)

          expect(response).to have_gitlab_http_status(:not_found)
          expect(json_response['errors']).to eq('Test report artifacts have expired')
        end

        context 'when ci_test_report_artifacts_expired is disabled' do
          before do
            stub_feature_flags(ci_test_report_artifacts_expired: false)
          end
          it 'renders test suite', :aggregate_failures do
            get_tests_show_json(build_ids)

            expect(response).to have_gitlab_http_status(:ok)
            expect(json_response['name']).to eq('test')
          end
        end
      end

      context 'when artifacts are not expired' do
        before do
          build = main_pipeline.builds.last
          build.update_column(:finished_at, 1.day.ago) # Just to be sure we are included in the report window

          # The JUnit fixture for the given build has 3 failures.
          # This service will create 1 test case failure record for each.
          Ci::TestFailureHistoryService.new(main_pipeline).execute
        end

        it 'renders test suite data', :aggregate_failures do
          get_tests_show_json(build_ids)

          expect(response).to have_gitlab_http_status(:ok)
          expect(json_response['name']).to eq('test')
          expect(json_response['artifacts_expired']).to be_falsey

          # Each test failure in this pipeline has a matching failure in the default branch
          recent_failures = json_response['test_cases'].map { |tc| tc['recent_failures'] }
          expect(recent_failures).to eq([
            { 'count' => 1, 'base_branch' => 'master' },
            { 'count' => 1, 'base_branch' => 'master' },
            { 'count' => 1, 'base_branch' => 'master' }
          ])
        end
      end
    end

    context 'when pipeline has no builds that matches the given build_ids' do
      let(:pipeline) { create(:ci_empty_pipeline) }
      let(:suite_name) { 'test' }

      it 'renders 404' do
        get_tests_show_json([])

        expect(response).to have_gitlab_http_status(:not_found)
        expect(response.body).to be_empty
      end
    end
  end

  def get_tests_summary_json
    get :summary,
      params: {
        namespace_id: project.namespace,
        project_id: project,
        pipeline_id: pipeline.id
      },
      format: :json
  end

  def get_tests_show_json(build_ids)
    get :show,
      params: {
        namespace_id: project.namespace,
        project_id: project,
        pipeline_id: pipeline.id,
        suite_name: suite_name,
        build_ids: build_ids
      },
      format: :json
  end
end