From d58658323f6d8b1cf2fde8bd97ae26ea57d6330b Mon Sep 17 00:00:00 2001 From: Ewoud Kohl van Wijngaarden Date: Fri, 6 Aug 2021 15:58:50 +0200 Subject: [PATCH] Add a describe_on_supported_os DSL It is quite tedious to write the on_supported_os loop in every file. This defines a short hand in the RSpec DSL. To keep access to the OS facts, it is added to the metadata. --- README.md | 17 +++++++++++++++++ lib/rspec-puppet-facts.rb | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) 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)