application_setting_spec.rb 6.7 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 33 34
    it { is_expected.to validate_presence_of(:max_attachment_size) }

    it do
35 36 37
      is_expected.to validate_numericality_of(:max_attachment_size)
        .only_integer
        .is_greater_than(0)
38
    end
39 40 41 42

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

44 45 46 47 48 49 50 51 52
    # 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
53
      before do
54 55 56 57 58 59
        storages = {
          'custom1' => 'tmp/tests/custom_repositories_1',
          'custom2' => 'tmp/tests/custom_repositories_2',
          'custom3' => 'tmp/tests/custom_repositories_3',

        }
60 61 62
        allow(Gitlab.config.repositories).to receive(:storages).and_return(storages)
      end

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
      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
100
    end
J
Jacob Vosmaer 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

    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 已提交
119 120
  end

K
Kamil Trzcinski 已提交
121
  context 'restricted signup domains' do
122
    it 'sets single domain' do
123 124
      setting.domain_whitelist_raw = 'example.com'
      expect(setting.domain_whitelist).to eq(['example.com'])
125 126
    end

127
    it 'sets multiple domains with spaces' do
128 129
      setting.domain_whitelist_raw = 'example.com *.example.com'
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
130 131
    end

132
    it 'sets multiple domains with newlines and a space' do
133 134
      setting.domain_whitelist_raw = "example.com\n *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
135 136
    end

137
    it 'sets multiple domains with commas' do
138 139
      setting.domain_whitelist_raw = "example.com, *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
140 141
    end
  end
142 143

  context 'blacklisted signup domains' do
144
    it 'sets single domain' do
145
      setting.domain_blacklist_raw = 'example.com'
146
      expect(setting.domain_blacklist).to contain_exactly('example.com')
147 148
    end

149
    it 'sets multiple domains with spaces' do
150
      setting.domain_blacklist_raw = 'example.com *.example.com'
151
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
152 153
    end

154
    it 'sets multiple domains with newlines and a space' do
155
      setting.domain_blacklist_raw = "example.com\n *.example.com"
156
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
157 158
    end

159
    it 'sets multiple domains with commas' do
160
      setting.domain_blacklist_raw = "example.com, *.example.com"
161
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
162 163
    end

164
    it 'sets multiple domains with semicolon' do
165 166 167 168
      setting.domain_blacklist_raw = "example.com; *.example.com"
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
    end

169
    it 'sets multiple domains with mixture of everything' do
170 171 172 173
      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

174
    it 'sets multiple domain with file' do
175
      setting.domain_blacklist_file = File.open(Rails.root.join('spec/fixtures/', 'domain_blacklist.txt'))
176
      expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar')
177 178
    end
  end
179
end