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
|
require 'spec_helper'
require 'puppet_spec/files'
require 'puppet/file_system'
describe Puppet::FileSystem::PathPattern do
include PuppetSpec::Files
InvalidPattern = Puppet::FileSystem::PathPattern::InvalidPattern
describe 'relative' do
it "can not be created with a traversal up the directory tree" do
expect do
Puppet::FileSystem::PathPattern.relative("my/../other")
end.to raise_error(InvalidPattern, "PathPatterns cannot be created with directory traversals.")
end
it "can be created with a '..' prefixing a filename" do
expect(Puppet::FileSystem::PathPattern.relative("my/..other").to_s).to eq("my/..other")
end
it "can be created with a '..' suffixing a filename" do
expect(Puppet::FileSystem::PathPattern.relative("my/other..").to_s).to eq("my/other..")
end
it "can be created with a '..' embedded in a filename" do
expect(Puppet::FileSystem::PathPattern.relative("my/ot..her").to_s).to eq("my/ot..her")
end
it "can not be created with a \\0 byte embedded" do
expect do
Puppet::FileSystem::PathPattern.relative("my/\0/other")
end.to raise_error(InvalidPattern, "PathPatterns cannot be created with a zero byte.")
end
it "can not be created with a windows drive" do
expect do
Puppet::FileSystem::PathPattern.relative("c:\\relative\\path")
end.to raise_error(InvalidPattern, "A relative PathPattern cannot be prefixed with a drive.")
end
it "can not be created with a windows drive (with space)" do
expect do
Puppet::FileSystem::PathPattern.relative(" c:\\relative\\path")
end.to raise_error(InvalidPattern, "A relative PathPattern cannot be prefixed with a drive.")
end
it "can not create an absolute relative path" do
expect do
Puppet::FileSystem::PathPattern.relative("/no/absolutes")
end.to raise_error(InvalidPattern, "A relative PathPattern cannot be an absolute path.")
end
it "can not create an absolute relative path (with space)" do
expect do
Puppet::FileSystem::PathPattern.relative("\t/no/absolutes")
end.to raise_error(InvalidPattern, "A relative PathPattern cannot be an absolute path.")
end
it "can not create a relative path that is a windows path relative to the current drive" do
expect do
Puppet::FileSystem::PathPattern.relative("\\no\relatives")
end.to raise_error(InvalidPattern, "A PathPattern cannot be a Windows current drive relative path.")
end
it "creates a relative PathPattern from a valid relative path" do
expect(Puppet::FileSystem::PathPattern.relative("a/relative/path").to_s).to eq("a/relative/path")
end
it "is not absolute" do
expect(Puppet::FileSystem::PathPattern.relative("a/relative/path")).to_not be_absolute
end
end
describe 'absolute' do
it "can not create a relative absolute path" do
expect do
Puppet::FileSystem::PathPattern.absolute("no/relatives")
end.to raise_error(InvalidPattern, "An absolute PathPattern cannot be a relative path.")
end
it "can not create an absolute path that is a windows path relative to the current drive" do
expect do
Puppet::FileSystem::PathPattern.absolute("\\no\\relatives")
end.to raise_error(InvalidPattern, "A PathPattern cannot be a Windows current drive relative path.")
end
it "creates an absolute PathPattern from a valid absolute path" do
expect(Puppet::FileSystem::PathPattern.absolute("/an/absolute/path").to_s).to eq("/an/absolute/path")
end
it "creates an absolute PathPattern from a valid Windows absolute path" do
expect(Puppet::FileSystem::PathPattern.absolute("c:/absolute/windows/path").to_s).to eq("c:/absolute/windows/path")
end
it "can be created with a '..' embedded in a filename on windows", :if => Puppet.features.microsoft_windows? do
expect(Puppet::FileSystem::PathPattern.absolute(%q{c:\..my\ot..her\one..}).to_s).to eq(%q{c:\..my\ot..her\one..})
end
it "is absolute" do
expect(Puppet::FileSystem::PathPattern.absolute("c:/absolute/windows/path")).to be_absolute
end
end
it "prefixes the relative path pattern with another path" do
pattern = Puppet::FileSystem::PathPattern.relative("docs/*_thoughts.txt")
prefix = Puppet::FileSystem::PathPattern.absolute("/prefix")
absolute_pattern = pattern.prefix_with(prefix)
expect(absolute_pattern).to be_absolute
expect(absolute_pattern.to_s).to eq(File.join("/prefix", "docs/*_thoughts.txt"))
end
it "refuses to prefix with a relative pattern" do
pattern = Puppet::FileSystem::PathPattern.relative("docs/*_thoughts.txt")
prefix = Puppet::FileSystem::PathPattern.relative("prefix")
expect do
pattern.prefix_with(prefix)
end.to raise_error(InvalidPattern, "An absolute PathPattern cannot be a relative path.")
end
it "applies the pattern to the filesystem as a glob" do
dir = tmpdir('globtest')
create_file_in(dir, "found_one")
create_file_in(dir, "found_two")
create_file_in(dir, "third_not_found")
pattern = Puppet::FileSystem::PathPattern.relative("found_*").prefix_with(
Puppet::FileSystem::PathPattern.absolute(dir))
expect(pattern.glob).to match_array([File.join(dir, "found_one"),
File.join(dir, "found_two")])
end
def create_file_in(dir, name)
File.open(File.join(dir, name), "w") { |f| f.puts "data" }
end
end
|