Read about our upcoming Code of Conduct on this issue

application_setting_spec.rb 14.7 KB
Newer Older
1
2
require 'spec_helper'

3
describe ApplicationSetting do
4
  let(:setting) { described_class.create_from_defaults }
5

Kamil Trzcinski's avatar
Kamil Trzcinski committed
6
  it { expect(setting).to be_valid }
7
  it { expect(setting.uuid).to be_present }
8
  it { expect(setting).to have_db_column(:auto_devops_enabled) }
9

Robert Speicher's avatar
Robert Speicher committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  describe 'validations' do
    let(:http)  { 'http://example.com' }
    let(:https) { 'https://example.com' }
    let(:ftp)   { 'ftp://example.com' }

    it { is_expected.to allow_value(nil).for(:home_page_url) }
    it { is_expected.to allow_value(http).for(:home_page_url) }
    it { is_expected.to allow_value(https).for(:home_page_url) }
    it { is_expected.not_to allow_value(ftp).for(:home_page_url) }

    it { is_expected.to allow_value(nil).for(:after_sign_out_path) }
    it { is_expected.to allow_value(http).for(:after_sign_out_path) }
    it { is_expected.to allow_value(https).for(:after_sign_out_path) }
    it { is_expected.not_to allow_value(ftp).for(:after_sign_out_path) }
24

25
26
27
28
29
30
31
32
    describe 'disabled_oauth_sign_in_sources validations' do
      before do
        allow(Devise).to receive(:omniauth_providers).and_return([:github])
      end

      it { is_expected.to allow_value(['github']).for(:disabled_oauth_sign_in_sources) }
      it { is_expected.not_to allow_value(['test']).for(:disabled_oauth_sign_in_sources) }
    end
33

34
    describe 'default_artifacts_expire_in' do
35
      it 'sets an error if it cannot parse' do
36
37
        setting.update(default_artifacts_expire_in: 'a')

38
        expect_invalid
39
40
      end

41
42
      it 'sets an error if it is blank' do
        setting.update(default_artifacts_expire_in: ' ')
43

44
        expect_invalid
45
46
      end

47
48
49
50
51
52
53
      it 'sets the value if it is valid' do
        setting.update(default_artifacts_expire_in: '30 days')

        expect(setting).to be_valid
        expect(setting.default_artifacts_expire_in).to eq('30 days')
      end

54
55
      it 'sets the value if it is 0' do
        setting.update(default_artifacts_expire_in: '0')
56
57

        expect(setting).to be_valid
58
59
60
61
62
63
        expect(setting.default_artifacts_expire_in).to eq('0')
      end

      def expect_invalid
        expect(setting).to be_invalid
        expect(setting.errors.messages)
64
          .to have_key(:default_artifacts_expire_in)
65
66
67
      end
    end

68
69
70
71
72
73
74
    it { is_expected.to validate_presence_of(:max_attachment_size) }

    it do
      is_expected.to validate_numericality_of(:max_attachment_size)
        .only_integer
        .is_greater_than(0)
    end
75
76
77
78

    it_behaves_like 'an object with email-formated attributes', :admin_notification_email do
      subject { setting }
    end
79

80
81
    # Upgraded databases will have this sort of content
    context 'repository_storages is a String, not an Array' do
82
83
84
      before do
        setting.__send__(:raw_write_attribute, :repository_storages, 'default')
      end
85
86
87
88
89
90

      it { expect(setting.repository_storages_before_type_cast).to eq('default') }
      it { expect(setting.repository_storages).to eq(['default']) }
    end

    context 'repository storages' do
91
      before do
92
93
94
        storages = {
          'custom1' => 'tmp/tests/custom_repositories_1',
          'custom2' => 'tmp/tests/custom_repositories_2',
95
          'custom3' => 'tmp/tests/custom_repositories_3'
96
97

        }
98
99
100
        allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
      end

101
102
      describe 'inclusion' do
        it { is_expected.to allow_value('custom1').for(:repository_storages) }
Douwe Maan's avatar
Douwe Maan committed
103
        it { is_expected.to allow_value(%w(custom2 custom3)).for(:repository_storages) }
104
        it { is_expected.not_to allow_value('alternative').for(:repository_storages) }
Douwe Maan's avatar
Douwe Maan committed
105
        it { is_expected.not_to allow_value(%w(alternative custom1)).for(:repository_storages) }
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
      end

      describe 'presence' do
        it { is_expected.not_to allow_value([]).for(:repository_storages) }
        it { is_expected.not_to allow_value("").for(:repository_storages) }
        it { is_expected.not_to allow_value(nil).for(:repository_storages) }
      end

      describe '.pick_repository_storage' do
        it 'uses Array#sample to pick a random storage' do
          array = double('array', sample: 'random')
          expect(setting).to receive(:repository_storages).and_return(array)

          expect(setting.pick_repository_storage).to eq('random')
        end

        describe '#repository_storage' do
          it 'returns the first storage' do
Douwe Maan's avatar
Douwe Maan committed
124
            setting.repository_storages = %w(good bad)
125
126
127
128
129
130
131
132
133
134
135
136
137

            expect(setting.repository_storage).to eq('good')
          end
        end

        describe '#repository_storage=' do
          it 'overwrites repository_storages' do
            setting.repository_storage = 'overwritten'

            expect(setting.repository_storages).to eq(['overwritten'])
          end
        end
      end
138
    end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155

    context 'housekeeping settings' do
      it { is_expected.not_to allow_value(0).for(:housekeeping_incremental_repack_period) }

      it 'wants the full repack period to be longer than the incremental repack period' do
        subject.housekeeping_incremental_repack_period = 2
        subject.housekeeping_full_repack_period = 1

        expect(subject).not_to be_valid
      end

      it 'wants the gc period to be longer than the full repack period' do
        subject.housekeeping_full_repack_period = 2
        subject.housekeeping_gc_period = 1

        expect(subject).not_to be_valid
      end
156
157
158
159
160
161
162
    end
  end

  describe '.current' do
    context 'redis unavailable' do
      it 'returns an ApplicationSetting' do
        allow(Rails.cache).to receive(:fetch).and_call_original
163
        allow(described_class).to receive(:last).and_return(:last)
164
165
        expect(Rails.cache).to receive(:fetch).with(ApplicationSetting::CACHE_KEY).and_raise(ArgumentError)

166
        expect(described_class.current).to eq(:last)
167
      end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
168
    end
Robert Speicher's avatar
Robert Speicher committed
169
170
  end

Kamil Trzcinski's avatar
Kamil Trzcinski committed
171
  context 'restricted signup domains' do
172
    it 'sets single domain' do
173
174
      setting.domain_whitelist_raw = 'example.com'
      expect(setting.domain_whitelist).to eq(['example.com'])
175
176
    end

177
    it 'sets multiple domains with spaces' do
178
179
      setting.domain_whitelist_raw = 'example.com *.example.com'
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
180
181
    end

182
    it 'sets multiple domains with newlines and a space' do
183
184
      setting.domain_whitelist_raw = "example.com\n *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
185
186
    end

187
    it 'sets multiple domains with commas' do
188
189
      setting.domain_whitelist_raw = "example.com, *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
190
191
    end
  end
192
193

  context 'blacklisted signup domains' do
194
    it 'sets single domain' do
195
      setting.domain_blacklist_raw = 'example.com'
196
      expect(setting.domain_blacklist).to contain_exactly('example.com')
197
198
    end

199
    it 'sets multiple domains with spaces' do
200
      setting.domain_blacklist_raw = 'example.com *.example.com'
201
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
202
203
    end

204
    it 'sets multiple domains with newlines and a space' do
205
      setting.domain_blacklist_raw = "example.com\n *.example.com"
206
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
207
208
    end

209
    it 'sets multiple domains with commas' do
210
      setting.domain_blacklist_raw = "example.com, *.example.com"
211
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
212
213
    end

214
    it 'sets multiple domains with semicolon' do
215
216
217
218
      setting.domain_blacklist_raw = "example.com; *.example.com"
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
    end

219
    it 'sets multiple domains with mixture of everything' do
220
221
222
223
      setting.domain_blacklist_raw = "example.com; *.example.com\n test.com\sblock.com   yes.com"
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com', 'test.com', 'block.com', 'yes.com')
    end

224
    it 'sets multiple domain with file' do
225
      setting.domain_blacklist_file = File.open(Rails.root.join('spec/fixtures/', 'domain_blacklist.txt'))
226
      expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar')
227
228
    end
  end
229

230
  describe 'performance bar settings' do
231
232
233
234
235
    describe 'performance_bar_allowed_group_id=' do
      context 'with a blank path' do
        before do
          setting.performance_bar_allowed_group_id = create(:group).full_path
        end
236

237
238
        it 'persists nil for a "" path and clears allowed user IDs cache' do
          expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)
239

240
241
242
243
244
245
246
247
248
          setting.performance_bar_allowed_group_id = ''

          expect(setting.performance_bar_allowed_group_id).to be_nil
        end
      end

      context 'with an invalid path' do
        it 'does not persist an invalid group path' do
          setting.performance_bar_allowed_group_id = 'foo'
249

250
251
          expect(setting.performance_bar_allowed_group_id).to be_nil
        end
252
253
254
255
256
257
258
259
260
261
262
263
264
265
      end

      context 'with a path to an existing group' do
        let(:group) { create(:group) }

        it 'persists a valid group path and clears allowed user IDs cache' do
          expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)

          setting.performance_bar_allowed_group_id = group.full_path

          expect(setting.performance_bar_allowed_group_id).to eq(group.id)
        end

        context 'when the given path is the same' do
266
267
268
269
270
271
272
273
274
275
          context 'with a blank path' do
            before do
              setting.performance_bar_allowed_group_id = nil
            end

            it 'clears the cached allowed user IDs' do
              expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)

              setting.performance_bar_allowed_group_id = ''
            end
276
277
          end

278
279
280
281
282
283
284
          context 'with a valid path' do
            before do
              setting.performance_bar_allowed_group_id = group.full_path
            end

            it 'clears the cached allowed user IDs' do
              expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
285

286
287
              setting.performance_bar_allowed_group_id = group.full_path
            end
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
          end
        end
      end
    end

    describe 'performance_bar_allowed_group' do
      context 'with no performance_bar_allowed_group_id saved' do
        it 'returns nil' do
          expect(setting.performance_bar_allowed_group).to be_nil
        end
      end

      context 'with a performance_bar_allowed_group_id saved' do
        let(:group) { create(:group) }

        before do
          setting.performance_bar_allowed_group_id = group.full_path
        end

        it 'returns the group' do
          expect(setting.performance_bar_allowed_group).to eq(group)
        end
      end
    end

313
314
315
    describe 'performance_bar_enabled' do
      context 'with the Performance Bar is enabled' do
        let(:group) { create(:group) }
316
317

        before do
318
          setting.performance_bar_allowed_group_id = group.full_path
319
320
321
        end

        it 'returns true' do
322
          expect(setting.performance_bar_enabled).to be_truthy
323
324
325
326
327
328
        end
      end
    end

    describe 'performance_bar_enabled=' do
      context 'when the performance bar is enabled' do
329
330
        let(:group) { create(:group) }

331
        before do
332
          setting.performance_bar_allowed_group_id = group.full_path
333
334
335
336
337
        end

        context 'when passing true' do
          it 'does not clear allowed user IDs cache' do
            expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
338

339
340
            setting.performance_bar_enabled = true

341
342
            expect(setting.performance_bar_allowed_group_id).to eq(group.id)
            expect(setting.performance_bar_enabled).to be_truthy
343
344
345
346
347
348
          end
        end

        context 'when passing false' do
          it 'disables the performance bar and clears allowed user IDs cache' do
            expect(Gitlab::PerformanceBar).to receive(:expire_allowed_user_ids_cache)
349

350
351
            setting.performance_bar_enabled = false

352
353
            expect(setting.performance_bar_allowed_group_id).to be_nil
            expect(setting.performance_bar_enabled).to be_falsey
354
355
356
357
358
359
          end
        end
      end

      context 'when the performance bar is disabled' do
        context 'when passing true' do
360
361
362
          it 'does nothing and does not clear allowed user IDs cache' do
            expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)

363
364
            setting.performance_bar_enabled = true

365
366
            expect(setting.performance_bar_allowed_group_id).to be_nil
            expect(setting.performance_bar_enabled).to be_falsey
367
368
369
370
          end
        end

        context 'when passing false' do
371
          it 'does nothing and does not clear allowed user IDs cache' do
372
            expect(Gitlab::PerformanceBar).not_to receive(:expire_allowed_user_ids_cache)
373

374
375
            setting.performance_bar_enabled = false

376
377
            expect(setting.performance_bar_allowed_group_id).to be_nil
            expect(setting.performance_bar_enabled).to be_falsey
378
379
380
381
382
383
          end
        end
      end
    end
  end

384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
  describe 'usage ping settings' do
    context 'when the usage ping is disabled in gitlab.yml' do
      before do
        allow(Settings.gitlab).to receive(:usage_ping_enabled).and_return(false)
      end

      it 'does not allow the usage ping to be configured' do
        expect(setting.usage_ping_can_be_configured?).to be_falsey
      end

      context 'when the usage ping is disabled in the DB' do
        before do
          setting.usage_ping_enabled = false
        end

        it 'returns false for usage_ping_enabled' do
          expect(setting.usage_ping_enabled).to be_falsey
        end
      end

      context 'when the usage ping is enabled in the DB' do
        before do
          setting.usage_ping_enabled = true
        end

        it 'returns false for usage_ping_enabled' do
          expect(setting.usage_ping_enabled).to be_falsey
        end
      end
    end

    context 'when the usage ping is enabled in gitlab.yml' do
      before do
        allow(Settings.gitlab).to receive(:usage_ping_enabled).and_return(true)
      end

      it 'allows the usage ping to be configured' do
        expect(setting.usage_ping_can_be_configured?).to be_truthy
      end

      context 'when the usage ping is disabled in the DB' do
        before do
          setting.usage_ping_enabled = false
        end

        it 'returns false for usage_ping_enabled' do
          expect(setting.usage_ping_enabled).to be_falsey
        end
      end

      context 'when the usage ping is enabled in the DB' do
        before do
          setting.usage_ping_enabled = true
        end

        it 'returns true for usage_ping_enabled' do
          expect(setting.usage_ping_enabled).to be_truthy
        end
      end
    end
  end
445
end