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
|
require 'spec_helper'
require 'puppet_spec/files'
require 'puppet/face'
describe Puppet::Face[:parser, :current] do
include PuppetSpec::Files
let(:parser) { Puppet::Face[:parser, :current] }
context "validate" do
context "from an interactive terminal" do
before :each do
from_an_interactive_terminal
end
it "validates the configured site manifest when no files are given" do
manifest = file_containing('site.pp', "{ invalid =>")
configured_environment = Puppet::Node::Environment.create(:default, [], manifest)
Puppet.override(:current_environment => configured_environment) do
expect { parser.validate() }.to exit_with(1)
end
end
it "validates the given file" do
manifest = file_containing('site.pp', "{ invalid =>")
expect { parser.validate(manifest) }.to exit_with(1)
end
it "runs error free when there are no validation errors" do
manifest = file_containing('site.pp', "notify { valid: }")
parser.validate(manifest)
end
it "reports missing files" do
expect do
parser.validate("missing.pp")
end.to raise_error(Puppet::Error, /One or more file\(s\) specified did not exist.*missing\.pp/m)
end
it "parses supplied manifest files in the context of a directory environment" do
manifest = file_containing('test.pp', "{ invalid =>")
env = Puppet::Node::Environment.create(:special, [])
env_loader = Puppet::Environments::Static.new(env)
Puppet.override({:environments => env_loader, :current_environment => env}) do
expect { parser.validate(manifest) }.to exit_with(1)
end
expect(@logs.join).to match(/environment special.*Syntax error at '\{'/)
end
end
it "validates the contents of STDIN when no files given and STDIN is not a tty" do
from_a_piped_input_of("{ invalid =>")
Puppet.override(:current_environment => Puppet::Node::Environment.create(:special, [])) do
expect { parser.validate() }.to exit_with(1)
end
end
end
context "dump" do
it "prints the AST of the passed expression" do
expect(parser.dump({ :e => 'notice hi' })).to eq("(invoke notice hi)\n")
end
it "prints the AST of the code read from the passed files" do
first_manifest = file_containing('site.pp', "notice hi")
second_manifest = file_containing('site2.pp', "notice bye")
output = parser.dump(first_manifest, second_manifest)
expect(output).to match(/site\.pp.*\(invoke notice hi\)/)
expect(output).to match(/site2\.pp.*\(invoke notice bye\)/)
end
it "informs the user of files that don't exist" do
expect(parser.dump('does_not_exist_here.pp')).to match(/did not exist:\s*does_not_exist_here\.pp/m)
end
it "prints the AST of STDIN when no files given and STDIN is not a tty" do
from_a_piped_input_of("notice hi")
Puppet.override(:current_environment => Puppet::Node::Environment.create(:special, [])) do
expect(parser.dump()).to eq("(invoke notice hi)\n")
end
end
it "logs an error if the input cannot be parsed" do
output = parser.dump({ :e => '{ invalid =>' })
expect(output).to eq("")
expect(@logs[0].message).to eq("Syntax error at end of file")
expect(@logs[0].level).to eq(:err)
end
end
def from_an_interactive_terminal
STDIN.stubs(:tty?).returns(true)
end
def from_a_piped_input_of(contents)
STDIN.stubs(:tty?).returns(false)
STDIN.stubs(:read).returns(contents)
end
end
|