Project

General

Profile

Download (5.33 KB) Statistics
| Branch: | Tag: | Revision:
require 'test_helper'

class SettingManagerTest < ActiveSupport::TestCase
let(:setting_memo) { {} }
let(:category_memo) { { 'general' => N_('General') } }

setup do
Foreman::SettingManager.stubs(settings: setting_memo, categories: category_memo)
end

it 'adds setting to category general by default' do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:foo,
type: :string,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
end
assert_not_nil setting_memo['foo']
assert_equal setting_memo['foo'][:category], 'general'
end

it 'adds setting to defined category within block and sets it\'s label' do
Foreman::SettingManager.define(:test_context) do
category(:my_category, 'Awesome Category') do
setting(:foo,
type: :string,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
end
assert_not_nil setting_memo['foo']
assert_equal setting_memo['foo'][:category], 'my_category'
assert_equal category_memo['my_category'], 'Awesome Category'
end

it 'doesnt allow setting redefinition' do
assert_raise ::Foreman::Exception, "Setting 'foo' is already defined, please avoid collisions" do
Foreman::SettingManager.define(:test_context) do
category(:my_category, 'Awesome Category') do
setting(:foo,
type: :string,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
category(:general) do
setting(:foo,
type: :string,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
end
end
end

it 'doesnt allow setting with invalid type' do
# no type not allowed
assert_raise ArgumentError, "missing keyword: :type" do
Foreman::SettingManager.define(:test_context) do
category(:my_category, 'Awesome Category') do
setting(:foo,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
end
end
# invalid type not allowed
assert_raise ::Foreman::Exception, "Setting 'foo' has invalid type definition. Please use valid type." do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:foo,
type: :custom_type,
default: 'bar',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
end
end
end
end

describe 'Validations' do
setup do
@validation_backup = Setting._validators[:value].dup
end

teardown do
Setting._validators[:value] = @validation_backup
end

it 'defines validation on Setting model for given setting name' do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:validfoo,
type: :string,
default: 'bar@example.com',
description: 'This is nicely described foo setting',
full_name: 'Foo setting',
validate: :email)
end
end
Foreman::SettingManager.validations.setup!
Foreman.settings.load_definitions
setting = Setting.new(name: 'validfoo', value: 'notanemail')
assert_not setting.valid?
end

it 'defines validation through validates' do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:validfoo,
type: :string,
default: 'bar@example.com',
description: 'This is nicely described foo setting',
full_name: 'Foo setting')
validates(:validfoo, { email: true })
end
end
Foreman::SettingManager.validations.setup!
Foreman.settings.load_definitions
setting = Setting.new(name: 'validfoo', value: 'notanemail')
assert_not setting.valid?
end

it 'defines validation through RegExp' do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:validfoo2,
type: :string,
default: 'bar@include.com',
description: 'This is nicely described foo setting',
full_name: 'Foo setting',
validate: /.*@include.com/)
end
end
Foreman::SettingManager.validations.setup!
Foreman.settings.load_definitions
setting = Setting.new(name: 'validfoo2', value: 'bar@notvalid.com')
assert_not setting.valid?
end

it 'defines validation through Proc' do
Foreman::SettingManager.define(:test_context) do
category(:general) do
setting(:validfoo3,
type: :string,
default: 'bar@example.com',
description: 'This is nicely described foo setting',
full_name: 'Foo setting',
validate: ->(value) { !value.nil? && value.starts_with?('bar') })
end
end
Foreman::SettingManager.validations.setup!
Foreman.settings.load_definitions
setting = Setting.new(name: 'validfoo3', value: 'notvalid@example.com')
assert_not setting.valid?
end
end
end
(67-67/74)