Project

General

Profile

Download (9.29 KB) Statistics
| Branch: | Tag: | Revision:
require 'test_helper'
require Rails.root + 'db/seeds.d/020-roles_list.rb'

class SeedHelperTest < ActiveSupport::TestCase
test "should create locked role" do
role_name = "Test role"
permissions_names = [:view_hosts, :destroy_hosts]
refute Role.find_by(:name => role_name)
SeedHelper.create_role role_name, {:permissions => permissions_names}, 0
role = Role.find_by(:name => role_name)
assert role
assert_equal permissions_names.sort, role.permissions.pluck(:name).sort.map(&:to_sym)
end

test "should update a description for a role" do
role_name = 'existing role'
SeedHelper.create_role role_name, {:permissions => []}, 0
role = Role.find_by(:name => role_name)
refute_equal 'new description', role.description
SeedHelper.create_role role_name, {:permissions => [], :description => 'new description'}, 0
assert_equal 'new description', role.reload.description
end

test "should add new permissions to existing roles" do
role_name = 'existing role'
SeedHelper.create_role role_name, {:permissions => [:view_domains, :edit_domains]}, 0
role = Role.find_by(:name => role_name)

SeedHelper.create_role role_name, {:permissions => [:edit_domains, :create_domains]}, 0
permissions = role.permissions.pluck(:name)
# create new permissions
assert_includes permissions, 'create_domains'
# keeps existing permissions
assert_includes permissions, 'edit_domains'
# drops additional permissions
refute_includes permissions, 'view_domains'
end

test "should not try add new permissions to existing roles if it's explicitly disabled, the permission might not exist e.g. while in migration" do
role_name = 'existing role'
SeedHelper.create_role role_name, {:permissions => [:view_domains, :edit_domains]}, 0
role = Role.find_by(:name => role_name)

SeedHelper.create_role role_name, {:permissions => [:edit_domains, :create_domains], :update_permissions => false}, 0
permissions = role.permissions.pluck(:name)
# does not create new permission
refute_includes permissions, 'create_domains'
# keeps existing permissions
assert_includes permissions, 'edit_domains'
assert_includes permissions, 'view_domains'
end

test 'Does not fail on modified default role' do
role = Role.default
role.add_permissions!(:view_domains)
permissions = role.permissions.pluck(:name)
assert_includes permissions, 'view_domains'

name, opts = RolesList.default_role.first
SeedHelper.create_role(name, opts, Role::BUILTIN_DEFAULT_ROLE)
permissions = role.permissions.pluck(:name)
assert_includes permissions, 'view_domains'
end

test 'Does not fail on modified default role with filter' do
role = Role.default
role.add_permissions!(:view_domains, search: 'name = example.com')
permissions = role.permissions.pluck(:name)
assert_includes permissions, 'view_domains'

name, opts = RolesList.default_role.first
SeedHelper.create_role(name, opts, Role::BUILTIN_DEFAULT_ROLE)
permissions = role.permissions.pluck(:name)
assert_includes permissions, 'view_domains'
assert_includes role.filters.pluck(:search), 'name = example.com'
end

describe '#audit_modified?' do
it "should recognize object was modified" do
medium = Medium.last
medium_name = medium.name
refute SeedHelper.audit_modified?(Medium, medium.name)
medium.update(:name => "renamed medium")
assert SeedHelper.audit_modified?(Medium, medium_name)
end

context 'with attributes filtering' do
let(:bookmark) { FactoryBot.create(:bookmark, :name => 'two', :public => true, :controller => 'config_reports') }

it "recognizes irrelevant change" do
refute SeedHelper.audit_modified?(Bookmark, bookmark.name, :controller => bookmark.controller)
bookmark.update(:query => "name = barbar")
bookmarks(:two).update(:name => 'modified irelevant')
refute SeedHelper.audit_modified?(Medium, bookmark.name, :controller => bookmark.controller)
end

it "recognizes relevant changes in complex history" do
old_name = bookmark.name
refute SeedHelper.audit_modified?(Bookmark, bookmark.name, :controller => bookmark.controller)
bookmark.update(:query => "name = barbar")
bookmark.update(:name => 'modified')
bookmark.update(:name => 'modified2')
bookmark.update(:query => "name = bar2")
assert SeedHelper.audit_modified?(Bookmark, old_name, :controller => bookmark.controller)
bookmarks(:two).destroy
bookmark.destroy
assert SeedHelper.audit_modified?(Bookmark, old_name, :controller => bookmark.controller)
end

it "recognizes irrelevant changes in complex history" do
refute SeedHelper.audit_modified?(Bookmark, bookmark.name, :controller => bookmark.controller)
bookmarks(:two)
bookmarks(:two).update(:name => 'modified')
bookmarks(:two).update(:name => 'modified2')
bookmarks(:two).destroy
bookmark.update(:query => "name = barbar")
refute SeedHelper.audit_modified?(Bookmark, bookmark.name, :controller => bookmark.controller)
end
end
end

describe '.import_raw_template' do
def get_template(metadata_hash = nil)
tpl = []
if metadata_hash
tpl << '<%#'
tpl << YAML.dump(metadata_hash).split("\n")[1..-1].join("\n")
tpl << '%>'
end
tpl << 'Template body'
tpl.join("\n")
end

def mock_taxonomies(type, taxonomies)
unscoped_mock = mock()
unscoped_mock.stubs(:all).returns(taxonomies)
type.stubs(:unscoped).returns(unscoped_mock)
end

let(:template_metadata) do
{
'name' => 'Test template',
'model' => 'ProvisioningTemplate',
'kind' => 'finish',
}
end

it 'requires name in metadata' do
ex = assert_raises RuntimeError do
SeedHelper.import_raw_template(get_template(template_metadata.except('name')))
end
assert_match("Attribute 'name' is required", ex.message)
end

it 'requires template model in metadata' do
ex = assert_raises RuntimeError do
SeedHelper.import_raw_template(get_template(template_metadata.except('model')))
end
assert_match("Attribute 'model' is required", ex.message)
end

it 'skips templates that have been changed' do
SeedHelper.expects(:audit_modified?).with(ProvisioningTemplate, 'Test template').returns(true)
assert_nil SeedHelper.import_raw_template(get_template(template_metadata))
end

it 'skips template that have unknown model' do
assert_nil SeedHelper.import_raw_template(get_template(template_metadata.merge({'model' => 'unknown'})))
end

it 'skips templates that require a missing plugin' do
requirements = {
'require' => [{
'plugin' => 'unknown_plugin',
}],
}
assert_nil SeedHelper.import_raw_template(get_template(template_metadata.merge(requirements)))
end

it 'skips templates that require a plugin in higher version' do
requirements = {
'require' => [{
'plugin' => 'some_plugin',
'version' => '2.0.1',
}],
}
Foreman::Plugin.expects(:find).with('some_plugin').returns(mock(:version => '1.9'))
assert_nil SeedHelper.import_raw_template(get_template(template_metadata.merge(requirements)))
end

it 'accepts prereleases to satisty version condition ' do
requirements = {
'require' => [{
'plugin' => 'some_plugin',
'version' => '2.0.1',
}],
}
Foreman::Plugin.expects(:find).with('some_plugin').returns(mock(:version => '2.0.1.rc2'))
refute_nil SeedHelper.import_raw_template(get_template(template_metadata.merge(requirements)))
end

it 'imports the template and sets taxonomies' do
orgs = [taxonomies(:organization1), taxonomies(:organization2)]
locs = [taxonomies(:location1), taxonomies(:location2)]

mock_taxonomies(Organization, orgs)
mock_taxonomies(Location, locs)

tpl = SeedHelper.import_raw_template(get_template(template_metadata))
assert(tpl.valid?)
assert(tpl.persisted?)
assert_equal(orgs, tpl.organizations)
assert_equal(locs, tpl.locations)
end

it 'sets correct vendor' do
tpl = SeedHelper.import_raw_template(get_template(template_metadata), 'SomePlugin')
assert_equal('SomePlugin', tpl.vendor)
end

it 'does not touch taxonomies on update' do
orgs = [taxonomies(:organization1), taxonomies(:organization2)]
locs = [taxonomies(:location1), taxonomies(:location2)]

mock_taxonomies(Organization, orgs)
mock_taxonomies(Location, locs)

tpl = SeedHelper.import_raw_template(get_template(template_metadata.merge({'name' => 'MyScript'})))
assert_equal([], tpl.organizations)
assert_equal([], tpl.locations)
end

it 'updates the template' do
orgs = [taxonomies(:organization1), taxonomies(:organization2)]
locs = [taxonomies(:location1), taxonomies(:location2)]

mock_taxonomies(Organization, orgs)
mock_taxonomies(Location, locs)

template_body = get_template(template_metadata.merge({'name' => 'MyScript'}))

tpl = SeedHelper.import_raw_template(template_body)
assert(tpl.valid?)
assert(tpl.persisted?)
assert_equal(template_body, tpl.template)
end
end
end
(66-66/74)