summaryrefslogtreecommitdiff
path: root/spec/unit/resource/inspec_input_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/resource/inspec_input_spec.rb')
-rw-r--r--spec/unit/resource/inspec_input_spec.rb300
1 files changed, 300 insertions, 0 deletions
diff --git a/spec/unit/resource/inspec_input_spec.rb b/spec/unit/resource/inspec_input_spec.rb
new file mode 100644
index 0000000000..4acdfd60a9
--- /dev/null
+++ b/spec/unit/resource/inspec_input_spec.rb
@@ -0,0 +1,300 @@
+#
+# Copyright:: Copyright (c) Chef Software 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::Resource::InspecInput do
+ def load_input(filename)
+ path = "/var/chef/cache/cookbooks/acme_compliance/compliance/inputs/#{filename}"
+ run_context.input_collection << Chef::Compliance::Input.from_yaml(events, input_yaml, path, "acme_compliance")
+ end
+
+ let(:node) { Chef::Node.new }
+ let(:events) { Chef::EventDispatch::Dispatcher.new }
+ let(:run_context) do
+ Chef::RunContext.new(node, {}, events).tap do |rc|
+ end
+ end
+ let(:collection) { double("resource collection") }
+ let(:input_yaml) do
+ <<~EOH
+ssh_custom_path: "/whatever2"
+ EOH
+ end
+ let(:input_json) do
+ <<~EOH
+ { "ssh_custom_path": "/whatever2" }
+ EOH
+ end
+ let(:input_toml) do
+ <<~EOH
+ssh_custom_path = "/whatever2"
+ EOH
+ end
+ let(:input_hash) do
+ { ssh_custom_path: "/whatever2" }
+ end
+ let(:resource) do
+ Chef::Resource::InspecInput.new("ssh-01", run_context)
+ end
+ let(:provider) { resource.provider_for_action(:add) }
+
+ before do
+ allow(run_context).to receive(:resource_collection).and_return(collection)
+ end
+
+ it "sets the default action as :add" do
+ expect(resource.action).to eql([:add])
+ end
+
+ context "with a input in a cookbook" do
+ it "enables the input by the name of the cookbook" do
+ load_input("default.yml")
+ resource.name "acme_compliance"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "enables the input with a regular expression for the cookbook" do
+ load_input("default.yml")
+ resource.name "acme_comp.*"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "enables the input with an explicit name" do
+ load_input("default.yml")
+ resource.name "acme_compliance::default"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "fails when the cookbook name is wrong" do
+ load_input("default.yml")
+ resource.name "evil_compliance"
+ expect { resource.run_action(:add) }.to raise_error(StandardError)
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "enables the input when its not named default" do
+ load_input("ssh01.yml")
+ resource.name "acme_compliance::ssh01"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "fails when it is not named default and you attempt to enable the default" do
+ load_input("ssh01.yml")
+ resource.name "acme_compliance"
+ expect { resource.run_action(:add) }.to raise_error(StandardError)
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "succeeds with a regexp that matches the cookbook name" do
+ load_input("ssh01.yml")
+ resource.name "acme_comp.*::ssh01"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "succeeds with a regexp that matches the file name" do
+ load_input("ssh01.yml")
+ resource.name "acme_compliance::ssh.*"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "succeeds with a regexps for both the file name and cookbook name" do
+ load_input("ssh01.yml")
+ resource.name "acme_comp.*::ssh.*"
+ resource.run_action(:add)
+ expect(run_context.input_collection.first).to be_enabled
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "fails with regexps that do not match" do
+ load_input("ssh01.yml")
+ resource.name "evil_comp.*::etcd.*"
+ expect { resource.run_action(:add) }.to raise_error(StandardError)
+ end
+
+ it "substring matches without regexps should fail when they are at the end" do
+ load_input("ssh01.yml")
+ resource.name "acme_complianc::ssh0"
+ expect { resource.run_action(:add) }.to raise_error(StandardError)
+ end
+
+ it "substring matches without regexps should fail when they are at the start" do
+ load_input("ssh01.yml")
+ resource.name "cme_compliance::sh01"
+ expect { resource.run_action(:add) }.to raise_error(StandardError)
+ end
+ end
+
+ context "with a input in a file" do
+ it "loads a YAML file" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".yaml"])
+ tempfile.write input_yaml
+ tempfile.close
+ resource.name tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a YAML file in a source attribute" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".yaml"])
+ tempfile.write input_yaml
+ tempfile.close
+ resource.name "my-resource-name"
+ resource.source tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a YML file" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".yml"])
+ tempfile.write input_yaml
+ tempfile.close
+ resource.name tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a YML file using the source attribute" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".yml"])
+ tempfile.write input_yaml
+ tempfile.close
+ resource.name "my-resource-name"
+ resource.source tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a JSON file" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".json"])
+ tempfile.write input_json
+ tempfile.close
+ resource.name tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a JSON file using the source attribute" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".json"])
+ tempfile.write input_json
+ tempfile.close
+ resource.name "my-resource-name"
+ resource.source tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a TOML file" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".toml"])
+ tempfile.write input_toml
+ tempfile.close
+ resource.name tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a TOML file using the source attribute" do
+ tempfile = Tempfile.new(["spec-compliance-test", ".toml"])
+ tempfile.write input_toml
+ tempfile.close
+ resource.name "my-resource-name"
+ resource.source tempfile.path
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+
+ it "loads a Hash" do
+ resource.source input_hash
+
+ resource.run_action(:add)
+
+ expect(run_context.input_collection.first).to be_enabled
+ expect(run_context.input_collection.size).to be 1
+ expect(run_context.input_collection.first.cookbook_name).to be nil
+ expect(run_context.input_collection.first.path).to be nil
+ expect(run_context.input_collection.first.pathname).to be nil
+ expect(resource).not_to be_updated_by_last_action
+ end
+ end
+end