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(:user) { create(:user) }
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
5

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

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

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
12
  describe '#represent' do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
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
    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
        let(:resource) { create(:ci_empty_pipeline) }

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

      context 'when multiple objects are being serialized' do
        let(:resource) { create_list(:ci_pipeline, 2) }

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

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

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

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

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

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

    context 'number of queries' do
      let(:resource) { Ci::Pipeline.all }
Robert Speicher's avatar
Robert Speicher включено в состав коммита
103
      let(:project) { create(:project) }
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
104
105

      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
121

          expect(recorded.count).to be_within(1).of(40)
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