Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add experimental infrastructure for testing custom facts #32

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/rspec-puppet/example.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
require 'rspec-puppet/support'
require 'rspec-puppet/example/define_example_group'
require 'rspec-puppet/example/class_example_group'
require 'rspec-puppet/example/fact_example_group'
require 'rspec-puppet/example/function_example_group'
require 'rspec-puppet/example/host_example_group'
require 'rspec-puppet/example/type_example_group'
Expand All @@ -19,6 +20,7 @@ def c.rspec_puppet_include(group, type, file_path)

c.rspec_puppet_include RSpec::Puppet::DefineExampleGroup, :define, %w[spec defines]
c.rspec_puppet_include RSpec::Puppet::ClassExampleGroup, :class, %w[spec classes]
c.rspec_puppet_include RSpec::Puppet::FactExampleGroup, :define, %w[spec facts]
c.rspec_puppet_include RSpec::Puppet::FunctionExampleGroup, :puppet_function, %w[spec functions]
c.rspec_puppet_include RSpec::Puppet::HostExampleGroup, :host, %w[spec hosts]
c.rspec_puppet_include RSpec::Puppet::TypeExampleGroup, :type, %w[spec types]
Expand Down
51 changes: 51 additions & 0 deletions lib/rspec-puppet/example/fact_example_group.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# frozen_string_literal: true

module RSpec::Puppet
# This module provides support for custom facts
module FactExampleGroup
include RSpec::Puppet::FactMatchers

def subject
setup_facter
Facter.fact(self.class.top_level_description)
end

def rspec_puppet_cleanup
Facter.clear
# TODO: clean LOAD_PATH again?
end

private

# TODO: duplicates adapter
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think Rspec::Puppet::Support should be split into a base adapter that also applies to facts and one that includes a catalog. Then you can call setup_puppet properly there. However, that's a larger effort I don't have time for now.

def modulepath
if (rspec_modulepath = RSpec.configuration.module_path)
rspec_modulepath.split(File::PATH_SEPARATOR)
else
Puppet[:environmentpath].split(File::PATH_SEPARATOR).map do |path|
File.join(path, 'fixtures', 'modules')
end
end
end

def setup_facter
# TODO: duplicates RSpec::Puppet::Support.setup_puppet
modulepath.map do |d|
Dir["#{d}/*/lib/facter"].entries.each do |entry|
$LOAD_PATH << File.expand_path(File.dirname(entry))
end
end

Facter.clear

return unless respond_to?(:facts)

allow(Facter).to receive(:value).and_call_original

facts.each do |fact, value|
# TODO: Facter.fact(fact).value?
allow(Facter).to receive(:value).with(fact.to_sym).and_return(value)
end
end
end
end
1 change: 1 addition & 0 deletions lib/rspec-puppet/matchers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
require 'rspec-puppet/matchers/run'
require 'rspec-puppet/matchers/count_generic'
require 'rspec-puppet/matchers/dynamic_matchers'
require 'rspec-puppet/matchers/fact_matchers'
require 'rspec-puppet/matchers/type_matchers'
require 'rspec-puppet/matchers/allow_value'
require 'rspec-puppet/matchers/raise_error'
Expand Down
11 changes: 11 additions & 0 deletions lib/rspec-puppet/matchers/fact_matchers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# frozen_string_literal: true

module RSpec::Puppet
module FactMatchers
extend RSpec::Matchers::DSL

matcher :have_value do |expected|
match { |actual| actual.value == expected }
end
end
end
28 changes: 28 additions & 0 deletions spec/facts/custom_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# frozen_string_literal: true

require 'spec_helper'

describe 'custom' do
it { is_expected.not_to be_nil }
it { is_expected.to have_value('bar') }

context 'with overridden' do
let(:facts) do
{
myfact: 'set'
}
end

it { is_expected.to have_value('foo') }
end

context 'with unrelated fact overridden' do
let(:facts) do
{
kernel: 'unix'
}
end

it { is_expected.to have_value('bar') }
end
end
3 changes: 3 additions & 0 deletions spec/fixtures/modules/custom_fact/lib/facter/custom.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Facter.add(:custom) do
setcode { Facter.value(:myfact) ? 'foo' : 'bar' }
end