diff options
author | Kartik Null Cating-Subramanian <ksubramanian@chef.io> | 2015-06-16 19:04:40 -0400 |
---|---|---|
committer | Kartik Null Cating-Subramanian <ksubramanian@chef.io> | 2015-06-30 12:22:37 -0400 |
commit | f3250264d47455ab4031ff073fcc18596b872308 (patch) | |
tree | ebba4877a1b752076c7f4788e61b65f14d4a9d06 /spec/unit | |
parent | 27d8675ec1c80f1eb7ec57f7b6c854441bb395ee (diff) | |
download | chef-f3250264d47455ab4031ff073fcc18596b872308.tar.gz |
Use windows paths without case-sensitivity.ksubrama/path_space
Fixes #1684
Add tests for path manipulation in chef-fs.
Clean up the handling of paths in chef-fs.
Diffstat (limited to 'spec/unit')
-rw-r--r-- | spec/unit/chef_fs/path_util_spec.rb | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/spec/unit/chef_fs/path_util_spec.rb b/spec/unit/chef_fs/path_util_spec.rb new file mode 100644 index 0000000000..42eb126dfb --- /dev/null +++ b/spec/unit/chef_fs/path_util_spec.rb @@ -0,0 +1,108 @@ +# +# Author:: Kartik Null Cating-Subramanian (<ksubramanian@chef.io>) +# Copyright:: Copyright (c) 2015 Opscode, 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' +require 'chef/chef_fs/path_utils' + +describe Chef::ChefFS::PathUtils do + context 'invoking join' do + it 'joins well-behaved distinct path elements' do + expect(Chef::ChefFS::PathUtils.join('a', 'b', 'c')).to eq('a/b/c') + end + + it 'strips extraneous slashes in the middle of paths' do + expect(Chef::ChefFS::PathUtils.join('a/', '/b', '/c/')).to eq('a/b/c') + expect(Chef::ChefFS::PathUtils.join('a/', '/b', '///c/')).to eq('a/b/c') + end + + it 'preserves the whether the first element was absolute or not' do + expect(Chef::ChefFS::PathUtils.join('/a/', '/b', 'c/')).to eq('/a/b/c') + expect(Chef::ChefFS::PathUtils.join('///a/', '/b', 'c/')).to eq('/a/b/c') + end + end + + context 'invoking is_absolute?' do + it 'confirms that paths starting with / are absolute' do + expect(Chef::ChefFS::PathUtils.is_absolute?('/foo/bar/baz')).to be true + expect(Chef::ChefFS::PathUtils.is_absolute?('/foo')).to be true + end + + it 'confirms that paths starting with // are absolute even though that looks like some windows network path' do + expect(Chef::ChefFS::PathUtils.is_absolute?('//foo/bar/baz')).to be true + end + + it 'confirms that root is indeed absolute' do + expect(Chef::ChefFS::PathUtils.is_absolute?('/')).to be true + end + + it 'confirms that paths starting without / are relative' do + expect(Chef::ChefFS::PathUtils.is_absolute?('foo/bar/baz')).to be false + expect(Chef::ChefFS::PathUtils.is_absolute?('a')).to be false + end + + it 'returns false for an empty path.' do + expect(Chef::ChefFS::PathUtils.is_absolute?('')).to be false + end + end + + context 'invoking realest_path' do + let(:good_path) { File.dirname(__FILE__) } + let(:parent_path) { File.dirname(good_path) } + + it 'handles paths with no wildcards or globs' do + expect(Chef::ChefFS::PathUtils.realest_path(good_path)).to eq(File.expand_path(good_path)) + end + + it 'handles paths with .. and .' do + expect(Chef::ChefFS::PathUtils.realest_path(good_path+'/../.')).to eq(File.expand_path(parent_path)) + end + + it 'handles paths with *' do + expect(Chef::ChefFS::PathUtils.realest_path(good_path + '/*/foo')).to eq(File.expand_path(good_path + '/*/foo')) + end + + it 'handles directories that do not exist' do + expect(Chef::ChefFS::PathUtils.realest_path(good_path + '/something/or/other')).to eq(File.expand_path(good_path + '/something/or/other')) + end + + it 'handles root correctly' do + if Chef::Platform.windows? + expect(Chef::ChefFS::PathUtils.realest_path('C:/')).to eq('C:/') + else + expect(Chef::ChefFS::PathUtils.realest_path('/')).to eq('/') + end + end + end + + context 'invoking descendant_path' do + it 'handles paths with various casing on windows' do + allow(Chef::ChefFS).to receive(:windows?) { true } + expect(Chef::ChefFS::PathUtils.descendant_path('C:/ab/b/c', 'C:/AB/B')).to eq('c') + expect(Chef::ChefFS::PathUtils.descendant_path('C:/ab/b/c', 'c:/ab/B')).to eq('c') + end + + it 'returns nil if the path does not have the given ancestor' do + expect(Chef::ChefFS::PathUtils.descendant_path('/D/E/F', '/A/B/C')).to be_nil + expect(Chef::ChefFS::PathUtils.descendant_path('/A/B/D', '/A/B/C')).to be_nil + end + + it 'returns blank if the ancestor equals the path' do + expect(Chef::ChefFS::PathUtils.descendant_path('/A/B/D', '/A/B/D')).to eq('') + end + end +end |