inspec/test/unit/profiles/control_eval_context_tests.rb
Steven Danna b2146d8758 Allow users to reference resources from dependencies
All resources from deps are added into the control_eval_context used by
the current profile. However, if there is a name conflict, the last
loaded resource wins. The new `require_resource` dsl method allows the
user to do the following:

    require_resource(profile: 'profile_name',
                     resource: 'other',
                    as: 'renamed')

    describe renamed do
      ...
    end

Signed-off-by: Steven Danna <steve@chef.io>
2016-09-19 19:08:43 +02:00

77 lines
2.2 KiB
Ruby

# encoding: utf-8
# author: Steven Danna
require 'helper'
require 'inspec/control_eval_context'
describe Inspec::ControlEvalContext do
module FakeDSL
def foobar
"wombat"
end
end
let(:control_content) { <<EOF
control 'foo' do
describe foobar do
end
end
control 'bar' do
describe "wombat" do
it { should_equal foobar }
end
end
EOF
}
let(:resource_dsl) { FakeDSL }
let(:backend) { mock() }
let(:profile_context) { Inspec::ProfileContext.new('test-profile', backend, {}) }
let(:eval_context) do
c = Inspec::ControlEvalContext.create(profile_context, resource_dsl)
# A lot of mocking here :(
c.new(backend, mock(), mock(), mock())
end
it 'accepts a context and a resource_dsl' do
Inspec::ControlEvalContext.create(profile_context, resource_dsl)
end
it 'provides rules with access to the given DSL' do
profile_context.stubs(:current_load).returns({file: "<test content>"})
eval_context.instance_eval(control_content)
profile_context.all_rules.each do |rule|
# Turn each rule into an example group and run it, none of the
# example content should raise an exception
Inspec::Rule.prepare_checks(rule).each do |m, a, b|
# if we require this at the top level, none of the other tests
# in this file will run. itsfine.jpg
require 'rspec/core'
RSpec::Core::ExampleGroup.describe(*a, &b).run
end
end
end
describe "#resource" do
let(:resource_dsl) { Inspec::Resource.create_dsl(profile_context) }
let(:inner_context) { Inspec::ProfileContext.new('inner-context', backend, {}) }
let(:control_content) do <<EOF
resource('profile_a', 'foobar')
EOF
end
it "fails if the requested profile can't be found" do
assert_raises(Inspec::ProfileNotFound) {
eval_context.instance_eval(control_content).must_raise
}
end
it "returns the resource from a subcontext" do
profile_context.expects(:subcontext_by_name).with('profile_a').returns(inner_context)
inner_context.expects(:resource_registry).returns({'foobar' => mock(:new => 'newfoo')})
eval_context.instance_eval(control_content).must_equal "newfoo"
end
end
end