#!/usr/bin/env rspec require 'spec_helper' module MCollective::Facts describe Base do before do class Testfacts "facts_plugin", :class => "MCollective::Facts::Testfacts"} end describe "#inherited" do it "should add classes to the plugin manager" do MCollective::PluginManager.expects("<<").with({:type => "facts_plugin", :class => "MCollective::Facts::Bar"}) class Bar "bar"}).once f = Testfacts.new f.get_fact("foo") end it "should honor the cache timeout" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar"}).once f = Testfacts.new f.get_fact("foo") f.get_fact("foo") end it "should detect empty facts" do Testfacts.any_instance.stubs("load_facts_from_source").returns({}) MCollective::Log.expects("error").with("Failed to load facts: RuntimeError: Got empty facts").once f = Testfacts.new f.get_fact("foo") end it "should convert non string facts to strings" do Testfacts.any_instance.stubs("load_facts_from_source").returns({:foo => "bar"}) f = Testfacts.new f.get_fact("foo").should == "bar" end it "should not create duplicate facts while converting to strings" do Testfacts.any_instance.stubs("load_facts_from_source").returns({:foo => "bar"}) f = Testfacts.new f.get_fact(nil).include?(:foo).should == false end it "should update last_facts_load on success" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar"}).once f = Testfacts.new f.get_fact("foo") f.instance_variable_get("@last_facts_load").should_not == 0 end it "should restore last known good facts on failure" do Testfacts.any_instance.stubs("load_facts_from_source").returns({}).once MCollective::Log.expects("error").with("Failed to load facts: RuntimeError: Got empty facts").once f = Testfacts.new f.instance_variable_set("@last_good_facts", {"foo" => "bar"}) f.get_fact("foo").should == "bar" end it "should return all facts for nil parameter" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar", "bar" => "baz"}) f = Testfacts.new f.get_fact(nil).keys.size.should == 2 end it "should return a specific fact when specified" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar", "bar" => "baz"}) f = Testfacts.new f.get_fact("bar").should == "baz" end end describe "#get_facts" do it "should load and return all facts" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar", "bar" => "baz"}) f = Testfacts.new f.get_facts.should == {"foo" => "bar", "bar" => "baz"} end end describe "#has_fact?" do it "should correctly report fact presense" do Testfacts.any_instance.stubs("load_facts_from_source").returns({"foo" => "bar"}) f = Testfacts.new f.has_fact?("foo").should == true f.has_fact?("bar").should == false end end describe '#normalize_facts' do it 'should make symbols that are keys be strings' do Testfacts.new.send(:normalize_facts, { :foo => "1", "bar" => "2", }).should == { "foo" => "1", "bar" => "2", } end it 'should make values that are not strings be strings' do Testfacts.new.send(:normalize_facts, { "foo" => 1, "bar" => :baz, }).should == { "foo" => "1", "bar" => "baz", } end it 'should not flatten arrays or hashes' do Testfacts.new.send(:normalize_facts, { "foo" => [ "1", "quux", 2 ], "bar" => { :baz => "quux", }, }).should == { "foo" => [ "1", "quux", "2" ], "bar" => { "baz" => "quux", }, } end end end end