#! /usr/bin/env ruby
require 'spec_helper'
require 'facter/operatingsystem'
require 'facter/util/registry'

describe Facter::Util::Registry do
  describe "hklm_read", :if => Facter::Util::Config.is_windows? do
    before(:all) do
      require 'win32/registry'
    end
    describe "valid params" do
      [ {:key => "valid_key", :value => "valid_value",  :expected => "valid"},
        {:key => "valid_key", :value => "",             :expected => "valid"},
        {:key => "valid_key", :value => nil,            :expected => "invalid"},
        {:key => "",          :value => "valid_value",  :expected => "valid"},
        {:key => "",          :value => "",             :expected => "valid"},
        {:key => "",          :value => nil,            :expected => "invalid"},
        {:key => nil,         :value => "valid_value",  :expected => "invalid"},
        {:key => nil,         :value => "",             :expected => "invalid"},
        {:key => nil,         :value => nil,            :expected => "invalid"}
      ].each do |scenario|
        describe "with key #{scenario[:key] || "nil"} and value #{scenario[:value] || "nil"}" do
          let :fake_registry_key do
            fake = {}
            fake[scenario[:value]] = scenario[:expected]
            fake
          end
          it "should return #{scenario[:expected]} value" do
            Win32::Registry::HKEY_LOCAL_MACHINE.stubs(:open).with(scenario[:key]).returns(fake_registry_key)
            fake_registry_key.stubs(:close)

            Facter::Util::Registry.hklm_read(scenario[:key], scenario[:value]).should == scenario[:expected]
          end
        end
      end
    end

    describe "invalid params" do
      [ {:key => "valid_key",   :value => "invalid_value"},
        {:key => "valid_key",   :value => ""},
        {:key => "valid_key",   :value => nil},
      ].each do |scenario|
        describe "with valid key and value #{scenario[:value] || "nil"}" do
          let :fake_registry_key do
            {}
          end
          it "should raise an error" do
            Win32::Registry::HKEY_LOCAL_MACHINE.stubs(:open).with(scenario[:key]).returns(fake_registry_key)
            fake_registry_key.stubs(:close)

            Facter::Util::Registry.hklm_read(scenario[:key], scenario[:value]).should raise_error
          end
        end
      end
      [ {:key => "invalid_key", :value => "valid_value"},
        {:key => "invalid_key", :value => ""},
        {:key => "invalid_key", :value => nil},
        {:key => "",            :value => "valid_value"},
        {:key => "",            :value => ""},
        {:key => "",            :value => nil},
        {:key => nil,           :value => "valid_value"},
        {:key => nil,           :value => ""},
        {:key => nil,           :value => nil}
      ].each do |scenario|
        describe "with invalid key #{scenario[:key] || "nil"} and value #{scenario[:value] || "nil"}" do
          it "should raise an error" do
            Win32::Registry::HKEY_LOCAL_MACHINE.stubs(:open).with(scenario[:key]).raises(Win32::Registry::Error, 2)
            expect do
              Facter::Util::Registry.hklm_read(scenario[:key], scenario[:value])
            end.to raise_error Win32::Registry::Error
          end
        end
      end
    end
  end
end