1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
require 'spec_helper'
require 'puppet/application/facts'
describe Puppet::Application::Facts do
let(:app) { Puppet::Application[:facts] }
let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:2e"} }
before :each do
Puppet::Node::Facts.indirection.terminus_class = :memory
end
it "returns facts for a given node" do
facts = Puppet::Node::Facts.new('whatever', values)
Puppet::Node::Facts.indirection.save(facts)
app.command_line.args = %w{find whatever --render-as yaml}
# due to PUP-10105 we emit the class tag when we shouldn't
expected = Regexp.new(<<~END)
--- !ruby/object:Puppet::Node::Facts
name: whatever
values:
filesystems: apfs,autofs,devfs
macaddress: "64:52:11:22:03:2e"
END
expect {
app.run
}.to exit_with(0)
.and output(expected).to_stdout
end
it "returns facts for the current node when the name is omitted" do
facts = Puppet::Node::Facts.new(Puppet[:certname], values)
Puppet::Node::Facts.indirection.save(facts)
app.command_line.args = %w{find --render-as yaml}
# due to PUP-10105 we emit the class tag when we shouldn't
expected = Regexp.new(<<~END)
--- !ruby/object:Puppet::Node::Facts
name: #{Puppet[:certname]}
values:
filesystems: apfs,autofs,devfs
macaddress: "64:52:11:22:03:2e"
END
expect {
app.run
}.to exit_with(0)
.and output(expected).to_stdout
end
context 'when show action is called' do
let(:expected) { <<~END }
{
"filesystems": "apfs,autofs,devfs",
"macaddress": "64:52:11:22:03:2e"
}
END
before :each do
Puppet::Node::Facts.indirection.terminus_class = :facter
allow(Facter).to receive(:resolve).and_return(values)
app.command_line.args = %w{show}
end
it 'correctly displays facts with default formatting' do
expect {
app.run
}.to exit_with(0)
.and output(expected).to_stdout
end
it 'displays a single fact value' do
app.command_line.args << 'filesystems' << '--value-only'
expect {
app.run
}.to exit_with(0)
.and output("apfs,autofs,devfs\n").to_stdout
end
it "warns and ignores value-only when multiple fact names are specified" do
app.command_line.args << 'filesystems' << 'macaddress' << '--value-only'
expect {
app.run
}.to exit_with(0)
.and output(expected).to_stdout
.and output(/it can only be used when querying for a single fact/).to_stderr
end
{
"type_hash" => [{'a' => 2}, "{\n \"a\": 2\n}"],
"type_array" => [[], "[\n\n]"],
"type_string" => ["str", "str"],
"type_int" => [1, "1"],
"type_float" => [1.0, "1.0"],
"type_true" => [true, "true"],
"type_false" => [false, "false"],
"type_nil" => [nil, ""],
"type_sym" => [:sym, "sym"]
}.each_pair do |name, values|
it "renders '#{name}' as '#{values.last}'" do
fact_value = values.first
fact_output = values.last
allow(Facter).to receive(:resolve).and_return({name => fact_value})
app.command_line.args << name << '--value-only'
expect {
app.run
}.to exit_with(0)
.and output("#{fact_output}\n").to_stdout
end
end
end
context 'when default action is called' do
let(:expected) { <<~END }
---
filesystems: apfs,autofs,devfs
macaddress: 64:52:11:22:03:2e
END
before :each do
Puppet::Node::Facts.indirection.terminus_class = :facter
allow(Facter).to receive(:resolve).and_return(values)
app.command_line.args = %w{--render-as yaml}
end
it 'calls show action' do
expect {
app.run
}.to exit_with(0)
.and output(expected).to_stdout
expect(app.action.name).to eq(:show)
end
end
end
|