Skip to content

Commit

Permalink
Merge pull request #160 from jordanbreen28/feat-add_merge_facts
Browse files Browse the repository at this point in the history
(feat) -  Add merge facts option to add_custom_fact
  • Loading branch information
bastelfreak authored Feb 21, 2024
2 parents ec05ede + d0c9451 commit 69f6331
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 1 deletion.
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,28 @@ To do this, pass a lambda as the value for the custom fact. The lambda is passed
add_custom_fact :root_home, lambda { |os,facts| "/tmp/#{facts['hostname']}" }
```

#### Merge into existing facts

You can also supply an optional input `:merge_facts` to the `add_custom_fact` method.

This allows you to merge facts values into a fact, if the fact is already present in the facts hash as oppose to overwriting the fact value.

```ruby
add_custom_fact :identity, { 'user' => 'test_user' }, merge_facts: true
```

Will result in a hash of the identity fact like the below:

```ruby
{
"gid"=>0,
"group"=>"root",
"privileged"=>true,
"uid"=>0,
"user"=>"test_user"
}
```

### Supplying Custom External Facts through FacterDB
Rspec-puppet-facts uses a gem called facterdb that contains many fact sets of various combinations that are pre generated. Rspec-puppet-facts queries
facterdb to pull out a specific fact set to use when testing.
Expand Down
9 changes: 8 additions & 1 deletion lib/rspec-puppet-facts.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
require 'facter'
require 'facterdb'
require 'json'
require 'deep_merge'

# The purpose of this module is to simplify the Puppet
# module's RSpec tests by looping through all supported
Expand Down Expand Up @@ -227,7 +228,13 @@ def self.with_custom_facts(os, facts)
next if fact[:options][:confine] && !fact[:options][:confine].include?(os)
next if fact[:options][:exclude] && fact[:options][:exclude].include?(os)

facts[name] = fact[:value].respond_to?(:call) ? fact[:value].call(os, facts) : fact[:value]
value = fact[:value].respond_to?(:call) ? fact[:value].call(os, facts) : fact[:value]
# if merge_facts passed, merge supplied facts into facts hash
if fact[:options][:merge_facts]
facts.deep_merge!({name => value})
else
facts[name] = value
end
end

facts
Expand Down
1 change: 1 addition & 0 deletions rspec-puppet-facts.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Gem::Specification.new do |s|

s.add_development_dependency 'voxpupuli-rubocop', '~> 2.4.0'

s.add_runtime_dependency 'deep_merge', '~> 1.2'
s.add_runtime_dependency 'facter', '< 5'
s.add_runtime_dependency 'facterdb', '>= 0.5.0', '< 2'
s.add_runtime_dependency 'puppet', '>= 7', '< 9'
Expand Down
20 changes: 20 additions & 0 deletions spec/rspec_puppet_facts_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -902,6 +902,26 @@
expect(subject['redhat-7-x86_64'][:root_home]).to eq '/root'
end

it 'merges a fact value into fact when merge_facts passed' do
add_custom_fact :identity, { 'user' => 'test_user' }, merge_facts: true
expect(subject['redhat-7-x86_64'][:identity]).to eq(
{
"gid"=>0,
"group"=>"root",
"privileged"=>true,
"uid"=>0,
"user"=>"test_user"
})
end

it 'overwrites fact' do
add_custom_fact :identity, { 'user' => 'other_user' }
expect(subject['redhat-7-x86_64'][:identity]).to eq(
{
"user"=>"other_user"
})
end

it 'confines a fact to a particular operating system' do
add_custom_fact 'root_home', '/root', :confine => 'redhat-7-x86_64'
expect(subject['redhat-7-x86_64'][:root_home]).to eq '/root'
Expand Down

0 comments on commit 69f6331

Please sign in to comment.