diff options
author | Seth Chisamore <schisamo@opscode.com> | 2012-10-30 10:39:35 -0400 |
---|---|---|
committer | Seth Chisamore <schisamo@opscode.com> | 2012-10-30 10:39:35 -0400 |
commit | 24dc69a9a97e82a6e4207de68d6dcc664178249b (patch) | |
tree | 19bb289c9f88b4bbab066bc56b95d6d222fd5c35 /spec/unit/application_spec.rb | |
parent | 9348c1c9c80ee757354d624b7dc1b78ebc7605c4 (diff) | |
download | chef-24dc69a9a97e82a6e4207de68d6dcc664178249b.tar.gz |
[OC-3564] move core Chef to the repo root \o/ \m/
The opscode/chef repository now only contains the core Chef library code
used by chef-client, knife and chef-solo!
Diffstat (limited to 'spec/unit/application_spec.rb')
-rw-r--r-- | spec/unit/application_spec.rb | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/spec/unit/application_spec.rb b/spec/unit/application_spec.rb new file mode 100644 index 0000000000..c89bc27d4f --- /dev/null +++ b/spec/unit/application_spec.rb @@ -0,0 +1,239 @@ +# +# Author:: AJ Christensen (<aj@junglist.gen.nz>) +# Author:: Mark Mzyk (mmzyk@opscode.com) +# Copyright:: Copyright (c) 2008 Opscode, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'spec_helper' + +describe Chef::Application do + before do + Chef::Log.logger = Logger.new(StringIO.new) + @app = Chef::Application.new + Dir.stub!(:chdir).and_return(0) + @app.stub!(:reconfigure) + end + + describe "reconfigure" do + before do + @app = Chef::Application.new + @app.stub!(:configure_chef).and_return(true) + @app.stub!(:configure_logging).and_return(true) + end + + it "should configure chef" do + @app.should_receive(:configure_chef).and_return(true) + @app.reconfigure + end + + it "should configure logging" do + @app.should_receive(:configure_logging).and_return(true) + @app.reconfigure + end + + end + + describe Chef::Application do + before do + @app = Chef::Application.new + end + + describe "run" do + before do + @app.stub!(:setup_application).and_return(true) + @app.stub!(:run_application).and_return(true) + @app.stub!(:configure_chef).and_return(true) + @app.stub!(:configure_logging).and_return(true) + end + + it "should reconfigure the application before running" do + @app.should_receive(:reconfigure).and_return(true) + @app.run + end + + it "should setup the application before running it" do + @app.should_receive(:setup_application).and_return(true) + @app.run + end + + it "should run the actual application" do + @app.should_receive(:run_application).and_return(true) + @app.run + end + end + end + + describe "configure_chef" do + before do + @app = Chef::Application.new + #Chef::Config.stub!(:merge!).and_return(true) + @app.stub!(:parse_options).and_return(true) + end + + it "should parse the commandline options" do + @app.should_receive(:parse_options).and_return(true) + @app.config[:config_file] = "/etc/chef/default.rb" #have a config file set, to prevent triggering error block + @app.configure_chef + end + + describe "when a config_file is present" do + before do + Chef::Config.configuration.delete('rspec_ran') + + @config_file = Tempfile.new("rspec-chef-config") + @config_file.puts("rspec_ran('true')") + @config_file.close + + @app.config[:config_file] = "/etc/chef/default.rb" + end + + after do + @config_file.unlink + end + + it "should configure chef::config from a file" do + File.should_receive(:open).with("/etc/chef/default.rb").and_yield(@config_file) + Chef::Config.should_receive(:from_file).with(@config_file.path) + @app.configure_chef + end + + it "should merge the local config hash into chef::config" do + File.should_receive(:open).with("/etc/chef/default.rb").and_yield(@config_file) + @app.configure_chef + Chef::Config.rspec_ran.should == "true" + end + + end + + describe "when there is no config_file defined" do + before do + @app.config[:config_file] = nil + end + + it "should raise a fatal" do + Chef::Config.should_not_receive(:from_file).with("/etc/chef/default.rb") + Chef::Application.should_receive(:fatal!) + @app.configure_chef + end + end + + describe "when the config file is set and not found" do + before do + @app.config[:config_file] = "/etc/chef/notfound" + end + it "should use the passed in command line options and defaults" do + Chef::Config.should_receive(:merge!) + @app.configure_chef + end + end + + describe "when the config_file is an URL" do + before do + Chef::Config.configuration.delete('rspec_ran') + + @app.config[:config_file] = "http://example.com/foo.rb" + + @config_file = Tempfile.new("rspec-chef-config") + @config_file.puts("rspec_ran('true')") + @config_file.close + + + @cf = mock("cf") + #@cf.stub!(:path).and_return("/tmp/some/path") + #@cf.stub!(:nil?).and_return(false) + @rest = mock("rest") + #@rest.stub!(:get_rest).and_return(@rest) + #@rest.stub!(:open).and_yield(@cf) + Chef::REST.stub!(:new).and_return(@rest) + end + + after {@config_file.unlink} + + it "should configure chef::config from an URL" do + Chef::REST.should_receive(:new).with("", nil, nil).at_least(1).times.and_return(@rest) + @rest.should_receive(:fetch).with("http://example.com/foo.rb").and_yield(@config_file) + @app.configure_chef + Chef::Config.rspec_ran.should == "true" + end + end + end + + describe "configure_logging" do + before do + @app = Chef::Application.new + Chef::Log.stub!(:init) + Chef::Log.stub!(:level=) + end + + it "should initialise the chef logger" do + Chef::Log.should_receive(:init).with(Chef::Config[:log_location]).and_return(true) + @app.configure_logging + end + + it "should initialise the chef logger level" do + Chef::Log.should_receive(:level=).with(Chef::Config[:log_level]).and_return(true) + @app.configure_logging + end + + end + + describe "class method: fatal!" do + before do + STDERR.stub!(:puts).with("FATAL: blah").and_return(true) + Chef::Log.stub!(:fatal).with("blah").and_return(true) + Process.stub!(:exit).and_return(true) + end + + it "should log an error message to the logger" do + Chef::Log.should_receive(:fatal).with("blah").and_return(true) + Chef::Application.fatal! "blah" + end + + describe "when an exit code is supplied" do + it "should exit with the given exit code" do + Process.should_receive(:exit).with(-100).and_return(true) + Chef::Application.fatal! "blah", -100 + end + end + + describe "when an exit code is not supplied" do + it "should exit with the default exit code" do + Process.should_receive(:exit).with(-1).and_return(true) + Chef::Application.fatal! "blah" + end + end + + end + + describe "setup_application" do + before do + @app = Chef::Application.new + end + + it "should raise an error" do + lambda { @app.setup_application }.should raise_error(Chef::Exceptions::Application) + end + end + + describe "run_application" do + before do + @app = Chef::Application.new + end + + it "should raise an error" do + lambda { @app.run_application }.should raise_error(Chef::Exceptions::Application) + end + end +end |