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.
Files changed (249) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +2 -2
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/chef-solo +0 -2
  7. data/bin/shef +6 -5
  8. data/lib/chef.rb +2 -4
  9. data/spec/data/big_json.json +2 -1
  10. data/spec/data/big_json_plus_one.json +2 -1
  11. data/spec/data/cookbooks/chefignore +2 -0
  12. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  13. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  14. data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
  15. data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
  16. data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
  17. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  18. data/spec/data/nodes/default.rb +3 -3
  19. data/spec/data/nodes/test.example.com.rb +3 -3
  20. data/spec/data/nodes/test.rb +3 -3
  21. data/spec/data/partial_one.erb +1 -0
  22. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  23. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  24. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  25. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  26. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  27. data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
  28. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  29. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  30. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  31. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  32. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  33. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  34. data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
  35. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  36. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  37. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  38. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  39. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  40. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  41. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  42. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  43. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  44. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  45. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  46. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  47. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  48. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  49. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  50. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  51. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  52. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  53. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  54. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  55. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  56. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  57. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  58. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  59. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  60. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  61. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  62. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  63. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  64. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  65. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  66. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  67. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  68. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  69. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  70. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  71. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  72. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  73. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  74. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  75. data/spec/data/shef-config.rb +10 -0
  76. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  77. data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
  78. data/spec/functional/knife/exec_spec.rb +4 -6
  79. data/spec/functional/knife/smoke_test.rb +34 -0
  80. data/spec/functional/knife/ssh_spec.rb +64 -3
  81. data/spec/functional/resource/cookbook_file_spec.rb +33 -2
  82. data/spec/functional/resource/deploy_revision_spec.rb +515 -0
  83. data/spec/functional/resource/directory_spec.rb +4 -0
  84. data/spec/functional/resource/file_spec.rb +56 -22
  85. data/spec/functional/resource/link_spec.rb +12 -10
  86. data/spec/functional/resource/registry_spec.rb +572 -0
  87. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  88. data/spec/functional/resource/remote_file_spec.rb +28 -3
  89. data/spec/functional/resource/template_spec.rb +23 -2
  90. data/spec/functional/run_lock_spec.rb +238 -0
  91. data/spec/functional/shell_spec.rb +101 -0
  92. data/spec/functional/tiny_server_spec.rb +5 -4
  93. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  94. data/spec/functional/win32/security_spec.rb +37 -0
  95. data/spec/spec_helper.rb +15 -3
  96. data/spec/stress/win32/security_spec.rb +5 -5
  97. data/spec/support/chef_helpers.rb +14 -3
  98. data/spec/support/lib/chef/resource/cat.rb +3 -5
  99. data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
  100. data/spec/support/lib/chef/resource/zen_master.rb +8 -10
  101. data/spec/support/matchers/leak.rb +1 -1
  102. data/spec/support/platform_helpers.rb +18 -0
  103. data/spec/support/shared/functional/directory_resource.rb +85 -23
  104. data/spec/support/shared/functional/file_resource.rb +198 -53
  105. data/spec/support/shared/functional/securable_resource.rb +140 -105
  106. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  107. data/spec/support/shared/unit/file_system_support.rb +110 -0
  108. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  109. data/spec/tiny_server.rb +29 -10
  110. data/spec/unit/api_client/registration_spec.rb +172 -0
  111. data/spec/unit/api_client_spec.rb +156 -103
  112. data/spec/unit/application/apply.rb +84 -0
  113. data/spec/unit/application/knife_spec.rb +5 -0
  114. data/spec/unit/application_spec.rb +57 -2
  115. data/spec/unit/chef_fs/diff_spec.rb +329 -0
  116. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  117. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  118. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  119. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  120. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  121. data/spec/unit/client_spec.rb +188 -16
  122. data/spec/unit/config_spec.rb +54 -4
  123. data/spec/unit/cookbook/chefignore_spec.rb +2 -1
  124. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  125. data/spec/unit/cookbook_loader_spec.rb +153 -91
  126. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  127. data/spec/unit/cookbook_spec.rb +3 -20
  128. data/spec/unit/cookbook_version_spec.rb +23 -122
  129. data/spec/unit/digester_spec.rb +50 -0
  130. data/spec/unit/dsl/data_query_spec.rb +66 -0
  131. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  132. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  133. data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
  134. data/spec/unit/environment_spec.rb +0 -130
  135. data/spec/unit/exceptions_spec.rb +2 -3
  136. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
  137. data/spec/unit/json_compat_spec.rb +69 -0
  138. data/spec/unit/knife/bootstrap_spec.rb +81 -28
  139. data/spec/unit/knife/client_reregister_spec.rb +23 -22
  140. data/spec/unit/knife/configure_spec.rb +29 -26
  141. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  142. data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
  143. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  144. data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
  145. data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
  146. data/spec/unit/knife/core/ui_spec.rb +156 -7
  147. data/spec/unit/knife/data_bag_create_spec.rb +14 -0
  148. data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
  149. data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
  150. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  151. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  152. data/spec/unit/knife/knife_help.rb +7 -7
  153. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  154. data/spec/unit/knife/ssh_spec.rb +121 -15
  155. data/spec/unit/knife/status_spec.rb +2 -2
  156. data/spec/unit/knife/user_create_spec.rb +86 -0
  157. data/spec/unit/knife/user_delete_spec.rb +39 -0
  158. data/spec/unit/knife/user_edit_spec.rb +42 -0
  159. data/spec/unit/knife/user_list_spec.rb +32 -0
  160. data/spec/unit/knife/user_reregister_spec.rb +53 -0
  161. data/spec/unit/knife/user_show_spec.rb +41 -0
  162. data/spec/unit/knife_spec.rb +53 -0
  163. data/spec/unit/lwrp_spec.rb +59 -17
  164. data/spec/unit/mixin/checksum_spec.rb +2 -2
  165. data/spec/unit/mixin/deep_merge_spec.rb +56 -491
  166. data/spec/unit/mixin/deprecation_spec.rb +23 -0
  167. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  168. data/spec/unit/mixin/params_validate_spec.rb +4 -2
  169. data/spec/unit/mixin/securable_spec.rb +5 -3
  170. data/spec/unit/mixin/template_spec.rb +119 -0
  171. data/spec/unit/node/attribute_spec.rb +272 -137
  172. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  173. data/spec/unit/node_spec.rb +411 -339
  174. data/spec/unit/platform_spec.rb +8 -8
  175. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  176. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  177. data/spec/unit/provider/deploy/revision_spec.rb +2 -8
  178. data/spec/unit/provider/deploy_spec.rb +6 -40
  179. data/spec/unit/provider/directory_spec.rb +103 -68
  180. data/spec/unit/provider/erl_call_spec.rb +0 -2
  181. data/spec/unit/provider/file_spec.rb +69 -59
  182. data/spec/unit/provider/git_spec.rb +0 -10
  183. data/spec/unit/provider/group/groupadd_spec.rb +1 -1
  184. data/spec/unit/provider/group/usermod_spec.rb +2 -2
  185. data/spec/unit/provider/http_request_spec.rb +28 -69
  186. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  187. data/spec/unit/provider/link_spec.rb +1 -1
  188. data/spec/unit/provider/ohai_spec.rb +4 -4
  189. data/spec/unit/provider/package/apt_spec.rb +0 -1
  190. data/spec/unit/provider/package/ips_spec.rb +0 -1
  191. data/spec/unit/provider/package/rubygems_spec.rb +0 -18
  192. data/spec/unit/provider/package/yum_spec.rb +79 -15
  193. data/spec/unit/provider/package_spec.rb +7 -5
  194. data/spec/unit/provider/registry_key_spec.rb +269 -0
  195. data/spec/unit/provider/remote_directory_spec.rb +24 -7
  196. data/spec/unit/provider/remote_file_spec.rb +36 -0
  197. data/spec/unit/provider/route_spec.rb +3 -6
  198. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  199. data/spec/unit/provider/service/arch_service_spec.rb +4 -4
  200. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  201. data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
  202. data/spec/unit/provider/service/init_service_spec.rb +26 -3
  203. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  204. data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
  205. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  206. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  207. data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
  208. data/spec/unit/provider/service_spec.rb +2 -2
  209. data/spec/unit/provider/subversion_spec.rb +1 -1
  210. data/spec/unit/provider/template_spec.rb +35 -11
  211. data/spec/unit/provider/user/dscl_spec.rb +57 -31
  212. data/spec/unit/provider/user_spec.rb +7 -16
  213. data/spec/unit/provider_spec.rb +4 -3
  214. data/spec/unit/recipe_spec.rb +10 -8
  215. data/spec/unit/registry_helper_spec.rb +376 -0
  216. data/spec/unit/resource/log_spec.rb +9 -0
  217. data/spec/unit/resource/registry_key_spec.rb +171 -0
  218. data/spec/unit/resource/remote_file_spec.rb +21 -23
  219. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  220. data/spec/unit/resource/service_spec.rb +11 -0
  221. data/spec/unit/resource_spec.rb +27 -4
  222. data/spec/unit/rest/auth_credentials_spec.rb +2 -14
  223. data/spec/unit/rest_spec.rb +122 -187
  224. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  225. data/spec/unit/run_context_spec.rb +18 -4
  226. data/spec/unit/run_list_spec.rb +0 -209
  227. data/spec/unit/run_lock_spec.rb +37 -0
  228. data/spec/unit/runner_spec.rb +101 -2
  229. data/spec/unit/scan_access_control_spec.rb +4 -4
  230. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  231. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  232. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
  233. data/spec/unit/shell_out_spec.rb +18 -0
  234. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  235. data/spec/unit/user_spec.rb +255 -0
  236. metadata +162 -157
  237. data/README.rdoc +0 -177
  238. data/spec/unit/certificate_spec.rb +0 -76
  239. data/spec/unit/checksum_cache_spec.rb +0 -209
  240. data/spec/unit/checksum_spec.rb +0 -94
  241. data/spec/unit/couchdb_spec.rb +0 -274
  242. data/spec/unit/index_queue_spec.rb +0 -391
  243. data/spec/unit/json_compat_spect.rb +0 -53
  244. data/spec/unit/mixin/language_spec.rb +0 -305
  245. data/spec/unit/openid_registration_spec.rb +0 -153
  246. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  247. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  248. data/spec/unit/solr_query_spec.rb +0 -203
  249. 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