pipeline_serializer_spec.rb 5,0 КБ
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
  subject { serializer.represent(resource) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
12

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
13
  describe '#represent' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
14
15
16
17
18
19
    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 включено в состав коммита
20
        let(:resource) { create(:ci_empty_pipeline, project: project) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
21
22
23
24
25
26
27

        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 включено в состав коммита
28
        let(:resource) { create_list(:ci_pipeline, 2, project: project) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

        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 включено в состав коммита
48
        described_class.new(current_user: user)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
49
50
51
52
53
54
55
          .with_pagination(request, response)
      end

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

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
56
      context 'when resource is not paginatable' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
57
58
59
60
61
        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 включено в состав коммита
62
63
            expect { subject }.to raise_error(
              Gitlab::Serializer::Pagination::InvalidResourceError)
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
64
65
66
67
68
69
70
71
72
          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 включено в состав коммита
73
74
75
          before do
            create(:ci_empty_pipeline)
          end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
76
77
78
79
80
81
82

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

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

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

    context 'number of queries' do
      let(:resource) { Ci::Pipeline.all }

      before do
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
106
107
108
109
110
111
112
        # 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 включено в состав коммита
113
        end
Andrew Newdigate's avatar
Andrew Newdigate включено в состав коммита
114
        Gitlab::GitalyClient.reset_counts
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
115
116
      end

Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
117
118
119
      shared_examples 'no N+1 queries' do
        it 'verifies number of queries', :request_store do
          recorded = ActiveRecord::QueryRecorder.new { subject }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
120

Dylan Griffith's avatar
Dylan Griffith включено в состав коммита
121
          expect(recorded.count).to be_within(1).of(44)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
          expect(recorded.cached_count).to eq(0)
        end
      end

      context 'with the same ref' do
        let(:ref) { 'feature' }

        it_behaves_like 'no N+1 queries'
      end

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

        it_behaves_like 'no N+1 queries'
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
140
141
142
      end

      def create_pipeline(status)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
143
144
145
146
        create(:ci_empty_pipeline,
               project: project,
               status: status,
               ref: ref).tap do |pipeline|
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
147
148
149
150
151
152
153
154
155
          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 включено в состав коммита
156
          name: stage, status: status, ref: pipeline.ref)
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
157
158
      end
    end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
159
  end
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
160

Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
161
162
  describe '#represent_status' do
    context 'when represents only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
163
164
      let(:resource) { create(:ci_pipeline) }
      let(:status) { resource.detailed_status(double('user')) }
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
165
166

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

      it 'serializes only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
169
170
171
        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 включено в состав коммита
172
        expect(subject[:favicon]).to match_asset_path("/assets/ci_favicons/#{status.favicon}.ico")
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
173
174
      end
    end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
175
  end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
176
end