pipeline_serializer_spec.rb 6,8 КБ
Newer Older
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
1
2
3
require 'spec_helper'

describe PipelineSerializer do
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
4
  set(:project) { create(:project, :repository) }
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
5
  set(:user) { create(:user) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
6

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
7
  let(:serializer) do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
8
    described_class.new(current_user: user, project: project)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
9
10
  end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
11
12
13
14
  before do
    stub_feature_flags(ci_pipeline_persisted_stages: true)
  end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
15
  subject { serializer.represent(resource) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
16

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
17
  describe '#represent' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
18
19
20
21
22
23
    context 'when used without pagination' do
      it 'created a not paginated serializer' do
        expect(serializer).not_to be_paginated
      end

      context 'when a single object is being serialized' do
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
24
        let(:resource) { create(:ci_empty_pipeline, project: project) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
25
26
27
28
29
30
31

        it 'serializers the pipeline object' do
          expect(subject[:id]).to eq resource.id
        end
      end

      context 'when multiple objects are being serialized' do
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
32
        let(:resource) { create_list(:ci_pipeline, 2, project: project) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
33
34
35
36
37
38
39
40

        it 'serializers the array of pipelines' do
          expect(subject).not_to be_empty
        end
      end
    end

    context 'when used with pagination' do
Adam Mulvany's avatar
Adam Mulvany включено в состав коммита
41
      let(:request) { double(url: "#{Gitlab.config.gitlab.url}:8080/api/v4/projects?#{query.to_query}", query_parameters: query) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
42
      let(:response) { spy('response') }
Adam Mulvany's avatar
Adam Mulvany включено в состав коммита
43
      let(:query) { {} }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
44
45

      let(:serializer) do
Fatih Acet's avatar
Fatih Acet включено в состав коммита
46
        described_class.new(current_user: user)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
47
48
49
50
51
52
53
          .with_pagination(request, response)
      end

      it 'created a paginated serializer' do
        expect(serializer).to be_paginated
      end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
54
      context 'when resource is not paginatable' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
55
56
        context 'when a single pipeline object is being serialized' do
          let(:resource) { create(:ci_empty_pipeline) }
Adam Mulvany's avatar
Adam Mulvany включено в состав коммита
57
          let(:query) { { page: 1, per_page: 1 } }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
58
59

          it 'raises error' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
60
61
            expect { subject }.to raise_error(
              Gitlab::Serializer::Pagination::InvalidResourceError)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
62
63
64
65
66
67
          end
        end
      end

      context 'when resource is paginatable relation' do
        let(:resource) { Ci::Pipeline.all }
Adam Mulvany's avatar
Adam Mulvany включено в состав коммита
68
        let(:query) { { page: 1, per_page: 2 } }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
69
70

        context 'when a single pipeline object is present in relation' do
Robert Speicher's avatar
Robert Speicher включено в состав коммита
71
72
73
          before do
            create(:ci_empty_pipeline)
          end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
74
75
76
77
78
79
80

          it 'serializes pipeline relation' do
            expect(subject.first).to have_key :id
          end
        end

        context 'when a multiple pipeline objects are being serialized' do
Robert Speicher's avatar
Robert Speicher включено в состав коммита
81
82
83
          before do
            create_list(:ci_empty_pipeline, 3)
          end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
84
85
86
87
88
89
90
91
92

          it 'serializes appropriate number of objects' do
            expect(subject.count).to be 2
          end

          it 'appends relevant headers' do
            expect(response).to receive(:[]=).with('X-Total', '3')
            expect(response).to receive(:[]=).with('X-Total-Pages', '2')
            expect(response).to receive(:[]=).with('X-Per-Page', '2')
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
93

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
94
95
96
97
            subject
          end
        end
      end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
98
    end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
99

Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
100
101
102
103
104
    context 'when there are pipelines for merge requests' do
      let(:resource) { Ci::Pipeline.all }

      let!(:merge_request_1) do
        create(:merge_request,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
105
          :with_detached_merge_request_pipeline,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
106
107
108
          target_project: project,
          target_branch: 'master',
          source_project: project,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
109
          source_branch: 'feature')
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
110
111
112
113
      end

      let!(:merge_request_2) do
        create(:merge_request,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
114
          :with_detached_merge_request_pipeline,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
115
116
117
          target_project: project,
          target_branch: 'master',
          source_project: project,
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
118
          source_branch: '2-mb-file')
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
      end

      before do
        project.add_developer(user)
      end

      it 'includes merge requests information' do
        expect(subject.all? { |entry| entry[:merge_request].present? }).to be_truthy
      end

      it 'preloads related merge requests', :postgresql do
        recorded = ActiveRecord::QueryRecorder.new { subject }

        expect(recorded.log)
          .to include("SELECT \"merge_requests\".* FROM \"merge_requests\" " \
                      "WHERE \"merge_requests\".\"id\" IN (#{merge_request_1.id}, #{merge_request_2.id})")
      end
    end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
138
139
    describe 'number of queries when preloaded' do
      subject { serializer.represent(resource, preload: true) }
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
140
141
142
      let(:resource) { Ci::Pipeline.all }

      before do
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
143
144
145
146
        # Since RequestStore.active? is true we have to allow the
        # gitaly calls in this block
        # Issue: https://gitlab.com/gitlab-org/gitlab-ce/issues/37772
        Gitlab::GitalyClient.allow_n_plus_1_calls do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
147
          Ci::Pipeline::COMPLETED_STATUSES.each do |status|
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
148
149
            create_pipeline(status)
          end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
150
        end
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
151
        Gitlab::GitalyClient.reset_counts
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
152
153
      end

Jan Provaznik's avatar
Jan Provaznik включено в состав коммита
154
155
156
      context 'with the same ref' do
        let(:ref) { 'feature' }

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
157
158
        it 'verifies number of queries', :request_store do
          recorded = ActiveRecord::QueryRecorder.new { subject }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
159

Matija Čupić's avatar
Matija Čupić включено в состав коммита
160
161
          expected_queries = Gitlab.ee? ? 38 : 31
          expect(recorded.count).to be_within(2).of(expected_queries)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
162
163
164
165
166
167
168
169
170
171
172
          expect(recorded.cached_count).to eq(0)
        end
      end

      context 'with different refs' do
        def ref
          @sequence ||= 0
          @sequence += 1
          "feature-#{@sequence}"
        end

Jan Provaznik's avatar
Jan Provaznik включено в состав коммита
173
174
175
176
177
178
179
        it 'verifies number of queries', :request_store do
          recorded = ActiveRecord::QueryRecorder.new { subject }

          # For each ref there is a permission check if maintainer can update
          # pipeline. With the same ref this check is cached but if refs are
          # different then there is an extra query per ref
          # https://gitlab.com/gitlab-org/gitlab-ce/issues/46368
Matija Čupić's avatar
Matija Čupić включено в состав коммита
180
181
          expected_queries = Gitlab.ee? ? 44 : 38
          expect(recorded.count).to be_within(2).of(expected_queries)
Jan Provaznik's avatar
Jan Provaznik включено в состав коммита
182
183
          expect(recorded.cached_count).to eq(0)
        end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
184
185
186
      end

      def create_pipeline(status)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
187
188
189
190
        create(:ci_empty_pipeline,
               project: project,
               status: status,
               ref: ref).tap do |pipeline|
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
191
192
193
194
195
196
197
198
199
          Ci::Build::AVAILABLE_STATUSES.each do |status|
            create_build(pipeline, status, status)
          end
        end
      end

      def create_build(pipeline, stage, status)
        create(:ci_build, :tags, :triggered, :artifacts,
          pipeline: pipeline, stage: stage,
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
200
          name: stage, status: status, ref: pipeline.ref)
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
201
202
      end
    end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
203
  end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
204

Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
205
206
  describe '#represent_status' do
    context 'when represents only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
207
208
      let(:resource) { create(:ci_pipeline) }
      let(:status) { resource.detailed_status(double('user')) }
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
209
210

      subject { serializer.represent_status(resource) }
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
211
212

      it 'serializes only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
213
214
215
        expect(subject[:text]).to eq(status.text)
        expect(subject[:label]).to eq(status.label)
        expect(subject[:icon]).to eq(status.icon)
Alexis Reigel's avatar
Alexis Reigel включено в состав коммита
216
        expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.png")
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
217
218
      end
    end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
219
  end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
220
end