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

describe ApplicationSetting, models: true do
K
Kamil Trzcinski 已提交
4
  let(:setting) { ApplicationSetting.create_from_defaults }
5

K
Kamil Trzcinski 已提交
6
  it { expect(setting).to be_valid }
7

R
Robert Speicher 已提交
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 62
        expect(setting.default_artifacts_expire_in).to eq('0')
      end

      def expect_invalid
        expect(setting).to be_invalid
        expect(setting.errors.messages)
          .to have_key(:default_artifacts_expiration)
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
J
Jacob Vosmaer 已提交
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
R
Robert Speicher 已提交
153 154
  end

K
Kamil Trzcinski 已提交
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