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

describe PipelineSerializer do
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
4
5
  let(:user) { create(:user) }

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 }
Michael Kozono's avatar
Michael Kozono включено в состав коммита
120
          expect(recorded.count).to be_within(1).of(57)
Lin Jen-Shin's avatar
Lin Jen-Shin включено в состав коммита
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
          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 включено в состав коммита
139
140
141
      end

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

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

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

      it 'serializes only status' do
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
168
169
170
        expect(subject[:text]).to eq(status.text)
        expect(subject[:label]).to eq(status.label)
        expect(subject[:icon]).to eq(status.icon)
Luke "Jared" Bennett's avatar
Luke "Jared" Bennett включено в состав коммита
171
        expect(subject[:favicon]).to eq("/assets/ci_favicons/#{status.favicon}.ico")
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
172
173
      end
    end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
174
  end
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
175
end