application_setting_spec.rb 6.05 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 33 34 35 36 37 38
    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
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
Robert Speicher's avatar
Robert Speicher committed
101 102
  end

Kamil Trzcinski's avatar
Kamil Trzcinski committed
103
  context 'restricted signup domains' do
104
    it 'sets single domain' do
105 106
      setting.domain_whitelist_raw = 'example.com'
      expect(setting.domain_whitelist).to eq(['example.com'])
107 108
    end

109
    it 'sets multiple domains with spaces' do
110 111
      setting.domain_whitelist_raw = 'example.com *.example.com'
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
112 113
    end

114
    it 'sets multiple domains with newlines and a space' do
115 116
      setting.domain_whitelist_raw = "example.com\n *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
117 118
    end

119
    it 'sets multiple domains with commas' do
120 121
      setting.domain_whitelist_raw = "example.com, *.example.com"
      expect(setting.domain_whitelist).to eq(['example.com', '*.example.com'])
122 123
    end
  end
124 125

  context 'blacklisted signup domains' do
126
    it 'sets single domain' do
127
      setting.domain_blacklist_raw = 'example.com'
128
      expect(setting.domain_blacklist).to contain_exactly('example.com')
129 130
    end

131
    it 'sets multiple domains with spaces' do
132
      setting.domain_blacklist_raw = 'example.com *.example.com'
133
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
134 135
    end

136
    it 'sets multiple domains with newlines and a space' do
137
      setting.domain_blacklist_raw = "example.com\n *.example.com"
138
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
139 140
    end

141
    it 'sets multiple domains with commas' do
142
      setting.domain_blacklist_raw = "example.com, *.example.com"
143
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
144 145
    end

146
    it 'sets multiple domains with semicolon' do
147 148 149 150
      setting.domain_blacklist_raw = "example.com; *.example.com"
      expect(setting.domain_blacklist).to contain_exactly('example.com', '*.example.com')
    end

151
    it 'sets multiple domains with mixture of everything' do
152 153 154 155
      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

156
    it 'sets multiple domain with file' do
157
      setting.domain_blacklist_file = File.open(Rails.root.join('spec/fixtures/', 'domain_blacklist.txt'))
158
      expect(setting.domain_blacklist).to contain_exactly('example.com', 'test.com', 'foo.bar')
159 160
    end
  end
161
end