microwave 1.0.4 → 11.400.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +2 -2
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/chef-solo +0 -2
- data/bin/shef +6 -5
- data/lib/chef.rb +2 -4
- data/spec/data/big_json.json +2 -1
- data/spec/data/big_json_plus_one.json +2 -1
- data/spec/data/cookbooks/chefignore +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
- data/spec/functional/knife/exec_spec.rb +4 -6
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +64 -3
- data/spec/functional/resource/cookbook_file_spec.rb +33 -2
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +12 -10
- data/spec/functional/resource/registry_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +28 -3
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +238 -0
- data/spec/functional/shell_spec.rb +101 -0
- data/spec/functional/tiny_server_spec.rb +5 -4
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- data/spec/spec_helper.rb +15 -3
- data/spec/stress/win32/security_spec.rb +5 -5
- data/spec/support/chef_helpers.rb +14 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/matchers/leak.rb +1 -1
- data/spec/support/platform_helpers.rb +18 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -23
- data/spec/support/shared/functional/file_resource.rb +198 -53
- data/spec/support/shared/functional/securable_resource.rb +140 -105
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/tiny_server.rb +29 -10
- data/spec/unit/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +156 -103
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +329 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +188 -16
- data/spec/unit/config_spec.rb +54 -4
- data/spec/unit/cookbook/chefignore_spec.rb +2 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
- data/spec/unit/json_compat_spec.rb +69 -0
- data/spec/unit/knife/bootstrap_spec.rb +81 -28
- data/spec/unit/knife/client_reregister_spec.rb +23 -22
- data/spec/unit/knife/configure_spec.rb +29 -26
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -7
- data/spec/unit/knife/data_bag_create_spec.rb +14 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +121 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -17
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +56 -491
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +272 -137
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +411 -339
- data/spec/unit/platform_spec.rb +8 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/deploy/revision_spec.rb +2 -8
- data/spec/unit/provider/deploy_spec.rb +6 -40
- data/spec/unit/provider/directory_spec.rb +103 -68
- data/spec/unit/provider/erl_call_spec.rb +0 -2
- data/spec/unit/provider/file_spec.rb +69 -59
- data/spec/unit/provider/git_spec.rb +0 -10
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/group/usermod_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/link_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rubygems_spec.rb +0 -18
- data/spec/unit/provider/package/yum_spec.rb +79 -15
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +24 -7
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +3 -6
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +4 -4
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
- data/spec/unit/provider/service/init_service_spec.rb +26 -3
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
- data/spec/unit/provider/service_spec.rb +2 -2
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +57 -31
- data/spec/unit/provider/user_spec.rb +7 -16
- data/spec/unit/provider_spec.rb +4 -3
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- data/spec/unit/resource/log_spec.rb +9 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +27 -4
- data/spec/unit/rest/auth_credentials_spec.rb +2 -14
- data/spec/unit/rest_spec.rb +122 -187
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- metadata +162 -157
- data/README.rdoc +0 -177
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/json_compat_spect.rb +0 -53
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
@@ -0,0 +1,237 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
require 'chef/chef_fs/file_system/chef_server_root_dir'
|
21
|
+
|
22
|
+
describe Chef::ChefFS::FileSystem::ChefServerRootDir do
|
23
|
+
shared_examples 'a json endpoint dir leaf' do
|
24
|
+
it 'parent is endpoint' do
|
25
|
+
endpoint_leaf.parent.should == endpoint
|
26
|
+
end
|
27
|
+
it 'name is correct' do
|
28
|
+
endpoint_leaf.name.should == "#{endpoint_leaf_name}.json"
|
29
|
+
end
|
30
|
+
it 'path is correct' do
|
31
|
+
endpoint_leaf.path.should == "/#{endpoint_name}/#{endpoint_leaf_name}.json"
|
32
|
+
end
|
33
|
+
it 'path_for_printing is correct' do
|
34
|
+
endpoint_leaf.path_for_printing.should == "remote/#{endpoint_name}/#{endpoint_leaf_name}.json"
|
35
|
+
end
|
36
|
+
it 'is not a directory' do
|
37
|
+
endpoint_leaf.dir?.should be_false
|
38
|
+
end
|
39
|
+
it 'exists' do
|
40
|
+
should_receive_children
|
41
|
+
endpoint_leaf.exists?.should be_true
|
42
|
+
end
|
43
|
+
it 'read returns content' do
|
44
|
+
@rest.should_receive(:get_rest).with("#{endpoint_name}/#{endpoint_leaf_name}").once.and_return(
|
45
|
+
{
|
46
|
+
'a' => 'b'
|
47
|
+
})
|
48
|
+
endpoint_leaf.read.should == '{
|
49
|
+
"a": "b"
|
50
|
+
}'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
shared_examples 'a json rest endpoint dir' do
|
55
|
+
it 'parent is root' do
|
56
|
+
endpoint.parent.should == root_dir
|
57
|
+
end
|
58
|
+
it 'has correct name' do
|
59
|
+
endpoint.name.should == endpoint_name
|
60
|
+
end
|
61
|
+
it 'has correct path' do
|
62
|
+
endpoint.path.should == "/#{endpoint_name}"
|
63
|
+
end
|
64
|
+
it 'has correct path_for_printing' do
|
65
|
+
endpoint.path_for_printing.should == "remote/#{endpoint_name}"
|
66
|
+
end
|
67
|
+
it 'is a directory' do
|
68
|
+
endpoint.dir?.should be_true
|
69
|
+
end
|
70
|
+
it 'exists' do
|
71
|
+
endpoint.exists?.should be_true
|
72
|
+
end
|
73
|
+
it 'can have json files as children' do
|
74
|
+
endpoint.can_have_child?('blah.json', false).should be_true
|
75
|
+
end
|
76
|
+
it 'cannot have non-json files as children' do
|
77
|
+
endpoint.can_have_child?('blah', false).should be_false
|
78
|
+
end
|
79
|
+
it 'cannot have directories as children' do
|
80
|
+
endpoint.can_have_child?('blah', true).should be_false
|
81
|
+
endpoint.can_have_child?('blah.json', true).should be_false
|
82
|
+
end
|
83
|
+
let(:should_receive_children) {
|
84
|
+
@rest.should_receive(:get_rest).with(endpoint_name).once.and_return(
|
85
|
+
{
|
86
|
+
"achild" => "http://opscode.com/achild",
|
87
|
+
"bchild" => "http://opscode.com/bchild"
|
88
|
+
})
|
89
|
+
}
|
90
|
+
it 'has correct children' do
|
91
|
+
should_receive_children
|
92
|
+
endpoint.children.map { |child| child.name }.should =~ %w(achild.json bchild.json)
|
93
|
+
end
|
94
|
+
context 'achild in endpoint.children' do
|
95
|
+
let(:endpoint_leaf_name) { 'achild' }
|
96
|
+
let(:endpoint_leaf) do
|
97
|
+
should_receive_children
|
98
|
+
endpoint.children.select { |child| child.name == 'achild.json' }.first
|
99
|
+
end
|
100
|
+
it_behaves_like 'a json endpoint dir leaf'
|
101
|
+
end
|
102
|
+
context 'endpoint.child(achild)' do
|
103
|
+
let(:endpoint_leaf_name) { 'achild' }
|
104
|
+
let(:endpoint_leaf) { endpoint.child('achild.json') }
|
105
|
+
it_behaves_like 'a json endpoint dir leaf'
|
106
|
+
end
|
107
|
+
context 'nonexistent child()' do
|
108
|
+
let(:nonexistent_child) { endpoint.child('blah.json') }
|
109
|
+
it 'has correct parent, name, path and path_for_printing' do
|
110
|
+
nonexistent_child.parent.should == endpoint
|
111
|
+
nonexistent_child.name.should == "blah.json"
|
112
|
+
nonexistent_child.path.should == "#{endpoint.path}/blah.json"
|
113
|
+
nonexistent_child.path_for_printing.should == "#{endpoint.path_for_printing}/blah.json"
|
114
|
+
end
|
115
|
+
it 'does not exist' do
|
116
|
+
should_receive_children
|
117
|
+
nonexistent_child.exists?.should be_false
|
118
|
+
end
|
119
|
+
it 'is not a directory' do
|
120
|
+
nonexistent_child.dir?.should be_false
|
121
|
+
end
|
122
|
+
it 'read returns NotFoundError' do
|
123
|
+
@rest.should_receive(:get_rest).with("#{endpoint_name}/blah").once.and_raise(Net::HTTPServerException.new(nil,Net::HTTPResponse.new(nil,'404',nil)))
|
124
|
+
expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
let(:root_dir) {
|
130
|
+
Chef::ChefFS::FileSystem::ChefServerRootDir.new('remote',
|
131
|
+
{
|
132
|
+
:chef_server_url => 'url',
|
133
|
+
:node_name => 'username',
|
134
|
+
:client_key => 'key'
|
135
|
+
}, 'everything')
|
136
|
+
}
|
137
|
+
before(:each) do
|
138
|
+
@rest = double("rest")
|
139
|
+
Chef::REST.stub(:new).with('url','username','key') { @rest }
|
140
|
+
end
|
141
|
+
context 'the root directory' do
|
142
|
+
it 'has no parent' do
|
143
|
+
root_dir.parent.should == nil
|
144
|
+
end
|
145
|
+
it 'is a directory' do
|
146
|
+
root_dir.dir?.should be_true
|
147
|
+
end
|
148
|
+
it 'exists' do
|
149
|
+
root_dir.exists?.should be_true
|
150
|
+
end
|
151
|
+
it 'has name ""' do
|
152
|
+
root_dir.name.should == ""
|
153
|
+
end
|
154
|
+
it 'has path /' do
|
155
|
+
root_dir.path.should == '/'
|
156
|
+
end
|
157
|
+
it 'has path_for_printing remote/' do
|
158
|
+
root_dir.path_for_printing.should == 'remote/'
|
159
|
+
end
|
160
|
+
it 'has correct children' do
|
161
|
+
root_dir.children.map { |child| child.name }.should =~ %w(clients cookbooks data_bags environments nodes roles users)
|
162
|
+
end
|
163
|
+
it 'can have children with the known names' do
|
164
|
+
%w(clients cookbooks data_bags environments nodes roles users).each { |child| root_dir.can_have_child?(child, true).should be_true }
|
165
|
+
end
|
166
|
+
it 'cannot have files as children' do
|
167
|
+
%w(clients cookbooks data_bags environments nodes roles users).each { |child| root_dir.can_have_child?(child, false).should be_false }
|
168
|
+
root_dir.can_have_child?('blah', false).should be_false
|
169
|
+
end
|
170
|
+
it 'cannot have other child directories than the known names' do
|
171
|
+
root_dir.can_have_child?('blah', true).should be_false
|
172
|
+
end
|
173
|
+
it 'child() responds to children' do
|
174
|
+
%w(clients cookbooks data_bags environments nodes roles users).each { |child| root_dir.child(child).exists?.should be_true }
|
175
|
+
end
|
176
|
+
context 'nonexistent child()' do
|
177
|
+
let(:nonexistent_child) { root_dir.child('blah') }
|
178
|
+
it 'has correct parent, name, path and path_for_printing' do
|
179
|
+
nonexistent_child.parent.should == root_dir
|
180
|
+
nonexistent_child.name.should == "blah"
|
181
|
+
nonexistent_child.path.should == "/blah"
|
182
|
+
nonexistent_child.path_for_printing.should == "remote/blah"
|
183
|
+
end
|
184
|
+
it 'does not exist' do
|
185
|
+
nonexistent_child.exists?.should be_false
|
186
|
+
end
|
187
|
+
it 'is not a directory' do
|
188
|
+
nonexistent_child.dir?.should be_false
|
189
|
+
end
|
190
|
+
it 'read returns NotFoundError' do
|
191
|
+
expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context 'clients in children' do
|
197
|
+
let(:endpoint_name) { 'clients' }
|
198
|
+
let(:endpoint) { root_dir.children.select { |child| child.name == 'clients' }.first }
|
199
|
+
|
200
|
+
it_behaves_like 'a json rest endpoint dir'
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'root.child(clients)' do
|
204
|
+
let(:endpoint_name) { 'clients' }
|
205
|
+
let(:endpoint) { root_dir.child('clients') }
|
206
|
+
|
207
|
+
it_behaves_like 'a json rest endpoint dir'
|
208
|
+
end
|
209
|
+
|
210
|
+
context 'root.child(environments)' do
|
211
|
+
let(:endpoint_name) { 'environments' }
|
212
|
+
let(:endpoint) { root_dir.child('environments') }
|
213
|
+
|
214
|
+
it_behaves_like 'a json rest endpoint dir'
|
215
|
+
end
|
216
|
+
|
217
|
+
context 'root.child(nodes)' do
|
218
|
+
let(:endpoint_name) { 'nodes' }
|
219
|
+
let(:endpoint) { root_dir.child('nodes') }
|
220
|
+
|
221
|
+
it_behaves_like 'a json rest endpoint dir'
|
222
|
+
end
|
223
|
+
|
224
|
+
context 'root.child(roles)' do
|
225
|
+
let(:endpoint_name) { 'roles' }
|
226
|
+
let(:endpoint) { root_dir.child('roles') }
|
227
|
+
|
228
|
+
it_behaves_like 'a json rest endpoint dir'
|
229
|
+
end
|
230
|
+
|
231
|
+
context 'root.child(users)' do
|
232
|
+
let(:endpoint_name) { 'users' }
|
233
|
+
let(:endpoint) { root_dir.child('users') }
|
234
|
+
|
235
|
+
it_behaves_like 'a json rest endpoint dir'
|
236
|
+
end
|
237
|
+
end
|
@@ -0,0 +1,568 @@
|
|
1
|
+
#
|
2
|
+
# Author:: John Keiser (<jkeiser@opscode.com>)
|
3
|
+
# Copyright:: Copyright (c) 2012 Opscode, Inc.
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'spec_helper'
|
20
|
+
require 'chef/chef_fs/file_system/chef_server_root_dir'
|
21
|
+
require 'chef/chef_fs/file_system'
|
22
|
+
|
23
|
+
describe Chef::ChefFS::FileSystem::CookbooksDir do
|
24
|
+
let(:root_dir) {
|
25
|
+
Chef::ChefFS::FileSystem::ChefServerRootDir.new('remote',
|
26
|
+
{
|
27
|
+
:chef_server_url => 'url',
|
28
|
+
:node_name => 'username',
|
29
|
+
:client_key => 'key'
|
30
|
+
},
|
31
|
+
'everything')
|
32
|
+
}
|
33
|
+
let(:cookbooks_dir) { root_dir.child('cookbooks') }
|
34
|
+
let(:should_list_cookbooks) do
|
35
|
+
@rest.should_receive(:get_rest).with('cookbooks').once.and_return(
|
36
|
+
{
|
37
|
+
"achild" => "http://opscode.com/achild",
|
38
|
+
"bchild" => "http://opscode.com/bchild"
|
39
|
+
})
|
40
|
+
end
|
41
|
+
before(:each) do
|
42
|
+
@rest = double("rest")
|
43
|
+
Chef::REST.stub(:new).with('url','username','key') { @rest }
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'has / as parent' do
|
47
|
+
cookbooks_dir.parent.should == root_dir
|
48
|
+
end
|
49
|
+
it 'is a directory' do
|
50
|
+
cookbooks_dir.dir?.should be_true
|
51
|
+
end
|
52
|
+
it 'exists' do
|
53
|
+
cookbooks_dir.exists?.should be_true
|
54
|
+
end
|
55
|
+
it 'has name cookbooks' do
|
56
|
+
cookbooks_dir.name.should == 'cookbooks'
|
57
|
+
end
|
58
|
+
it 'has path /cookbooks' do
|
59
|
+
cookbooks_dir.path.should == '/cookbooks'
|
60
|
+
end
|
61
|
+
it 'has path_for_printing remote/cookbooks' do
|
62
|
+
cookbooks_dir.path_for_printing.should == 'remote/cookbooks'
|
63
|
+
end
|
64
|
+
it 'has correct children' do
|
65
|
+
should_list_cookbooks
|
66
|
+
cookbooks_dir.children.map { |child| child.name }.should =~ %w(achild bchild)
|
67
|
+
end
|
68
|
+
it 'can have directories as children' do
|
69
|
+
cookbooks_dir.can_have_child?('blah', true).should be_true
|
70
|
+
end
|
71
|
+
it 'cannot have files as children' do
|
72
|
+
cookbooks_dir.can_have_child?('blah', false).should be_false
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# Cookbook dir (/cookbooks/<blah>)
|
77
|
+
#
|
78
|
+
shared_examples_for 'a segment directory' do
|
79
|
+
it 'has cookbook as parent' do
|
80
|
+
segment_dir.parent.should == cookbook_dir
|
81
|
+
end
|
82
|
+
it 'exists' do
|
83
|
+
segment_dir.exists?.should be_true
|
84
|
+
end
|
85
|
+
it 'is a directory' do
|
86
|
+
segment_dir.dir?.should be_true
|
87
|
+
end
|
88
|
+
it 'name is correct' do
|
89
|
+
segment_dir.name.should == segment_dir_name
|
90
|
+
end
|
91
|
+
it 'path is correct' do
|
92
|
+
segment_dir.path.should == "/cookbooks/#{cookbook_dir_name}/#{segment_dir_name}"
|
93
|
+
end
|
94
|
+
it 'path_for_printing is correct' do
|
95
|
+
segment_dir.path_for_printing.should == "remote/cookbooks/#{cookbook_dir_name}/#{segment_dir_name}"
|
96
|
+
end
|
97
|
+
it 'has the right children' do
|
98
|
+
segment_dir.children =~ %w(a.rb b.txt subdir)
|
99
|
+
end
|
100
|
+
it 'children are identical to child()' do
|
101
|
+
segment_dir.child('a.rb').should == segment_dir.children.select { |child| child.name == 'a.rb' }.first
|
102
|
+
segment_dir.child('b.txt').should == segment_dir.children.select { |child| child.name == 'b.txt' }.first
|
103
|
+
segment_dir.child('subdir').should == segment_dir.children.select { |child| child.name == 'subdir' }.first
|
104
|
+
end
|
105
|
+
context 'subdirectory' do
|
106
|
+
it 'has segment as a parent' do
|
107
|
+
segment_dir.child('subdir').parent.should == segment_dir
|
108
|
+
end
|
109
|
+
it 'exists' do
|
110
|
+
segment_dir.child('subdir').exists?.should be_true
|
111
|
+
end
|
112
|
+
it 'is a directory' do
|
113
|
+
segment_dir.child('subdir').dir?.should be_true
|
114
|
+
end
|
115
|
+
it 'name is subdir' do
|
116
|
+
segment_dir.child('subdir').name.should == 'subdir'
|
117
|
+
end
|
118
|
+
it 'path is correct' do
|
119
|
+
segment_dir.child('subdir').path.should == "/cookbooks/#{cookbook_dir_name}/#{segment_dir_name}/subdir"
|
120
|
+
end
|
121
|
+
it 'path_for_printing is correct' do
|
122
|
+
segment_dir.child('subdir').path_for_printing.should == "remote/cookbooks/#{cookbook_dir_name}/#{segment_dir_name}/subdir"
|
123
|
+
end
|
124
|
+
it 'has the right children' do
|
125
|
+
segment_dir.child('subdir').children =~ %w(a.rb b.txt)
|
126
|
+
end
|
127
|
+
it 'children are identical to child()' do
|
128
|
+
segment_dir.child('subdir').child('a.rb').should == segment_dir.child('subdir').children.select { |child| child.name == 'a.rb' }.first
|
129
|
+
segment_dir.child('subdir').child('b.txt').should == segment_dir.child('subdir').children.select { |child| child.name == 'b.txt' }.first
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
shared_examples_for 'a cookbook' do
|
135
|
+
it 'has cookbooks as parent' do
|
136
|
+
cookbook_dir.parent == cookbooks_dir
|
137
|
+
end
|
138
|
+
it 'is a directory' do
|
139
|
+
should_list_cookbooks
|
140
|
+
cookbook_dir.dir?.should be_true
|
141
|
+
end
|
142
|
+
it 'exists' do
|
143
|
+
should_list_cookbooks
|
144
|
+
cookbook_dir.exists?.should be_true
|
145
|
+
end
|
146
|
+
it 'has name <cookbook name>' do
|
147
|
+
cookbook_dir.name.should == cookbook_dir_name
|
148
|
+
end
|
149
|
+
it 'has path /cookbooks/<cookbook name>' do
|
150
|
+
cookbook_dir.path.should == "/cookbooks/#{cookbook_dir_name}"
|
151
|
+
end
|
152
|
+
it 'has path_for_printing remote/cookbooks/<cookbook name>' do
|
153
|
+
cookbook_dir.path_for_printing.should == "remote/cookbooks/#{cookbook_dir_name}"
|
154
|
+
end
|
155
|
+
it 'can have segment directories as children' do
|
156
|
+
cookbook_dir.can_have_child?('attributes', true).should be_true
|
157
|
+
cookbook_dir.can_have_child?('definitions', true).should be_true
|
158
|
+
cookbook_dir.can_have_child?('recipes', true).should be_true
|
159
|
+
cookbook_dir.can_have_child?('libraries', true).should be_true
|
160
|
+
cookbook_dir.can_have_child?('templates', true).should be_true
|
161
|
+
cookbook_dir.can_have_child?('files', true).should be_true
|
162
|
+
cookbook_dir.can_have_child?('resources', true).should be_true
|
163
|
+
cookbook_dir.can_have_child?('providers', true).should be_true
|
164
|
+
end
|
165
|
+
it 'cannot have arbitrary directories as children' do
|
166
|
+
cookbook_dir.can_have_child?('blah', true).should be_false
|
167
|
+
cookbook_dir.can_have_child?('root_files', true).should be_false
|
168
|
+
end
|
169
|
+
it 'can have files as children' do
|
170
|
+
cookbook_dir.can_have_child?('blah', false).should be_true
|
171
|
+
cookbook_dir.can_have_child?('root_files', false).should be_true
|
172
|
+
cookbook_dir.can_have_child?('attributes', false).should be_true
|
173
|
+
cookbook_dir.can_have_child?('definitions', false).should be_true
|
174
|
+
cookbook_dir.can_have_child?('recipes', false).should be_true
|
175
|
+
cookbook_dir.can_have_child?('libraries', false).should be_true
|
176
|
+
cookbook_dir.can_have_child?('templates', false).should be_true
|
177
|
+
cookbook_dir.can_have_child?('files', false).should be_true
|
178
|
+
cookbook_dir.can_have_child?('resources', false).should be_true
|
179
|
+
cookbook_dir.can_have_child?('providers', false).should be_true
|
180
|
+
end
|
181
|
+
# TODO test empty parts, cross-contamination (root_files named templates/x.txt, libraries named recipes/blah.txt)
|
182
|
+
context 'with a full directory structure' do
|
183
|
+
def json_file(path, checksum)
|
184
|
+
filename = Chef::ChefFS::PathUtils.split(path)[-1]
|
185
|
+
{
|
186
|
+
:name => filename,
|
187
|
+
:url => "cookbook_file:#{path}",
|
188
|
+
:checksum => checksum,
|
189
|
+
:path => path,
|
190
|
+
:specificity => "default"
|
191
|
+
}
|
192
|
+
end
|
193
|
+
def json_files(cookbook_dir)
|
194
|
+
result = []
|
195
|
+
files.each do |filename|
|
196
|
+
if filename =~ /^#{cookbook_dir}\//
|
197
|
+
result << json_file(filename, file_checksums[filename])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
result
|
201
|
+
end
|
202
|
+
let(:files) {
|
203
|
+
result = []
|
204
|
+
%w(attributes definitions files libraries providers recipes resources templates).each do |segment|
|
205
|
+
result << "#{segment}/a.rb"
|
206
|
+
result << "#{segment}/b.txt"
|
207
|
+
result << "#{segment}/subdir/a.rb"
|
208
|
+
result << "#{segment}/subdir/b.txt"
|
209
|
+
end
|
210
|
+
result << 'a.rb'
|
211
|
+
result << 'b.txt'
|
212
|
+
result << 'subdir/a.rb'
|
213
|
+
result << 'subdir/b.txt'
|
214
|
+
result << 'root_files'
|
215
|
+
result
|
216
|
+
}
|
217
|
+
let(:file_checksums) {
|
218
|
+
result = {}
|
219
|
+
files.each_with_index do |file, i|
|
220
|
+
result[file] = i.to_s(16)
|
221
|
+
end
|
222
|
+
result
|
223
|
+
}
|
224
|
+
let(:should_get_cookbook) do
|
225
|
+
cookbook = double('cookbook')
|
226
|
+
cookbook.should_receive(:manifest).and_return({
|
227
|
+
:attributes => json_files('attributes'),
|
228
|
+
:definitions => json_files('definitions'),
|
229
|
+
:files => json_files('files'),
|
230
|
+
:libraries => json_files('libraries'),
|
231
|
+
:providers => json_files('providers'),
|
232
|
+
:recipes => json_files('recipes'),
|
233
|
+
:resources => json_files('resources'),
|
234
|
+
:templates => json_files('templates'),
|
235
|
+
:root_files => [
|
236
|
+
json_file('a.rb', file_checksums['a.rb']),
|
237
|
+
json_file('b.txt', file_checksums['b.txt']),
|
238
|
+
json_file('subdir/a.rb', file_checksums['subdir/a.rb']),
|
239
|
+
json_file('subdir/b.txt', file_checksums['subdir/b.txt']),
|
240
|
+
json_file('root_files', file_checksums['root_files'])
|
241
|
+
]
|
242
|
+
})
|
243
|
+
@rest.should_receive(:get_rest).with("cookbooks/#{cookbook_dir_name}/_latest").once.and_return(cookbook)
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'has correct children' do
|
247
|
+
should_get_cookbook
|
248
|
+
cookbook_dir.children.map { |child| child.name }.should =~ %w(attributes definitions files libraries providers recipes resources templates a.rb b.txt subdir root_files)
|
249
|
+
end
|
250
|
+
it 'children and child() yield the exact same objects' do
|
251
|
+
should_get_cookbook
|
252
|
+
cookbook_dir.children.each { |child| child.should == cookbook_dir.child(child.name) }
|
253
|
+
end
|
254
|
+
it 'all files exist (recursive) and have correct parent, path, path_for_printing, checksum and type' do
|
255
|
+
should_get_cookbook
|
256
|
+
file_checksums.each do |path, checksum|
|
257
|
+
file = Chef::ChefFS::FileSystem.resolve_path(cookbook_dir, path)
|
258
|
+
file_parts = path.split('/')
|
259
|
+
if file_parts.length == 3
|
260
|
+
file.parent.parent.parent.should == cookbook_dir
|
261
|
+
elsif file_parts.length == 2
|
262
|
+
file.parent.parent.should == cookbook_dir
|
263
|
+
else
|
264
|
+
file.parent.should == cookbook_dir
|
265
|
+
end
|
266
|
+
file.exists?.should be_true
|
267
|
+
file.dir?.should be_false
|
268
|
+
file.name.should == file_parts[-1]
|
269
|
+
file.path.should == "/cookbooks/#{cookbook_dir_name}/#{path}"
|
270
|
+
file.path_for_printing.should == "remote/cookbooks/#{cookbook_dir_name}/#{path}"
|
271
|
+
file.checksum.should == checksum
|
272
|
+
end
|
273
|
+
end
|
274
|
+
it 'all files can be read' do
|
275
|
+
should_get_cookbook
|
276
|
+
files.each do |path|
|
277
|
+
@rest.should_receive(:get_rest).with("cookbook_file:#{path}").once.and_return("This is #{path}'s content")
|
278
|
+
@rest.should_receive(:sign_on_redirect).with(no_args()).once.and_return(true)
|
279
|
+
@rest.should_receive(:sign_on_redirect=).with(false).once
|
280
|
+
@rest.should_receive(:sign_on_redirect=).with(true).once
|
281
|
+
file = Chef::ChefFS::FileSystem.resolve_path(cookbook_dir, path)
|
282
|
+
file.read.should == "This is #{path}'s content"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
context 'the attributes segment' do
|
287
|
+
let(:segment_dir) { cookbook_dir.child('attributes') }
|
288
|
+
let(:segment_dir_name) { 'attributes' }
|
289
|
+
it_behaves_like 'a segment directory'
|
290
|
+
|
291
|
+
before(:each) do
|
292
|
+
should_get_cookbook
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'can have ruby files' do
|
296
|
+
should_get_cookbook
|
297
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
298
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
299
|
+
end
|
300
|
+
it 'cannot have non-ruby files' do
|
301
|
+
should_get_cookbook
|
302
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
303
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
304
|
+
end
|
305
|
+
it 'cannot have subdirectories' do
|
306
|
+
should_get_cookbook
|
307
|
+
segment_dir.can_have_child?('blah', true).should be_false
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
context 'the definitions segment' do
|
312
|
+
let(:segment_dir) { cookbook_dir.child('definitions') }
|
313
|
+
let(:segment_dir_name) { 'definitions' }
|
314
|
+
it_behaves_like 'a segment directory'
|
315
|
+
|
316
|
+
before(:each) do
|
317
|
+
should_get_cookbook
|
318
|
+
end
|
319
|
+
|
320
|
+
it 'can have ruby files' do
|
321
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
322
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
323
|
+
end
|
324
|
+
it 'cannot have non-ruby files' do
|
325
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
326
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
327
|
+
end
|
328
|
+
it 'cannot have subdirectories' do
|
329
|
+
segment_dir.can_have_child?('blah', true).should be_false
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
context 'the files segment' do
|
334
|
+
let(:segment_dir) { cookbook_dir.child('files') }
|
335
|
+
let(:segment_dir_name) { 'files' }
|
336
|
+
it_behaves_like 'a segment directory'
|
337
|
+
|
338
|
+
before(:each) do
|
339
|
+
should_get_cookbook
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'can have ruby files' do
|
343
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
344
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
345
|
+
end
|
346
|
+
it 'can have non-ruby files' do
|
347
|
+
segment_dir.can_have_child?('blah.txt', false).should be_true
|
348
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_true
|
349
|
+
end
|
350
|
+
it 'can have subdirectories' do
|
351
|
+
segment_dir.can_have_child?('blah', true).should be_true
|
352
|
+
end
|
353
|
+
it 'subdirectories can have ruby files' do
|
354
|
+
segment_dir.child('subdir').can_have_child?('blah.rb', false).should be_true
|
355
|
+
segment_dir.child('subdir').can_have_child?('.blah.rb', false).should be_true
|
356
|
+
end
|
357
|
+
it 'subdirectories can have non-ruby files' do
|
358
|
+
segment_dir.child('subdir').can_have_child?('blah.txt', false).should be_true
|
359
|
+
segment_dir.child('subdir').can_have_child?('.blah.txt', false).should be_true
|
360
|
+
end
|
361
|
+
it 'subdirectories can have subdirectories' do
|
362
|
+
segment_dir.child('subdir').can_have_child?('blah', true).should be_true
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
context 'the libraries segment' do
|
367
|
+
let(:segment_dir) { cookbook_dir.child('libraries') }
|
368
|
+
let(:segment_dir_name) { 'libraries' }
|
369
|
+
it_behaves_like 'a segment directory'
|
370
|
+
|
371
|
+
before(:each) do
|
372
|
+
should_get_cookbook
|
373
|
+
end
|
374
|
+
|
375
|
+
it 'can have ruby files' do
|
376
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
377
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
378
|
+
end
|
379
|
+
it 'cannot have non-ruby files' do
|
380
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
381
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
382
|
+
end
|
383
|
+
it 'cannot have subdirectories' do
|
384
|
+
segment_dir.can_have_child?('blah', true).should be_false
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
context 'the providers segment' do
|
389
|
+
let(:segment_dir) { cookbook_dir.child('providers') }
|
390
|
+
let(:segment_dir_name) { 'providers' }
|
391
|
+
it_behaves_like 'a segment directory'
|
392
|
+
|
393
|
+
before(:each) do
|
394
|
+
should_get_cookbook
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'can have ruby files' do
|
398
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
399
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
400
|
+
end
|
401
|
+
it 'cannot have non-ruby files' do
|
402
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
403
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
404
|
+
end
|
405
|
+
it 'can have subdirectories' do
|
406
|
+
segment_dir.can_have_child?('blah', true).should be_true
|
407
|
+
end
|
408
|
+
it 'subdirectories can have ruby files' do
|
409
|
+
segment_dir.child('subdir').can_have_child?('blah.rb', false).should be_true
|
410
|
+
segment_dir.child('subdir').can_have_child?('.blah.rb', false).should be_true
|
411
|
+
end
|
412
|
+
it 'subdirectories cannot have non-ruby files' do
|
413
|
+
segment_dir.child('subdir').can_have_child?('blah.txt', false).should be_false
|
414
|
+
segment_dir.child('subdir').can_have_child?('.blah.txt', false).should be_false
|
415
|
+
end
|
416
|
+
it 'subdirectories can have subdirectories' do
|
417
|
+
segment_dir.child('subdir').can_have_child?('blah', true).should be_true
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
context 'the recipes segment' do
|
422
|
+
let(:segment_dir) { cookbook_dir.child('recipes') }
|
423
|
+
let(:segment_dir_name) { 'recipes' }
|
424
|
+
it_behaves_like 'a segment directory'
|
425
|
+
|
426
|
+
before(:each) do
|
427
|
+
should_get_cookbook
|
428
|
+
end
|
429
|
+
|
430
|
+
it 'can have ruby files' do
|
431
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
432
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
433
|
+
end
|
434
|
+
it 'cannot have non-ruby files' do
|
435
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
436
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
437
|
+
end
|
438
|
+
it 'cannot have subdirectories' do
|
439
|
+
segment_dir.can_have_child?('blah', true).should be_false
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
context 'the resources segment' do
|
444
|
+
let(:segment_dir) { cookbook_dir.child('resources') }
|
445
|
+
let(:segment_dir_name) { 'resources' }
|
446
|
+
it_behaves_like 'a segment directory'
|
447
|
+
|
448
|
+
before(:each) do
|
449
|
+
should_get_cookbook
|
450
|
+
end
|
451
|
+
|
452
|
+
it 'can have ruby files' do
|
453
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
454
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
455
|
+
end
|
456
|
+
it 'cannot have non-ruby files' do
|
457
|
+
segment_dir.can_have_child?('blah.txt', false).should be_false
|
458
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_false
|
459
|
+
end
|
460
|
+
it 'can have subdirectories' do
|
461
|
+
segment_dir.can_have_child?('blah', true).should be_true
|
462
|
+
end
|
463
|
+
it 'subdirectories can have ruby files' do
|
464
|
+
segment_dir.child('subdir').can_have_child?('blah.rb', false).should be_true
|
465
|
+
segment_dir.child('subdir').can_have_child?('.blah.rb', false).should be_true
|
466
|
+
end
|
467
|
+
it 'subdirectories cannot have non-ruby files' do
|
468
|
+
segment_dir.child('subdir').can_have_child?('blah.txt', false).should be_false
|
469
|
+
segment_dir.child('subdir').can_have_child?('.blah.txt', false).should be_false
|
470
|
+
end
|
471
|
+
it 'subdirectories can have subdirectories' do
|
472
|
+
segment_dir.child('subdir').can_have_child?('blah', true).should be_true
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
context 'the templates segment' do
|
477
|
+
let(:segment_dir) { cookbook_dir.child('templates') }
|
478
|
+
let(:segment_dir_name) { 'templates' }
|
479
|
+
it_behaves_like 'a segment directory'
|
480
|
+
|
481
|
+
before(:each) do
|
482
|
+
should_get_cookbook
|
483
|
+
end
|
484
|
+
|
485
|
+
it 'can have ruby files' do
|
486
|
+
segment_dir.can_have_child?('blah.rb', false).should be_true
|
487
|
+
segment_dir.can_have_child?('.blah.rb', false).should be_true
|
488
|
+
end
|
489
|
+
it 'can have non-ruby files' do
|
490
|
+
segment_dir.can_have_child?('blah.txt', false).should be_true
|
491
|
+
segment_dir.can_have_child?('.blah.txt', false).should be_true
|
492
|
+
end
|
493
|
+
it 'can have subdirectories' do
|
494
|
+
segment_dir.can_have_child?('blah', true).should be_true
|
495
|
+
end
|
496
|
+
it 'subdirectories can have ruby files' do
|
497
|
+
segment_dir.child('subdir').can_have_child?('blah.rb', false).should be_true
|
498
|
+
segment_dir.child('subdir').can_have_child?('.blah.rb', false).should be_true
|
499
|
+
end
|
500
|
+
it 'subdirectories can have non-ruby files' do
|
501
|
+
segment_dir.child('subdir').can_have_child?('blah.txt', false).should be_true
|
502
|
+
segment_dir.child('subdir').can_have_child?('.blah.txt', false).should be_true
|
503
|
+
end
|
504
|
+
it 'subdirectories can have subdirectories' do
|
505
|
+
segment_dir.child('subdir').can_have_child?('blah', true).should be_true
|
506
|
+
end
|
507
|
+
end
|
508
|
+
|
509
|
+
context 'root subdirectories' do
|
510
|
+
let(:root_subdir) { cookbook_dir.child('subdir') }
|
511
|
+
|
512
|
+
before(:each) do
|
513
|
+
should_get_cookbook
|
514
|
+
end
|
515
|
+
|
516
|
+
# Really, since these shouldn't exist in the first place,
|
517
|
+
# it doesn't matter; but these REALLY shouldn't be able to
|
518
|
+
# have any files in them at all.
|
519
|
+
it 'can have ruby files' do
|
520
|
+
root_subdir.can_have_child?('blah.rb', false).should be_true
|
521
|
+
root_subdir.can_have_child?('.blah.rb', false).should be_true
|
522
|
+
end
|
523
|
+
it 'can have non-ruby files' do
|
524
|
+
root_subdir.can_have_child?('blah.txt', false).should be_true
|
525
|
+
root_subdir.can_have_child?('.blah.txt', false).should be_true
|
526
|
+
end
|
527
|
+
it 'cannot have subdirectories' do
|
528
|
+
root_subdir.can_have_child?('blah', true).should be_false
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
context 'achild from cookbooks_dir.children' do
|
535
|
+
let(:cookbook_dir_name) { 'achild' }
|
536
|
+
let(:cookbook_dir) do
|
537
|
+
should_list_cookbooks
|
538
|
+
cookbooks_dir.children.select { |child| child.name == 'achild' }.first
|
539
|
+
end
|
540
|
+
it_behaves_like 'a cookbook'
|
541
|
+
end
|
542
|
+
context 'cookbooks_dir.child(achild)' do
|
543
|
+
let(:cookbook_dir_name) { 'achild' }
|
544
|
+
let(:cookbook_dir) { cookbooks_dir.child('achild') }
|
545
|
+
it_behaves_like 'a cookbook'
|
546
|
+
end
|
547
|
+
context 'nonexistent cookbooks_dir.child()' do
|
548
|
+
let(:nonexistent_child) { cookbooks_dir.child('blah') }
|
549
|
+
it 'has correct parent, name, path and path_for_printing' do
|
550
|
+
nonexistent_child.parent.should == cookbooks_dir
|
551
|
+
nonexistent_child.name.should == "blah"
|
552
|
+
nonexistent_child.path.should == "/cookbooks/blah"
|
553
|
+
nonexistent_child.path_for_printing.should == "remote/cookbooks/blah"
|
554
|
+
end
|
555
|
+
it 'does not exist' do
|
556
|
+
should_list_cookbooks
|
557
|
+
nonexistent_child.exists?.should be_false
|
558
|
+
end
|
559
|
+
it 'is a directory' do
|
560
|
+
should_list_cookbooks
|
561
|
+
nonexistent_child.dir?.should be_false
|
562
|
+
end
|
563
|
+
it 'read returns NotFoundError' do
|
564
|
+
expect { nonexistent_child.read }.to raise_error(Chef::ChefFS::FileSystem::NotFoundError)
|
565
|
+
end
|
566
|
+
end
|
567
|
+
|
568
|
+
end
|