diff --git a/README.md b/README.md index 3f177212..730ad53d 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,23 @@ describe 'myclass' do end ``` +```ruby +require 'spec_helper' + +describe_on_supported_os 'myclass' do + it { is_expected.to compile.with_all_deps } + ... + + # If you need any to specify any operating system specific tests + case metadata[:os_facts][:osfamily] + when 'Debian' + ... + else + ... + end +end +``` + When using roles and profiles to manage a heterogeneous IT estate, you can test a profile that supports several OSes with many `let(:facts)` as long as each is in its own context: ```ruby require 'spec_helper' diff --git a/lib/rspec-puppet-facts.rb b/lib/rspec-puppet-facts.rb index 7f38b5be..eced2509 100644 --- a/lib/rspec-puppet-facts.rb +++ b/lib/rspec-puppet-facts.rb @@ -390,8 +390,26 @@ def self.facter_version_for_puppet_version(puppet_version) ensure fd.close if fd end + + module DSL + def describe_on_supported_os(*args, &block) + describe(*args) do + # TODO: assumes RspecPuppetFacts was included + on_supported_os.each do |os, os_facts| + context("on #{os}") do + let(:facts) { os_facts } + + class_exec(&block) + end + end + end + end + end end +RSpec::Core::ExampleGroup.extend(RspecPuppetFacts::DSL) +RSpec::Core::DSL.expose_example_group_alias(:describe_on_supported_os) + RSpec.configure do |c| c.add_setting :default_facter_version, :default => RspecPuppetFacts.facter_version_for_puppet_version(Puppet.version)