inspec/test/unit/inputs/input_test.rb

159 lines
5.5 KiB
Ruby
Raw Normal View History

require "helper"
require "inspec/objects/input"
describe Inspec::Input do
let(:opts) { {} }
let(:input) { Inspec::Input.new("test_input", opts) }
#==============================================================#
# Metadata
#==============================================================#
describe "setting and reading metadata" do
{
description: "My favorite attribute",
identifier: "a_ruby_permitted_name",
required: true,
title: "how is this different than description",
type: "Numeric",
}.each do |field, value|
it "should be able to recall the #{field} field" do
opts[field] = value
ipt = Inspec::Input.new("test_attribute", opts)
seen_value = ipt.send(field)
seen_value.must_equal value
end
end
end
#==============================================================#
# Code Generation
#==============================================================#
describe "to_ruby method" do
it "generates the code for the input" do
input = Inspec::Input.new("application_port", description: "The port my application uses", value: 80)
ruby_code = input.to_ruby
ruby_code.must_include "attr_application_port = " # Should assign to a var
# Should have the DSL call. This should be attribute(), not input(), for the
# foreseeable future, to maintain backwards compatibility.
ruby_code.must_include "attribute('application_port'"
ruby_code.must_include "value: 80"
ruby_code.must_include "default: 80"
ruby_code.must_include "description: 'The port my application uses'"
# Try to eval the code to verify that the generated code was valid ruby.
# Note that the input() method is part of the DSL, so we need to
# alter the call into something that can respond - the constructor will do
ruby_code_for_eval = ruby_code.sub(/attribute\(/, "Inspec::Input.new(")
# This will throw exceptions if there is a problem
new_attr = eval(ruby_code_for_eval) # rubocop:disable Security/Eval # Could use ripper!
new_attr.value.must_equal 80
end
end
# TODO - deprecate this, not sure it is used
describe "to_hash method" do
it "generates a similar hash" do
ipt = Inspec::Input.new(
"some_attr",
description: "The port my application uses",
value: 80,
identifier: "app_port",
required: false,
type: "numeric"
)
expected = {
name: "some_attr",
options: {
description: "The port my application uses",
value: 80,
identifier: "app_port",
required: false,
type: "Numeric", # This gets normalized
},
}
ipt.to_hash.must_equal expected
end
end
#==============================================================#
# Setting Value - One Shot
# (see events_test.rb for overwrite support)
#==============================================================#
describe "the dummy value used when value is not set" do
it "returns the actual value, not the dummy object, if one is assigned" do
input.value = "new_value"
input.value.must_equal "new_value"
end
it "returns the dummy value if no value is assigned" do
input.value.must_be_kind_of Inspec::Input::NO_VALUE_SET
input.value.is_a?(Inspec::Input::NO_VALUE_SET).must_equal true
input.value.to_s.must_equal "Input 'test_input' does not have a value. Skipping test."
end
it "the dummy value responds true to the legacy class checks" do
input.value.is_a?(Inspec::Attribute::DEFAULT_ATTRIBUTE).must_equal true
input.value.must_be_kind_of Inspec::Attribute::DEFAULT_ATTRIBUTE
end
it "has a dummy value that can be called like a nested map" do
input.value["hello"]["world"][1][2]["three"].wont_be_nil
end
it "has a dummy value that can take any nested method calls" do
input.value.call.some.fancy.functions.wont_be_nil
end
end
describe "setting a value in the constructor using value:" do
it "returns the user-configured value" do
input = Inspec::Input.new("test_input", value: "some_value")
input.value.must_equal "some_value"
end
it "returns the user-configured value if nil is explicitly assigned" do
input = Inspec::Input.new("test_input", value: nil)
input.value.must_be_nil
end
it "returns the user-configured value if false is explicitly assigned" do
input = Inspec::Input.new("test_input", value: false)
input.value.must_equal false
end
it "returns a new value if the value has been assigned by value=" do
input = Inspec::Input.new("test_input", value: "original_value")
input.value = "new_value"
input.value.must_equal "new_value"
end
it 'accepts the legacy ":default" option' do
input = Inspec::Input.new("test_input", default: "a_default")
input.value.must_equal "a_default"
end
it 'accepts the legacy ":default" and ":value" options' do
input = Inspec::Input.new("test_input", default: "a_default", value: "a_value")
input.value.must_equal "a_value"
end
end
describe "setting a value using value=" do
it "supports storing and returning a value" do
input.value = "a_value"
input.value.must_equal "a_value"
end
it "supports storing and returning false" do
input.value = false
input.value.must_equal false
end
it "supports storing and returning nil" do
input.value = nil
input.value.must_be_nil
end
end
end