inspec/test/unit/profile_context_test.rb
2016-03-08 14:59:14 +01:00

216 lines
5.8 KiB
Ruby

# encoding: utf-8
# author: Dominik Richter
# author: Christoph Hartmann
require 'helper'
require 'inspec/profile_context'
class Module
include Minitest::Spec::DSL
end
module DescribeOneTest
it 'loads an empty describe.one' do
profile.load(format(context_format, 'describe.one'))
get_checks.must_equal([])
end
it 'loads an empty describe.one block' do
profile.load(format(context_format, 'describe.one do; end'))
get_checks.must_equal([['describe.one', [], nil]])
end
it 'loads a simple describe.one block' do
profile.load(format(context_format, '
describe.one do
describe true do; it { should eq true }; end
end'))
c = get_checks[0]
c[0].must_equal 'describe.one'
childs = c[1]
childs.length.must_equal 1
childs[0][0].must_equal 'describe'
childs[0][1].must_equal [true]
end
it 'loads a complex describe.one block' do
profile.load(format(context_format, '
describe.one do
describe 0 do; it { should eq true }; end
describe 1 do; it { should eq true }; end
describe 2 do; it { should eq true }; end
end'))
c = get_checks[0]
c[0].must_equal 'describe.one'
childs = c[1]
childs.length.must_equal 3
childs.each_with_index do |ci, idx|
ci[0].must_equal 'describe'
ci[1].must_equal [idx]
end
end
end
describe Inspec::ProfileContext do
let(:backend) { MockLoader.new.backend }
let(:profile) { Inspec::ProfileContext.new(nil, backend, {}) }
def get_rule
profile.rules.values[0]
end
def get_checks
get_rule.instance_variable_get(:@checks)
end
it 'must be able to load empty content' do
profile.load('', 'dummy', 1).must_be_nil
end
describe 'its default DSL' do
def load(call)
proc { profile.load(call) }
end
let(:context_format) { '%s' }
include DescribeOneTest
it 'must provide os resource' do
load('print os[:family]').must_output 'ubuntu'
end
it 'must provide file resource' do
load('print file("").type').must_output 'unknown'
end
it 'must provide command resource' do
load('print command("").stdout').must_output ''
end
it 'supports empty describe calls' do
load('describe').must_output ''
profile.rules.keys.length.must_equal 1
profile.rules.keys[0].must_match /^\(generated from unknown:1 [0-9a-f]+\)$/
profile.rules.values[0].must_be_kind_of Inspec::Rule
end
it 'provides the describe keyword in the global DSL' do
load('describe true do; it { should_eq true }; end')
.must_output ''
profile.rules.keys.length.must_equal 1
profile.rules.keys[0].must_match /^\(generated from unknown:1 [0-9a-f]+\)$/
profile.rules.values[0].must_be_kind_of Inspec::Rule
end
it 'loads multiple computed calls to describe correctly' do
load("%w{1 2 3}.each do\ndescribe true do; it { should_eq true }; end\nend")
.must_output ''
profile.rules.keys.length.must_equal 3
[0, 1, 2].each do |i|
profile.rules.keys[i].must_match /^\(generated from unknown:2 [0-9a-f]+\)$/
profile.rules.values[i].must_be_kind_of Inspec::Rule
end
end
it 'does not provide the expect keyword in the global DLS' do
load('expect(true).to_eq true').must_raise NoMethodError
end
it 'provides the rule keyword in the global DSL' do
profile.load('rule 1')
profile.rules.keys.must_equal [1]
profile.rules.values[0].must_be_kind_of Inspec::Rule
end
end
describe 'rule DSL' do
let(:rule_id) { rand.to_s }
let(:context_format) { "rule #{rule_id.inspect} do\n%s\nend" }
def get_rule
profile.rules[rule_id]
end
include DescribeOneTest
it 'doesnt add any checks if none are provided' do
profile.load("rule #{rule_id.inspect}")
rule = profile.rules[rule_id]
rule.instance_variable_get(:@checks).must_equal([])
end
describe 'supports empty describe blocks' do
it 'doesnt crash, but doesnt add anything either' do
profile.load(format(context_format, 'describe'))
profile.rules.keys.must_include(rule_id)
get_checks.must_equal([])
end
end
describe 'adds a check via describe' do
let(:check) {
profile.load(format(context_format,
"describe os[:family] { it { must_equal 'ubuntu' } }"
))
get_checks[0]
}
it 'registers the check with describe' do
check[0].must_equal 'describe'
end
it 'registers the check with the describe argument' do
check[1].must_equal %w{ubuntu}
end
it 'registers the check with the provided proc' do
check[2].must_be_kind_of Proc
end
end
describe 'adds a check via expect' do
let(:check) {
profile.load(format(context_format,
"expect(os[:family]).to eq('ubuntu')"
))
get_checks[0]
}
it 'registers the check with describe' do
check[0].must_equal 'expect'
end
it 'registers the check with the describe argument' do
check[1].must_equal %w{ubuntu}
end
it 'registers the check with the provided proc' do
check[2].must_be_kind_of Inspec::Expect
end
end
describe 'adds a check via describe + expect' do
let(:check) {
profile.load(format(context_format,
"describe 'the actual test' do
expect(os[:family]).to eq('ubuntu')
end"
))
get_checks[0]
}
it 'registers the check with describe' do
check[0].must_equal 'describe'
end
it 'registers the check with the describe argument' do
check[1].must_equal ['the actual test']
end
it 'registers the check with the provided proc' do
check[2].must_be_kind_of Proc
end
end
end
end