application_setting_spec.rb 7.56 KB
Newer Older
1
2
3
require 'spec_helper'

describe ApplicationSetting, models: true do
Kamil Trzcinski's avatar
Kamil Trzcinski committed
4
  let(:setting) { ApplicationSetting.create_from_defaults }
5

Kamil Trzcinski's avatar
Kamil Trzcinski committed
6
  it { expect(setting).to be_valid }
7

Robert Speicher's avatar
Robert Speicher committed
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  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) }
22

23
24
25
26
27
28
29
30
    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
31

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

36
        expect_invalid
37
38
      end

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

42
        expect_invalid
43
44
      end

45
46
47
48
49
50
51
      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

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

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

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

66
67
68
69
70
71
72
    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
73
74
75
76

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

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

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

    context 'repository storages' do
87
      before do
88
89
90
91
92
93
        storages = {
          'custom1' => 'tmp/tests/custom_repositories_1',
          'custom2' => 'tmp/tests/custom_repositories_2',
          'custom3' => 'tmp/tests/custom_repositories_3',

        }
94
95
96
        allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
      end

97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
      describe 'inclusion' do
        it { is_expected.to allow_value('custom1').for(:repository_storages) }
        it { is_expected.to allow_value(['custom2', 'custom3']).for(:repository_storages) }
        it { is_expected.not_to allow_value('alternative').for(:repository_storages) }
        it { is_expected.not_to allow_value(['alternative', 'custom1']).for(:repository_storages) }
      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
            setting.repository_storages = ['good', 'bad']

            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
134
    end
Jacob Vosmaer's avatar
Jacob Vosmaer committed
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152

    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
    end
Robert Speicher's avatar
Robert Speicher committed
153
154
  end

Kamil Trzcinski's avatar
Kamil Trzcinski committed
155
  context 'restricted signup domains' do
156
    it 'sets single domain' do
157
158
      setting.domain_whitelist_raw = 'example.com'
      expect(setting.domain_whitelist).to eq(['example.com'])
159
160
    end

161
    it 'sets multiple domains with spaces' do
162
163
      setting.domain_whitelist_raw = 'example.com *.example.com'
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
164
165
    end

166
    it 'sets multiple domains with newlines and a space' do
167
168
      setting.domain_whitelist_raw = "example.com\n *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
169
170
    end

171
    it 'sets multiple domains with commas' do
172
173
      setting.domain_whitelist_raw = "example.com, *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
174
175
    end
  end
176
177

  context 'blacklisted signup domains' do
178
    it 'sets single domain' do
179
      setting.domain_blacklist_raw = 'example.com'
180
      expect(setting.domain_blacklist).to contain_exactly('example.com')
181
182
    end

183
    it 'sets multiple domains with spaces' do
184
      setting.domain_blacklist_raw = 'example.com *.example.com'
185
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
186
187
    end

188
    it 'sets multiple domains with newlines and a space' do
189
      setting.domain_blacklist_raw = "example.com\n *.example.com"
190
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
191
192
    end

193
    it 'sets multiple domains with commas' do
194
      setting.domain_blacklist_raw = "example.com, *.example.com"
195
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
196
197
    end

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

203
    it 'sets multiple domains with mixture of everything' do
204
205
206
207
      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

208
    it 'sets multiple domain with file' do
209
      setting.domain_blacklist_file = File.open(Rails.root.join('spec/fixtures/', 'domain_blacklist.txt'))
210
      expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar')
211
212
    end
  end
213
end