#!/usr/bin/env ruby

$:.unshift("../../lib") if __FILE__ =~ /\.rb$/

require 'puppettest'
require 'mocha'
require 'puppet/network/handler/facts'

class TestFactsHandler < Test::Unit::TestCase
    include PuppetTest::ServerTest

    def setup
        super

        @class = Puppet::Network::Handler.handler(:facts)

        @@client_facts = {}

        unless Puppet::Util::FactStore.store(:testing)
            Puppet::Util::FactStore.newstore(:testing) do
                def get(node)
                    @@client_facts[node]
                end

                def set(node, facts)
                    @@client_facts[node] = facts
                end
            end
        end

        Puppet[:factstore] = :testing

        @handler = @class.new

        @facts = {:a => :b, :c => :d}
        @name = "foo"

        @backend = @handler.instance_variable_get("@backend")
    end

    def teardown
        @@client_facts.clear
    end

    def test_strip_internal
        @facts[:_puppet_one] = "yay"
        @facts[:_puppet_two] = "boo"
        @facts[:_puppetthree] = "foo"

        newfacts = nil
        assert_nothing_raised("Could not call strip_internal") do
            newfacts = @handler.send(:strip_internal, @facts)
        end

        [:_puppet_one, :_puppet_two, :_puppetthree].each do |name|
            assert(@facts.include?(name), "%s was removed in strip_internal from original hash" % name)
        end
        [:_puppet_one, :_puppet_two].each do |name|
            assert(! newfacts.include?(name), "%s was not removed in strip_internal" % name)
        end
        assert_equal("foo", newfacts[:_puppetthree], "_puppetthree was removed in strip_internal")
    end

    def test_add_internal
        newfacts = nil
        assert_nothing_raised("Could not call strip_internal") do
            newfacts = @handler.send(:add_internal, @facts)
        end

        assert_instance_of(Time, newfacts[:_puppet_timestamp], "Did not set timestamp in add_internal")
        assert(! @facts.include?(:_puppet_timestamp), "Modified original hash in add_internal")
    end

    def test_set
        newfacts = @facts.dup
        newfacts[:_puppet_timestamp] = Time.now
        @handler.expects(:add_internal).with(@facts).returns(newfacts)
        @backend.expects(:set).with(@name, newfacts).returns(nil)

        assert_nothing_raised("Could not set facts") do
            assert_nil(@handler.set(@name, @facts), "handler.set did not return nil")
        end
    end

    def test_get
        prefacts = @facts.dup
        prefacts[:_puppet_timestamp] = Time.now
        @@client_facts[@name] = prefacts
        @handler.expects(:strip_internal).with(prefacts).returns(@facts)
        @backend.expects(:get).with(@name).returns(prefacts)

        assert_nothing_raised("Could not retrieve facts") do
            assert_equal(@facts,  @handler.get(@name), "did not get correct answer from handler.get")
        end

        @handler = @class.new
        assert_nothing_raised("Failed to call 'get' with no stored facts") do
            @handler.get("nosuchname")
        end
    end

    def test_store_date
        time = Time.now
        @facts[:_puppet_timestamp] = time

        @handler.expects(:get).with(@name).returns(@facts)

        assert_equal(time.to_i, @handler.store_date(@name), "Did not retrieve timestamp correctly")
    end
end

# $Id: facts.rb 2457 2007-05-03 05:24:13Z luke $


syntax highlighted by Code2HTML, v. 0.9.1