spec/kitchen/config_spec.rb in test-kitchen-1.7.0 vs spec/kitchen/config_spec.rb in test-kitchen-1.7.1.dev

- old
+ new

@@ -1,408 +1,408 @@ -# -*- encoding: utf-8 -*- -# -# Author:: Fletcher Nichol (<fnichol@nichol.ca>) -# -# Copyright (C) 2012, Fletcher Nichol -# -# 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_relative "../spec_helper" - -require "kitchen" -require "kitchen/logging" -require "kitchen/collection" -require "kitchen/config" -require "kitchen/driver" -require "kitchen/instance" -require "kitchen/platform" -require "kitchen/provisioner" -require "kitchen/suite" -require "kitchen/transport" -require "kitchen/util" -require "kitchen/verifier" - -module Kitchen - - class DummyLoader - - attr_writer :data - - def read - @data || Hash.new - end - end -end - -describe Kitchen::Config do - - let(:loader) { Kitchen::DummyLoader.new } - let(:config) { Kitchen::Config.new(opts) } - - let(:opts) do - { - :loader => loader, - :kitchen_root => "/tmp/that/place", - :log_root => "/tmp/logs", - :test_base_path => "/testing/yo", - :log_level => :debug, - :log_overwrite => false - } - end - - let(:default_kitchen_config) do - { - :defaults => { - :driver => "dummy", - :provisioner => "chef_solo", - :transport => "ssh", - :verifier => "busser" - }, - :kitchen_root => "/tmp/that/place", - :test_base_path => "/testing/yo", - :log_level => :debug, - :log_overwrite => false - } - end - - describe "#loader" do - - it "returns its loader" do - config.loader.must_equal loader - end - - it "creates a Kitchen::Loader::YAML loader by default" do - opts.delete(:loader) - - config.loader.must_be_kind_of Kitchen::Loader::YAML - end - end - - describe "#kitchen_root" do - - it "returns its kitchen root" do - config.kitchen_root.must_equal "/tmp/that/place" - end - - it "uses Dir.pwd by default" do - opts.delete(:kitchen_root) - - config.kitchen_root.must_equal Dir.pwd - end - end - - describe "#log_root" do - - it "returns its log root" do - config.log_root.must_equal "/tmp/logs" - end - - it "calculates a default log root using kitchen_root" do - opts.delete(:log_root) - - config.log_root.must_equal "/tmp/that/place/.kitchen/logs" - end - end - - describe "#test_base_path" do - - it "returns its base test path" do - config.test_base_path.must_equal "/testing/yo" - end - - it "calculates a default base using kitchen_root" do - opts.delete(:test_base_path) - - config.test_base_path.must_equal "/tmp/that/place/test/integration" - end - end - - describe "#log_level" do - - it "returns its log level" do - config.log_level.must_equal :debug - end - - it "uses :info by default" do - opts.delete(:log_level) - - config.log_level.must_equal :info - end - end - - describe "#log_overwrite" do - - it "returns its log level" do - config.log_overwrite.must_equal false - end - - it "uses :info by default" do - opts.delete(:log_overwrite) - - config.log_overwrite.must_equal true - end - end - - describe "#platforms" do - - before do - Kitchen::DataMunger.stubs(:new).returns(munger) - Kitchen::Platform.stubs(:new).returns("platform") - end - - let(:munger) do - stub( - :platform_data => [{ :one => "a" }, { :two => "b" }] - ) - end - - it "loader loads data" do - loader.expects(:read).returns(Hash.new) - - config.platforms - end - - it "constructs a munger with loader data and defaults" do - loader.stubs(:read).returns("datum") - - Kitchen::DataMunger.expects(:new).with { |data, kitchen_config| - data.must_equal "datum" - kitchen_config.is_a?(Hash).must_equal true - }.returns(munger) - - config.platforms - end - - it "platform_data is called on munger" do - munger.expects(:platform_data).returns([]) - - config.platforms - end - - it "contructs Platform objects" do - Kitchen::Platform.expects(:new).with(:one => "a") - Kitchen::Platform.expects(:new).with(:two => "b") - - config.platforms - end - - it "returns a Collection of platforms" do - Kitchen::Platform.stubs(:new). - with(:one => "a").returns(stub(:name => "one")) - Kitchen::Platform.stubs(:new). - with(:two => "b").returns(stub(:name => "two")) - - config.platforms.as_names.must_equal %w[one two] - end - end - - describe "#suites" do - - before do - Kitchen::DataMunger.stubs(:new).returns(munger) - Kitchen::Suite.stubs(:new).returns("suite") - end - - let(:munger) do - stub( - :suite_data => [{ :one => "a" }, { :two => "b" }] - ) - end - - it "loader loads data" do - loader.expects(:read).returns(Hash.new) - - config.suites - end - - it "constucts a munger with loader data and defaults" do - loader.stubs(:read).returns("datum") - - Kitchen::DataMunger.expects(:new).with { |data, kitchen_config| - data.must_equal "datum" - kitchen_config.is_a?(Hash).must_equal true - }.returns(munger) - - config.suites - end - - it "platform_data is called on munger" do - munger.expects(:suite_data).returns([]) - - config.suites - end - - it "contructs Suite objects" do - Kitchen::Suite.expects(:new).with(:one => "a") - Kitchen::Suite.expects(:new).with(:two => "b") - - config.suites - end - - it "returns a Collection of suites" do - Kitchen::Suite.stubs(:new). - with(:one => "a").returns(stub(:name => "one")) - Kitchen::Suite.stubs(:new). - with(:two => "b").returns(stub(:name => "two")) - - config.suites.as_names.must_equal %w[one two] - end - end - - describe "#instances" do - - let(:platforms) do - [stub(:name => "unax")] - end - - let(:suites) do - [stub(:name => "tiny", :includes => [], :excludes => [])] - end - - let(:munger) do - stub( - :driver_data_for => { "junk" => true }, - :provisioner_data_for => { "junk" => true }, - :transport_data_for => { "junk" => true }, - :verifier_data_for => { "junk" => true } - ) - end - - before do - Kitchen::Instance.stubs(:new).returns("instance") - Kitchen::Driver.stubs(:for_plugin).returns("driver") - Kitchen::Provisioner.stubs(:for_plugin).returns("provisioner") - Kitchen::Transport.stubs(:for_plugin).returns("transport") - Kitchen::Verifier.stubs(:for_plugin).returns("verifier") - Kitchen::Logger.stubs(:new).returns("logger") - Kitchen::StateFile.stubs(:new).returns("state_file") - - Kitchen::DataMunger.stubs(:new).returns(munger) - config.stubs(:platforms).returns(platforms) - config.stubs(:suites).returns(suites) - end - - it "constructs a Driver object" do - munger.expects(:driver_data_for).with("tiny", "unax"). - returns(:name => "drivey", :datum => "lots") - Kitchen::Driver.unstub(:for_plugin) - Kitchen::Driver.expects(:for_plugin). - with("drivey", :name => "drivey", :datum => "lots") - - config.instances - end - - it "constructs a Provisioner object" do - munger.expects(:provisioner_data_for).with("tiny", "unax"). - returns(:name => "provey", :datum => "lots") - Kitchen::Provisioner.unstub(:for_plugin) - Kitchen::Provisioner.expects(:for_plugin). - with("provey", :name => "provey", :datum => "lots") - - config.instances - end - - it "constructs a Transport object" do - munger.expects(:transport_data_for).with("tiny", "unax"). - returns(:name => "transey", :datum => "lots") - Kitchen::Transport.unstub(:for_plugin) - Kitchen::Transport.expects(:for_plugin). - with("transey", :name => "transey", :datum => "lots") - - config.instances - end - - it "constructs a Verifier object" do - munger.expects(:verifier_data_for).with("tiny", "unax"). - returns(:name => "vervey", :datum => "lots") - Kitchen::Verifier.unstub(:for_plugin) - Kitchen::Verifier.expects(:for_plugin). - with("vervey", :name => "vervey", :datum => "lots") - - config.instances - end - - it "constructs a Logger object" do - Kitchen::Logger.unstub(:new) - Kitchen::Logger.expects(:new).with( - :stdout => STDOUT, - :color => :cyan, - :logdev => "/tmp/logs/tiny-unax.log", - :log_overwrite => false, - :level => 0, - :progname => "tiny-unax" - ) - - config.instances - end - - it "constructs a StateFile object" do - Kitchen::StateFile.unstub(:new) - Kitchen::StateFile.expects(:new).with("/tmp/that/place", "tiny-unax") - - config.instances - end - - it "constructs an Instance object from all built objects" do - Kitchen::Instance.unstub(:new) - - Kitchen::Instance.expects(:new).with( - :driver => "driver", - :logger => "logger", - :suite => suites.first, - :platform => platforms.first, - :provisioner => "provisioner", - :transport => "transport", - :verifier => "verifier", - :state_file => "state_file" - ) - - config.instances - end - end - - describe "using Suite#includes" do - - it "selects only platforms in a suite's includes array" do - config.stubs(:platforms).returns([ - stub(:name => "good"), - stub(:name => "nope"), - stub(:name => "one") - ]) - config.stubs(:suites).returns([ - stub(:name => "selecta", :includes => %w[good one], :excludes => []), - stub(:name => "allem", :includes => [], :excludes => []) - ]) - - config.instances.as_names.must_equal [ - "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"] - end - end - - describe "using Suite#excludes" do - - it "selects only platforms in a suite's includes array" do - config.stubs(:platforms).returns([ - stub(:name => "good"), - stub(:name => "nope"), - stub(:name => "one") - ]) - config.stubs(:suites).returns([ - stub(:name => "selecta", :includes => [], :excludes => ["nope"]), - stub(:name => "allem", :includes => [], :excludes => []) - ]) - - config.instances.as_names.must_equal [ - "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"] - end - end -end +# -*- encoding: utf-8 -*- +# +# Author:: Fletcher Nichol (<fnichol@nichol.ca>) +# +# Copyright (C) 2012, Fletcher Nichol +# +# 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_relative "../spec_helper" + +require "kitchen" +require "kitchen/logging" +require "kitchen/collection" +require "kitchen/config" +require "kitchen/driver" +require "kitchen/instance" +require "kitchen/platform" +require "kitchen/provisioner" +require "kitchen/suite" +require "kitchen/transport" +require "kitchen/util" +require "kitchen/verifier" + +module Kitchen + + class DummyLoader + + attr_writer :data + + def read + @data || Hash.new + end + end +end + +describe Kitchen::Config do + + let(:loader) { Kitchen::DummyLoader.new } + let(:config) { Kitchen::Config.new(opts) } + + let(:opts) do + { + :loader => loader, + :kitchen_root => "/tmp/that/place", + :log_root => "/tmp/logs", + :test_base_path => "/testing/yo", + :log_level => :debug, + :log_overwrite => false + } + end + + let(:default_kitchen_config) do + { + :defaults => { + :driver => "dummy", + :provisioner => "chef_solo", + :transport => "ssh", + :verifier => "busser" + }, + :kitchen_root => "/tmp/that/place", + :test_base_path => "/testing/yo", + :log_level => :debug, + :log_overwrite => false + } + end + + describe "#loader" do + + it "returns its loader" do + config.loader.must_equal loader + end + + it "creates a Kitchen::Loader::YAML loader by default" do + opts.delete(:loader) + + config.loader.must_be_kind_of Kitchen::Loader::YAML + end + end + + describe "#kitchen_root" do + + it "returns its kitchen root" do + config.kitchen_root.must_equal "/tmp/that/place" + end + + it "uses Dir.pwd by default" do + opts.delete(:kitchen_root) + + config.kitchen_root.must_equal Dir.pwd + end + end + + describe "#log_root" do + + it "returns its log root" do + config.log_root.must_equal "/tmp/logs" + end + + it "calculates a default log root using kitchen_root" do + opts.delete(:log_root) + + config.log_root.must_equal "/tmp/that/place/.kitchen/logs" + end + end + + describe "#test_base_path" do + + it "returns its base test path" do + config.test_base_path.must_equal "/testing/yo" + end + + it "calculates a default base using kitchen_root" do + opts.delete(:test_base_path) + + config.test_base_path.must_equal "/tmp/that/place/test/integration" + end + end + + describe "#log_level" do + + it "returns its log level" do + config.log_level.must_equal :debug + end + + it "uses :info by default" do + opts.delete(:log_level) + + config.log_level.must_equal :info + end + end + + describe "#log_overwrite" do + + it "returns its log level" do + config.log_overwrite.must_equal false + end + + it "uses :info by default" do + opts.delete(:log_overwrite) + + config.log_overwrite.must_equal true + end + end + + describe "#platforms" do + + before do + Kitchen::DataMunger.stubs(:new).returns(munger) + Kitchen::Platform.stubs(:new).returns("platform") + end + + let(:munger) do + stub( + :platform_data => [{ :one => "a" }, { :two => "b" }] + ) + end + + it "loader loads data" do + loader.expects(:read).returns(Hash.new) + + config.platforms + end + + it "constructs a munger with loader data and defaults" do + loader.stubs(:read).returns("datum") + + Kitchen::DataMunger.expects(:new).with { |data, kitchen_config| + data.must_equal "datum" + kitchen_config.is_a?(Hash).must_equal true + }.returns(munger) + + config.platforms + end + + it "platform_data is called on munger" do + munger.expects(:platform_data).returns([]) + + config.platforms + end + + it "contructs Platform objects" do + Kitchen::Platform.expects(:new).with(:one => "a") + Kitchen::Platform.expects(:new).with(:two => "b") + + config.platforms + end + + it "returns a Collection of platforms" do + Kitchen::Platform.stubs(:new). + with(:one => "a").returns(stub(:name => "one")) + Kitchen::Platform.stubs(:new). + with(:two => "b").returns(stub(:name => "two")) + + config.platforms.as_names.must_equal %w[one two] + end + end + + describe "#suites" do + + before do + Kitchen::DataMunger.stubs(:new).returns(munger) + Kitchen::Suite.stubs(:new).returns("suite") + end + + let(:munger) do + stub( + :suite_data => [{ :one => "a" }, { :two => "b" }] + ) + end + + it "loader loads data" do + loader.expects(:read).returns(Hash.new) + + config.suites + end + + it "constucts a munger with loader data and defaults" do + loader.stubs(:read).returns("datum") + + Kitchen::DataMunger.expects(:new).with { |data, kitchen_config| + data.must_equal "datum" + kitchen_config.is_a?(Hash).must_equal true + }.returns(munger) + + config.suites + end + + it "platform_data is called on munger" do + munger.expects(:suite_data).returns([]) + + config.suites + end + + it "contructs Suite objects" do + Kitchen::Suite.expects(:new).with(:one => "a") + Kitchen::Suite.expects(:new).with(:two => "b") + + config.suites + end + + it "returns a Collection of suites" do + Kitchen::Suite.stubs(:new). + with(:one => "a").returns(stub(:name => "one")) + Kitchen::Suite.stubs(:new). + with(:two => "b").returns(stub(:name => "two")) + + config.suites.as_names.must_equal %w[one two] + end + end + + describe "#instances" do + + let(:platforms) do + [stub(:name => "unax")] + end + + let(:suites) do + [stub(:name => "tiny", :includes => [], :excludes => [])] + end + + let(:munger) do + stub( + :driver_data_for => { "junk" => true }, + :provisioner_data_for => { "junk" => true }, + :transport_data_for => { "junk" => true }, + :verifier_data_for => { "junk" => true } + ) + end + + before do + Kitchen::Instance.stubs(:new).returns("instance") + Kitchen::Driver.stubs(:for_plugin).returns("driver") + Kitchen::Provisioner.stubs(:for_plugin).returns("provisioner") + Kitchen::Transport.stubs(:for_plugin).returns("transport") + Kitchen::Verifier.stubs(:for_plugin).returns("verifier") + Kitchen::Logger.stubs(:new).returns("logger") + Kitchen::StateFile.stubs(:new).returns("state_file") + + Kitchen::DataMunger.stubs(:new).returns(munger) + config.stubs(:platforms).returns(platforms) + config.stubs(:suites).returns(suites) + end + + it "constructs a Driver object" do + munger.expects(:driver_data_for).with("tiny", "unax"). + returns(:name => "drivey", :datum => "lots") + Kitchen::Driver.unstub(:for_plugin) + Kitchen::Driver.expects(:for_plugin). + with("drivey", :name => "drivey", :datum => "lots") + + config.instances + end + + it "constructs a Provisioner object" do + munger.expects(:provisioner_data_for).with("tiny", "unax"). + returns(:name => "provey", :datum => "lots") + Kitchen::Provisioner.unstub(:for_plugin) + Kitchen::Provisioner.expects(:for_plugin). + with("provey", :name => "provey", :datum => "lots") + + config.instances + end + + it "constructs a Transport object" do + munger.expects(:transport_data_for).with("tiny", "unax"). + returns(:name => "transey", :datum => "lots") + Kitchen::Transport.unstub(:for_plugin) + Kitchen::Transport.expects(:for_plugin). + with("transey", :name => "transey", :datum => "lots") + + config.instances + end + + it "constructs a Verifier object" do + munger.expects(:verifier_data_for).with("tiny", "unax"). + returns(:name => "vervey", :datum => "lots") + Kitchen::Verifier.unstub(:for_plugin) + Kitchen::Verifier.expects(:for_plugin). + with("vervey", :name => "vervey", :datum => "lots") + + config.instances + end + + it "constructs a Logger object" do + Kitchen::Logger.unstub(:new) + Kitchen::Logger.expects(:new).with( + :stdout => STDOUT, + :color => :cyan, + :logdev => "/tmp/logs/tiny-unax.log", + :log_overwrite => false, + :level => 0, + :progname => "tiny-unax" + ) + + config.instances + end + + it "constructs a StateFile object" do + Kitchen::StateFile.unstub(:new) + Kitchen::StateFile.expects(:new).with("/tmp/that/place", "tiny-unax") + + config.instances + end + + it "constructs an Instance object from all built objects" do + Kitchen::Instance.unstub(:new) + + Kitchen::Instance.expects(:new).with( + :driver => "driver", + :logger => "logger", + :suite => suites.first, + :platform => platforms.first, + :provisioner => "provisioner", + :transport => "transport", + :verifier => "verifier", + :state_file => "state_file" + ) + + config.instances + end + end + + describe "using Suite#includes" do + + it "selects only platforms in a suite's includes array" do + config.stubs(:platforms).returns([ + stub(:name => "good"), + stub(:name => "nope"), + stub(:name => "one") + ]) + config.stubs(:suites).returns([ + stub(:name => "selecta", :includes => %w[good one], :excludes => []), + stub(:name => "allem", :includes => [], :excludes => []) + ]) + + config.instances.as_names.must_equal [ + "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"] + end + end + + describe "using Suite#excludes" do + + it "selects only platforms in a suite's includes array" do + config.stubs(:platforms).returns([ + stub(:name => "good"), + stub(:name => "nope"), + stub(:name => "one") + ]) + config.stubs(:suites).returns([ + stub(:name => "selecta", :includes => [], :excludes => ["nope"]), + stub(:name => "allem", :includes => [], :excludes => []) + ]) + + config.instances.as_names.must_equal [ + "selecta-good", "selecta-one", "allem-good", "allem-nope", "allem-one"] + end + end +end