summaryrefslogtreecommitdiff
path: root/spec/lib/puppet_spec/language.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/puppet_spec/language.rb')
-rw-r--r--spec/lib/puppet_spec/language.rb74
1 files changed, 74 insertions, 0 deletions
diff --git a/spec/lib/puppet_spec/language.rb b/spec/lib/puppet_spec/language.rb
new file mode 100644
index 000000000..197c4b827
--- /dev/null
+++ b/spec/lib/puppet_spec/language.rb
@@ -0,0 +1,74 @@
+require 'puppet_spec/compiler'
+require 'matchers/resource'
+
+module PuppetSpec::Language
+ extend RSpec::Matchers::DSL
+
+ def produces(expectations)
+ calledFrom = caller
+ expectations.each do |manifest, resources|
+ it "evaluates #{manifest} to produce #{resources}" do
+ begin
+ case resources
+ when String
+ node = Puppet::Node.new('specification')
+ Puppet[:code] = manifest
+ compiler = Puppet::Parser::Compiler.new(node)
+ evaluator = Puppet::Pops::Parser::EvaluatingParser.new()
+
+ # see lib/puppet/indirector/catalog/compiler.rb#filter
+ catalog = compiler.compile.filter { |r| r.virtual? }
+
+ compiler.send(:instance_variable_set, :@catalog, catalog)
+
+ expect(evaluator.evaluate_string(compiler.topscope, resources)).to eq(true)
+ when Array
+ catalog = PuppetSpec::Compiler.compile_to_catalog(manifest)
+
+ if resources.empty?
+ base_resources = ["Class[Settings]", "Class[main]", "Stage[main]"]
+ expect(catalog.resources.collect(&:ref) - base_resources).to eq([])
+ else
+ resources.each do |reference|
+ if reference.is_a?(Array)
+ matcher = Matchers::Resource.have_resource(reference[0])
+ reference[1].each do |name, value|
+ matcher = matcher.with_parameter(name, value)
+ end
+ else
+ matcher = Matchers::Resource.have_resource(reference)
+ end
+
+ expect(catalog).to matcher
+ end
+ end
+ else
+ raise "Unsupported creates specification: #{resources.inspect}"
+ end
+ rescue Puppet::Error, RSpec::Expectations::ExpectationNotMetError => e
+ # provide the backtrace from the caller, or it is close to impossible to find some originators
+ e.set_backtrace(calledFrom)
+ raise
+ end
+
+ end
+ end
+ end
+
+ def fails(expectations)
+ calledFrom = caller
+ expectations.each do |manifest, pattern|
+ it "fails to evaluate #{manifest} with message #{pattern}" do
+ begin
+ expect do
+ PuppetSpec::Compiler.compile_to_catalog(manifest)
+ end.to raise_error(Puppet::Error, pattern)
+ rescue RSpec::Expectations::ExpectationNotMetError => e
+ # provide the backgrace from the caller, or it is close to impossible to find some originators
+ e.set_backtrace(calledFrom)
+ raise
+ end
+ end
+ end
+ end
+end