pipeline_serializer_spec.rb 5,5 КБ
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
Fatih Acet's avatar
Fatih Acet включено в состав коммита
8
    described_class.new(current_user: user)
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
41
42
43
44
45
46
47
48
49
50
51

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

    context 'when used with pagination' do
      let(:request) { spy('request') }
      let(:response) { spy('response') }
      let(:pagination) { {} }

      before do
        allow(request)
          .to receive(:query_parameters)
          .and_return(pagination)
      end

      let(:serializer) do
Fatih Acet's avatar
Fatih Acet включено в состав коммита
52
        described_class.new(current_user: user)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
53
54
55
56
57
58
59
          .with_pagination(request, response)
      end

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

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
60
      context 'when resource is not paginatable' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
61
62
63
64
65
        context 'when a single pipeline object is being serialized' do
          let(:resource) { create(:ci_empty_pipeline) }
          let(:pagination) { { page: 1, per_page: 1 } }

          it 'raises error' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
66
67
            expect { subject }.to raise_error(
              Gitlab::Serializer::Pagination::InvalidResourceError)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
68
69
70
71
72
73
74
75
76
          end
        end
      end

      context 'when resource is paginatable relation' do
        let(:resource) { Ci::Pipeline.all }
        let(:pagination) { { page: 1, per_page: 2 } }

        context 'when a single pipeline object is present in relation' do
Robert Speicher's avatar
Robert Speicher включено в состав коммита
77
78
79
          before do
            create(:ci_empty_pipeline)
          end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
80
81
82
83
84
85
86

          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 включено в состав коммита
87
88
89
          before do
            create_list(:ci_empty_pipeline, 3)
          end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
90
91
92
93
94
95
96
97
98

          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 включено в состав коммита
99

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
100
101
102
103
            subject
          end
        end
      end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
104
    end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
105

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

      before do
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
111
112
113
114
115
116
117
        # 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
          Ci::Pipeline::AVAILABLE_STATUSES.each do |status|
            create_pipeline(status)
          end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
118
        end
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
119
        Gitlab::GitalyClient.reset_counts
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
120
121
      end

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

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

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
128
          expect(recorded.count).to be_within(1).of(31)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
129
130
131
132
133
134
135
136
137
138
139
          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 включено в состав коммита
140
141
142
143
144
145
146
        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
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
147
          expect(recorded.count).to be_within(1).of(38)
Jan Provaznik's avatar
Jan Provaznik включено в состав коммита
148
149
          expect(recorded.cached_count).to eq(0)
        end
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
150
151
152
      end

      def create_pipeline(status)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
153
154
155
156
        create(:ci_empty_pipeline,
               project: project,
               status: status,
               ref: ref).tap do |pipeline|
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
157
158
159
160
161
162
163
164
165
          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 включено в состав коммита
166
          name: stage, status: status, ref: pipeline.ref)
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
167
168
      end
    end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
169
  end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
170

Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
171
172
  describe '#represent_status' do
    context 'when represents only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
173
174
      let(:resource) { create(:ci_pipeline) }
      let(:status) { resource.detailed_status(double('user')) }
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
175
176

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

      it 'serializes only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
179
180
181
        expect(subject[:text]).to eq(status.text)
        expect(subject[:label]).to eq(status.label)
        expect(subject[:icon]).to eq(status.icon)
Mike Greiling's avatar
Mike Greiling включено в состав коммита
182
        expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.ico")
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
183
184
      end
    end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
185
  end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
186
end