0

I have the following rb script which generate puppet facts according to the packages installed and which seems to be working ok in my puppet environment:

begin
pack = Facter::Core::Execution.execute('rpm -qa | grep ^ts')
packages = pack.split("\n")
packagehash = Hash.new
packages.each do |f|
    packagehash[f.split("-")[0]] = f.split("-")[1] + ("-") + f.split("-")[2].split(".")[0]
end
rescue
end

begin
unless packagehash.empty?
    packagehash.each_pair do |k,v|
        Facter.add("bs_rpm_#{k}") {
            setcode { "#{v}" }
        }
    end
end
rescue
end

I wrote the following spec which runs a small dummy test to see if my rspec env in general is ok:

require 'spec_helper'

describe 'bs package spec' do
    before do
        Facter.fact(:kernel).stubs(:value).returns("windows")
    end

    it "should run windows" do
        Facter.fact(:kernel).value.should == "windows"
    end

    it "should create new facts" do
        Facter::Core::Execution.stubs(:execute).with('rpm -qa | grep ^ts').returns('ts3_hostt01-1.0.0-34.x86_64\n')
        Facter.fact(:bs_rpm_ts3_hostt01).value.should == "1.0.0-34"
    end
end

But then when running rake spec I get the following error:

[dan@kyvltvm00022 bs_master]$ rake spec
/home/dan/.rvm/rubies/ruby-2.1.0/bin/ruby -S rspec spec/unit/facter/bs_package_spec.rb --color
.F

Failures:

  1) bs package spec should create new facts
     Failure/Error: Facter::Core::Execution.stubs(:execute).with('rpm -qa | grep ^ts').returns('ts3_hostt01-1.0.0-34.x86_64\n')
     NameError:
       uninitialized constant Facter::Core
     # ./spec/unit/facter/bs_package_spec.rb:13:in `block (2 levels) in <top (required)>'

Finished in 0.00692 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/unit/facter/bs_package_spec.rb:12 # bs package spec should create new facts
/home/dan/.rvm/rubies/ruby-2.1.0/bin/ruby -S rspec spec/unit/facter/bs_package_spec.rb --color failed
[dan@kyvltvm00022 bs_master]$ exit

shell returned 1

[dan@kyvltvm00022 bs_master]$

What am I doing wrong or might be missing that is not loading Facter::Core ?? My spec_helper looks like this:

 [dan@kyvltvm00022 bs_master]$ cat spec/spec_helper.rb
dir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift File.join(dir, 'lib')

# Don't want puppet getting the command line arguments for rake or autotest
ARGV.clear

require 'puppet'
require 'facter'
require 'mocha'
gem 'rspec', '>=2.0.0'
require 'rspec/expectations'

require 'puppetlabs_spec_helper/puppet_spec_helper'

RSpec.configure do |config|
  # FIXME REVISIT - We may want to delegate to Facter like we do in
  # Puppet::PuppetSpecInitializer.initialize_via_testhelper(config) because
  # this behavior is a duplication of the spec_helper in Facter.
  config.before :each do
    # Ensure that we don't accidentally cache facts and environment between
    # test cases.  This requires each example group to explicitly load the
    # facts being exercised with something like
    # Facter.collection.loader.load(:ipaddress)
    Facter::Util::Loader.any_instance.stubs(:load_all)
    Facter.clear
    Facter.clear_messages
  end
end
[dan@kyvltvm00022 bs_master]$

[UPDATE]

After checking my test system I noticed the facter gem was missing core so I updated the code and test as follows:

pack is now:

pack = Facter::Util::Resolution.exec('rpm -qa | grep ^ts')

and the stub in my test now is:

Facter::Util::Resolution.stubs(:exec).with('rpm -qa | grep ^ts').returns('ts3_hostt01-1.0.0-34.x86_64\n')

And the result now is this:

[dan@kyvltvm00022 bs_master]$ rake spec
/home/dan/.rvm/rubies/ruby-2.1.0/bin/ruby -S rspec spec/unit/facter/bs_package_spec.rb --color
.F

Failures:

  1) bs package spec should create new facts
     Failure/Error: Facter.fact(:bs_rpm_ts3_hostt01).value.should == "1.0.0-34"
     NoMethodError:
       undefined method `value' for nil:NilClass
     # ./spec/unit/facter/bs_package_spec.rb:14:in `block (2 levels) in <top (required)>'

Finished in 0.00747 seconds
2 examples, 1 failure

Failed examples:

rspec ./spec/unit/facter/bs_package_spec.rb:12 # bs package spec should create new facts
/home/dan/.rvm/rubies/ruby-2.1.0/bin/ruby -S rspec spec/unit/facter/bs_package_spec.rb --color failed
[dan@kyvltvm00022 bs_master]$

What am i doing wrong in my test?

dan
  • 101
  • 1
  • 4
  • 12

1 Answers1

0

Looking through the facter code, this is the file you're requiring:

https://github.com/puppetlabs/facter/blob/master/lib/facter.rb

It doesn't require core/execution itself... without digging too much further in could you just try this in your spec_helper:

require 'facter/core/execution'
Mikey Hogarth
  • 4,672
  • 7
  • 28
  • 44
  • Thanks @mikey-hogarth but I realized that the facter gem installed in the test system does not have core so I changed the code and the test sligthly in the code pack is now `pack = Facter::Util::Resolution.exec('rpm -qa | grep ^ts')` and in the test I now do `Facter::Util::Resolution.stubs(:exec).with('rpm -qa | grep ^ts').returns('ts3_hostt01-1.0.0-34.x86_64\n')` instead. See the updated question for the new result ... – dan Jun 12 '14 at 08:07