chef 10.34.6 → 11.0.0.beta.0

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 (506) hide show
  1. data/CONTRIBUTING.md +155 -0
  2. data/README.md +89 -0
  3. data/Rakefile +4 -12
  4. data/bin/chef-apply +25 -0
  5. data/bin/chef-shell +34 -0
  6. data/bin/shef +6 -5
  7. data/distro/common/html/chef-client.8.html +4 -4
  8. data/distro/common/html/chef-expander.8.html +4 -4
  9. data/distro/common/html/chef-expanderctl.8.html +4 -4
  10. data/distro/common/html/chef-server-webui.8.html +4 -4
  11. data/distro/common/html/chef-server.8.html +4 -4
  12. data/distro/common/html/{shef.1.html → chef-shell.1.html} +49 -46
  13. data/distro/common/html/chef-solo.8.html +18 -12
  14. data/distro/common/html/chef-solr.8.html +4 -4
  15. data/distro/common/html/knife-bootstrap.1.html +4 -4
  16. data/distro/common/html/knife-client.1.html +4 -4
  17. data/distro/common/html/knife-configure.1.html +4 -4
  18. data/distro/common/html/knife-cookbook-site.1.html +4 -4
  19. data/distro/common/html/knife-cookbook.1.html +10 -7
  20. data/distro/common/html/knife-data-bag.1.html +10 -7
  21. data/distro/common/html/knife-environment.1.html +8 -6
  22. data/distro/common/html/knife-exec.1.html +9 -9
  23. data/distro/common/html/knife-index.1.html +4 -4
  24. data/distro/common/html/knife-node.1.html +4 -4
  25. data/distro/common/html/knife-role.1.html +4 -4
  26. data/distro/common/html/knife-search.1.html +4 -4
  27. data/distro/common/html/knife-ssh.1.html +4 -4
  28. data/distro/common/html/knife-status.1.html +4 -4
  29. data/distro/common/html/knife-tag.1.html +4 -4
  30. data/distro/common/html/knife.1.html +8 -13
  31. data/distro/common/man/man1/{shef.1 → chef-shell.1} +21 -57
  32. data/distro/common/man/man1/knife-bootstrap.1 +1 -1
  33. data/distro/common/man/man1/knife-client.1 +1 -1
  34. data/distro/common/man/man1/knife-configure.1 +1 -1
  35. data/distro/common/man/man1/knife-cookbook-site.1 +1 -1
  36. data/distro/common/man/man1/knife-cookbook.1 +15 -2
  37. data/distro/common/man/man1/knife-data-bag.1 +15 -2
  38. data/distro/common/man/man1/knife-environment.1 +12 -2
  39. data/distro/common/man/man1/knife-exec.1 +4 -7
  40. data/distro/common/man/man1/knife-index.1 +1 -1
  41. data/distro/common/man/man1/knife-node.1 +1 -1
  42. data/distro/common/man/man1/knife-role.1 +1 -1
  43. data/distro/common/man/man1/knife-search.1 +1 -1
  44. data/distro/common/man/man1/knife-ssh.1 +1 -1
  45. data/distro/common/man/man1/knife-status.1 +1 -1
  46. data/distro/common/man/man1/knife-tag.1 +1 -1
  47. data/distro/common/man/man1/knife.1 +3 -6
  48. data/distro/common/man/man8/chef-client.8 +1 -1
  49. data/distro/common/man/man8/chef-expander.8 +1 -1
  50. data/distro/common/man/man8/chef-expanderctl.8 +1 -1
  51. data/distro/common/man/man8/chef-server-webui.8 +1 -1
  52. data/distro/common/man/man8/chef-server.8 +1 -1
  53. data/distro/common/man/man8/chef-solo.8 +36 -4
  54. data/distro/common/man/man8/chef-solr.8 +1 -1
  55. data/distro/common/markdown/man1/{shef.mkd → chef-shell.mkd} +49 -43
  56. data/distro/common/markdown/man1/knife-exec.mkd +11 -6
  57. data/distro/common/markdown/man1/knife.mkd +4 -9
  58. data/distro/debian/etc/default/chef-client +0 -1
  59. data/distro/debian/etc/init.d/chef-client +2 -2
  60. data/lib/chef.rb +2 -5
  61. data/lib/chef/api_client.rb +20 -130
  62. data/lib/chef/api_client/registration.rb +126 -0
  63. data/lib/chef/application.rb +71 -14
  64. data/lib/chef/application/apply.rb +160 -0
  65. data/lib/chef/application/client.rb +25 -18
  66. data/lib/chef/application/knife.rb +0 -2
  67. data/lib/chef/application/solo.rb +23 -8
  68. data/lib/chef/application/windows_service.rb +5 -2
  69. data/lib/chef/applications.rb +1 -0
  70. data/lib/chef/chef_fs.rb +11 -0
  71. data/lib/chef/chef_fs/command_line.rb +232 -0
  72. data/lib/chef/chef_fs/file_pattern.rb +312 -0
  73. data/lib/chef/chef_fs/file_system.rb +358 -0
  74. data/lib/chef/chef_fs/file_system/base_fs_dir.rb +47 -0
  75. data/lib/chef/chef_fs/file_system/base_fs_object.rb +121 -0
  76. data/lib/chef/chef_fs/file_system/chef_repository_file_system_entry.rb +109 -0
  77. data/{spec/unit/monkey_patches/uri_spec.rb → lib/chef/chef_fs/file_system/chef_repository_file_system_root_dir.rb} +12 -15
  78. data/lib/chef/chef_fs/file_system/chef_server_root_dir.rb +84 -0
  79. data/lib/chef/chef_fs/file_system/cookbook_dir.rb +188 -0
  80. data/lib/chef/chef_fs/file_system/cookbook_file.rb +78 -0
  81. data/lib/chef/chef_fs/file_system/cookbook_subdir.rb +54 -0
  82. data/lib/chef/chef_fs/file_system/cookbooks_dir.rb +68 -0
  83. data/lib/chef/chef_fs/file_system/data_bag_dir.rb +78 -0
  84. data/lib/chef/chef_fs/file_system/data_bag_item.rb +59 -0
  85. data/lib/chef/chef_fs/file_system/data_bags_dir.rb +66 -0
  86. data/lib/chef/chef_fs/file_system/file_system_entry.rb +90 -0
  87. data/lib/chef/{index_queue.rb → chef_fs/file_system/file_system_error.rb} +14 -12
  88. data/lib/chef/{resource/whyrun_safe_ruby_block.rb → chef_fs/file_system/file_system_root_dir.rb} +10 -10
  89. data/lib/chef/chef_fs/file_system/must_delete_recursively_error.rb +31 -0
  90. data/lib/chef/chef_fs/file_system/nodes_dir.rb +47 -0
  91. data/lib/chef/{provider/whyrun_safe_ruby_block.rb → chef_fs/file_system/nonexistent_fs_object.rb} +19 -9
  92. data/lib/chef/chef_fs/file_system/not_found_error.rb +31 -0
  93. data/lib/chef/chef_fs/file_system/rest_list_dir.rb +84 -0
  94. data/lib/chef/chef_fs/file_system/rest_list_entry.rb +123 -0
  95. data/lib/chef/chef_fs/knife.rb +77 -0
  96. data/lib/chef/chef_fs/path_utils.rb +64 -0
  97. data/lib/chef/client.rb +44 -21
  98. data/lib/chef/config.rb +52 -43
  99. data/lib/chef/cookbook/synchronizer.rb +6 -8
  100. data/lib/chef/cookbook/syntax_check.rb +61 -14
  101. data/lib/chef/cookbook_loader.rb +39 -26
  102. data/lib/chef/cookbook_uploader.rb +17 -19
  103. data/lib/chef/cookbook_version.rb +3 -302
  104. data/lib/chef/daemon.rb +3 -18
  105. data/lib/chef/data_bag.rb +4 -97
  106. data/lib/chef/data_bag_item.rb +2 -65
  107. data/lib/chef/digester.rb +73 -0
  108. data/lib/chef/dsl.rb +6 -0
  109. data/lib/chef/dsl/data_query.rb +66 -0
  110. data/lib/chef/dsl/include_attribute.rb +60 -0
  111. data/lib/chef/dsl/include_recipe.rb +42 -0
  112. data/lib/chef/dsl/platform_introspection.rb +213 -0
  113. data/lib/chef/dsl/recipe.rb +84 -0
  114. data/lib/chef/dsl/registry_helper.rb +59 -0
  115. data/lib/chef/encrypted_data_bag_item.rb +74 -19
  116. data/lib/chef/environment.rb +9 -180
  117. data/lib/chef/exceptions.rb +87 -14
  118. data/lib/chef/formatters/base.rb +4 -1
  119. data/lib/chef/formatters/error_inspectors/registration_error_inspector.rb +0 -4
  120. data/lib/chef/json_compat.rb +1 -97
  121. data/lib/chef/knife.rb +90 -41
  122. data/lib/chef/knife/bootstrap/archlinux-gems.erb +2 -2
  123. data/lib/chef/knife/bootstrap/centos5-gems.erb +2 -2
  124. data/lib/chef/knife/bootstrap/chef-full.erb +3 -3
  125. data/lib/chef/knife/bootstrap/fedora13-gems.erb +2 -2
  126. data/lib/chef/knife/bootstrap/ubuntu10.04-apt.erb +2 -2
  127. data/lib/chef/knife/bootstrap/ubuntu10.04-gems.erb +2 -2
  128. data/lib/chef/knife/bootstrap/ubuntu12.04-gems.erb +2 -2
  129. data/lib/chef/knife/configure.rb +1 -2
  130. data/lib/chef/knife/cookbook_metadata.rb +1 -0
  131. data/lib/chef/knife/cookbook_test.rb +3 -2
  132. data/lib/chef/knife/cookbook_upload.rb +12 -7
  133. data/lib/chef/knife/core/bootstrap_context.rb +1 -1
  134. data/lib/chef/knife/core/generic_presenter.rb +26 -13
  135. data/lib/chef/knife/core/node_editor.rb +36 -16
  136. data/lib/chef/knife/core/node_presenter.rb +1 -1
  137. data/lib/chef/knife/core/text_formatter.rb +23 -37
  138. data/lib/chef/knife/core/ui.rb +15 -9
  139. data/lib/chef/knife/delete.rb +39 -0
  140. data/lib/chef/knife/diff.rb +46 -0
  141. data/lib/chef/knife/download.rb +50 -0
  142. data/lib/chef/knife/environment_show.rb +7 -0
  143. data/lib/chef/knife/exec.rb +5 -5
  144. data/lib/chef/knife/help_topics.rb +1 -1
  145. data/lib/chef/knife/index_rebuild.rb +91 -7
  146. data/lib/chef/knife/list.rb +109 -0
  147. data/lib/chef/knife/raw.rb +108 -0
  148. data/lib/chef/knife/search.rb +40 -22
  149. data/lib/chef/knife/show.rb +32 -0
  150. data/lib/chef/knife/ssh.rb +6 -2
  151. data/lib/chef/knife/upload.rb +50 -0
  152. data/lib/chef/mixin/checksum.rb +3 -3
  153. data/lib/chef/mixin/deep_merge.rb +55 -197
  154. data/lib/chef/mixin/language.rb +9 -222
  155. data/lib/chef/mixin/language_include_attribute.rb +6 -38
  156. data/lib/chef/mixin/language_include_recipe.rb +3 -35
  157. data/lib/chef/mixin/params_validate.rb +6 -19
  158. data/lib/chef/mixin/recipe_definition_dsl_core.rb +8 -61
  159. data/lib/chef/mixin/securable.rb +32 -7
  160. data/lib/chef/mixin/template.rb +40 -0
  161. data/lib/chef/mixins.rb +0 -4
  162. data/lib/chef/monkey_patches/net_http.rb +0 -34
  163. data/lib/chef/node.rb +133 -309
  164. data/lib/chef/node/attribute.rb +333 -473
  165. data/lib/chef/node/attribute_collections.rb +199 -0
  166. data/lib/chef/node/immutable_collections.rb +186 -0
  167. data/lib/chef/platform.rb +7 -22
  168. data/lib/chef/provider.rb +2 -49
  169. data/lib/chef/provider/breakpoint.rb +6 -6
  170. data/lib/chef/provider/cookbook_file.rb +5 -33
  171. data/lib/chef/provider/deploy.rb +2 -1
  172. data/lib/chef/provider/directory.rb +14 -17
  173. data/lib/chef/provider/file.rb +19 -52
  174. data/lib/chef/provider/group.rb +31 -51
  175. data/lib/chef/provider/group/dscl.rb +13 -53
  176. data/lib/chef/provider/group/gpasswd.rb +19 -14
  177. data/lib/chef/provider/group/groupadd.rb +1 -41
  178. data/lib/chef/provider/group/groupmod.rb +36 -46
  179. data/lib/chef/provider/group/pw.rb +16 -59
  180. data/lib/chef/provider/group/suse.rb +13 -16
  181. data/lib/chef/provider/group/usermod.rb +18 -40
  182. data/lib/chef/provider/group/windows.rb +6 -13
  183. data/lib/chef/provider/http_request.rb +25 -42
  184. data/lib/chef/provider/link.rb +2 -0
  185. data/lib/chef/provider/lwrp_base.rb +150 -0
  186. data/lib/chef/provider/package/portage.rb +4 -9
  187. data/lib/chef/provider/package/rpm.rb +2 -2
  188. data/lib/chef/provider/package/rubygems.rb +9 -41
  189. data/lib/chef/provider/package/yum.rb +12 -19
  190. data/lib/chef/provider/registry_key.rb +156 -0
  191. data/lib/chef/provider/remote_directory.rb +2 -0
  192. data/lib/chef/provider/remote_file.rb +21 -12
  193. data/lib/chef/provider/ruby_block.rb +5 -2
  194. data/lib/chef/provider/service.rb +15 -0
  195. data/lib/chef/provider/service/init.rb +9 -7
  196. data/lib/chef/provider/service/macosx.rb +15 -73
  197. data/lib/chef/provider/service/simple.rb +1 -1
  198. data/lib/chef/provider/service/solaris.rb +3 -3
  199. data/lib/chef/provider/template.rb +22 -25
  200. data/lib/chef/provider/template_finder.rb +61 -0
  201. data/lib/chef/provider/user.rb +0 -1
  202. data/lib/chef/provider/user/dscl.rb +175 -568
  203. data/lib/chef/provider/user/useradd.rb +30 -47
  204. data/lib/chef/providers.rb +3 -2
  205. data/lib/chef/recipe.rb +14 -8
  206. data/lib/chef/resource.rb +13 -154
  207. data/lib/chef/resource/group.rb +1 -11
  208. data/lib/chef/resource/http_request.rb +2 -1
  209. data/lib/chef/resource/lwrp_base.rb +127 -0
  210. data/lib/chef/resource/mount.rb +10 -11
  211. data/lib/chef/resource/registry_key.rb +86 -0
  212. data/lib/chef/resource/remote_directory.rb +6 -5
  213. data/lib/chef/resource/remote_file.rb +22 -31
  214. data/lib/chef/resource/ruby_block.rb +2 -2
  215. data/lib/chef/resource/service.rb +14 -0
  216. data/lib/chef/resource/user.rb +0 -18
  217. data/lib/chef/resource_collection.rb +25 -21
  218. data/lib/chef/resources.rb +2 -1
  219. data/lib/chef/rest.rb +50 -131
  220. data/lib/chef/rest/auth_credentials.rb +4 -20
  221. data/lib/chef/rest/rest_request.rb +2 -7
  222. data/lib/chef/role.rb +1 -97
  223. data/lib/chef/run_context.rb +108 -130
  224. data/lib/chef/run_context/cookbook_compiler.rb +280 -0
  225. data/lib/chef/run_list.rb +0 -2
  226. data/lib/chef/run_list/run_list_expansion.rb +0 -15
  227. data/lib/chef/run_lock.rb +90 -0
  228. data/lib/chef/runner.rb +28 -5
  229. data/lib/chef/sandbox.rb +15 -148
  230. data/lib/chef/scan_access_control.rb +2 -4
  231. data/lib/chef/shef/ext.rb +3 -575
  232. data/lib/chef/{shef.rb → shell.rb} +35 -40
  233. data/lib/chef/shell/ext.rb +593 -0
  234. data/lib/chef/{shef → shell}/model_wrapper.rb +3 -3
  235. data/lib/chef/{shef/shef_rest.rb → shell/shell_rest.rb} +4 -4
  236. data/lib/chef/{shef/shef_session.rb → shell/shell_session.rb} +17 -15
  237. data/lib/chef/shell_out.rb +7 -0
  238. data/lib/chef/util/windows/net_group.rb +1 -5
  239. data/lib/chef/version.rb +3 -3
  240. data/lib/chef/win32/api/process.rb +0 -1
  241. data/lib/chef/win32/handle.rb +1 -8
  242. data/lib/chef/win32/registry.rb +371 -0
  243. data/spec/data/big_json.json +1 -2
  244. data/spec/data/big_json_plus_one.json +1 -2
  245. data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
  246. data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
  247. data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
  248. data/spec/data/nodes/default.rb +3 -3
  249. data/spec/data/nodes/test.example.com.rb +3 -3
  250. data/spec/data/nodes/test.rb +3 -3
  251. data/spec/data/partial_one.erb +1 -0
  252. data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
  253. data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
  254. data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
  255. data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
  256. data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
  257. data/spec/data/{knife-home/.chef/plugins/knife/example_home_subcommand.rb → run_context/cookbooks/circular-dep1/recipes/default.rb} +0 -0
  258. data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
  259. data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
  260. data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
  261. data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
  262. data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
  263. data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
  264. data/spec/data/{lwrp_const_scoping/resources/conflict.rb → run_context/cookbooks/circular-dep2/recipes/default.rb} +0 -0
  265. data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
  266. data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
  267. data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
  268. data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
  269. data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
  270. data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
  271. data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
  272. data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
  273. data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
  274. data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
  275. data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
  276. data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
  277. data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
  278. data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
  279. data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
  280. data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
  281. data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
  282. data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
  283. data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
  284. data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
  285. data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
  286. data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
  287. data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
  288. data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
  289. data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
  290. data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
  291. data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
  292. data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
  293. data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
  294. data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
  295. data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
  296. data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
  297. data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
  298. data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
  299. data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
  300. data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
  301. data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
  302. data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
  303. data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
  304. data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
  305. data/spec/data/shef-config.rb +7 -0
  306. data/spec/functional/dsl/registry_helper_spec.rb +63 -0
  307. data/spec/functional/knife/cookbook_delete_spec.rb +1 -1
  308. data/spec/functional/knife/exec_spec.rb +2 -2
  309. data/spec/functional/knife/ssh_spec.rb +5 -1
  310. data/spec/functional/resource/cookbook_file_spec.rb +7 -19
  311. data/spec/functional/resource/directory_spec.rb +4 -0
  312. data/spec/functional/resource/file_spec.rb +56 -22
  313. data/spec/functional/resource/link_spec.rb +2 -0
  314. data/spec/functional/resource/registry_spec.rb +576 -0
  315. data/spec/functional/resource/remote_directory_spec.rb +142 -36
  316. data/spec/functional/resource/remote_file_spec.rb +18 -0
  317. data/spec/functional/resource/template_spec.rb +23 -2
  318. data/spec/functional/run_lock_spec.rb +106 -0
  319. data/spec/functional/shell_spec.rb +100 -0
  320. data/spec/functional/win32/registry_helper_spec.rb +632 -0
  321. data/spec/spec_helper.rb +5 -29
  322. data/spec/stress/win32/security_spec.rb +1 -1
  323. data/spec/support/chef_helpers.rb +0 -2
  324. data/spec/support/platform_helpers.rb +8 -15
  325. data/spec/support/shared/functional/directory_resource.rb +84 -22
  326. data/spec/support/shared/functional/file_resource.rb +169 -71
  327. data/spec/support/shared/functional/securable_resource.rb +143 -119
  328. data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
  329. data/spec/support/shared/unit/file_system_support.rb +110 -0
  330. data/spec/support/shared/unit/platform_introspector.rb +162 -0
  331. data/spec/unit/api_client/registration_spec.rb +175 -0
  332. data/spec/unit/api_client_spec.rb +78 -156
  333. data/spec/unit/application/apply.rb +84 -0
  334. data/spec/unit/application/client_spec.rb +1 -37
  335. data/spec/unit/application/knife_spec.rb +5 -0
  336. data/spec/unit/application_spec.rb +57 -2
  337. data/spec/unit/checksum/storage/filesystem_spec.rb +1 -1
  338. data/spec/unit/chef_fs/diff_spec.rb +328 -0
  339. data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
  340. data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
  341. data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
  342. data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
  343. data/spec/unit/chef_fs/file_system_spec.rb +136 -0
  344. data/spec/unit/client_spec.rb +124 -33
  345. data/spec/unit/config_spec.rb +46 -13
  346. data/spec/unit/cookbook/synchronizer_spec.rb +1 -49
  347. data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
  348. data/spec/unit/cookbook_loader_spec.rb +153 -91
  349. data/spec/unit/cookbook_manifest_spec.rb +81 -81
  350. data/spec/unit/cookbook_spec.rb +3 -20
  351. data/spec/unit/cookbook_version_spec.rb +23 -122
  352. data/spec/unit/daemon_spec.rb +3 -24
  353. data/spec/unit/data_bag_spec.rb +6 -4
  354. data/spec/unit/digester_spec.rb +50 -0
  355. data/spec/unit/dsl/data_query_spec.rb +66 -0
  356. data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
  357. data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
  358. data/spec/unit/encrypted_data_bag_item_spec.rb +50 -105
  359. data/spec/unit/environment_spec.rb +0 -130
  360. data/spec/unit/exceptions_spec.rb +2 -3
  361. data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +3 -3
  362. data/spec/unit/json_compat_spec.rb +15 -7
  363. data/spec/unit/knife/bootstrap_spec.rb +2 -0
  364. data/spec/unit/knife/configure_spec.rb +20 -14
  365. data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
  366. data/spec/unit/knife/cookbook_test_spec.rb +1 -0
  367. data/spec/unit/knife/cookbook_upload_spec.rb +43 -8
  368. data/spec/unit/knife/core/bootstrap_context_spec.rb +1 -1
  369. data/spec/unit/knife/core/ui_spec.rb +156 -125
  370. data/spec/unit/knife/data_bag_create_spec.rb +9 -0
  371. data/spec/unit/knife/data_bag_edit_spec.rb +1 -4
  372. data/spec/unit/knife/data_bag_from_file_spec.rb +4 -6
  373. data/spec/unit/knife/data_bag_show_spec.rb +11 -4
  374. data/spec/unit/knife/index_rebuild_spec.rb +96 -33
  375. data/spec/unit/knife/knife_help.rb +7 -7
  376. data/spec/unit/knife/node_edit_spec.rb +6 -33
  377. data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
  378. data/spec/unit/knife/ssh_spec.rb +12 -15
  379. data/spec/unit/knife/status_spec.rb +2 -2
  380. data/spec/unit/knife_spec.rb +53 -0
  381. data/spec/unit/lwrp_spec.rb +59 -42
  382. data/spec/unit/mixin/checksum_spec.rb +2 -2
  383. data/spec/unit/mixin/deep_merge_spec.rb +101 -799
  384. data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
  385. data/spec/unit/mixin/params_validate_spec.rb +4 -37
  386. data/spec/unit/mixin/securable_spec.rb +5 -3
  387. data/spec/unit/mixin/template_spec.rb +119 -0
  388. data/spec/unit/node/attribute_spec.rb +195 -173
  389. data/spec/unit/node/immutable_collections_spec.rb +139 -0
  390. data/spec/unit/node_spec.rb +366 -370
  391. data/spec/unit/platform_spec.rb +9 -10
  392. data/spec/unit/provider/breakpoint_spec.rb +8 -8
  393. data/spec/unit/provider/cookbook_file_spec.rb +4 -8
  394. data/spec/unit/provider/directory_spec.rb +96 -64
  395. data/spec/unit/provider/env_spec.rb +2 -2
  396. data/spec/unit/provider/file_spec.rb +48 -39
  397. data/spec/unit/provider/group/dscl_spec.rb +0 -36
  398. data/spec/unit/provider/group/gpasswd_spec.rb +9 -16
  399. data/spec/unit/provider/group/groupadd_spec.rb +4 -3
  400. data/spec/unit/provider/group/groupmod_spec.rb +1 -0
  401. data/spec/unit/provider/group/pw_spec.rb +15 -12
  402. data/spec/unit/provider/group/usermod_spec.rb +6 -21
  403. data/spec/unit/provider/group/windows_spec.rb +8 -0
  404. data/spec/unit/provider/group_spec.rb +6 -28
  405. data/spec/unit/provider/http_request_spec.rb +28 -69
  406. data/spec/unit/provider/ifconfig_spec.rb +2 -2
  407. data/spec/unit/provider/ohai_spec.rb +4 -4
  408. data/spec/unit/provider/package/apt_spec.rb +0 -1
  409. data/spec/unit/provider/package/ips_spec.rb +0 -1
  410. data/spec/unit/provider/package/portage_spec.rb +0 -44
  411. data/spec/unit/provider/package/rpm_spec.rb +0 -12
  412. data/spec/unit/provider/package/rubygems_spec.rb +1 -44
  413. data/spec/unit/provider/package/yum_spec.rb +39 -36
  414. data/spec/unit/provider/package_spec.rb +7 -5
  415. data/spec/unit/provider/registry_key_spec.rb +269 -0
  416. data/spec/unit/provider/remote_directory_spec.rb +7 -3
  417. data/spec/unit/provider/remote_file_spec.rb +36 -0
  418. data/spec/unit/provider/route_spec.rb +4 -3
  419. data/spec/unit/provider/ruby_block_spec.rb +8 -0
  420. data/spec/unit/provider/service/arch_service_spec.rb +5 -5
  421. data/spec/unit/provider/service/debian_service_spec.rb +1 -1
  422. data/spec/unit/provider/service/freebsd_service_spec.rb +5 -5
  423. data/spec/unit/provider/service/init_service_spec.rb +27 -4
  424. data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
  425. data/spec/unit/provider/service/invokercd_service_spec.rb +4 -4
  426. data/spec/unit/provider/service/macosx_spec.rb +11 -66
  427. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  428. data/spec/unit/provider/service/simple_service_spec.rb +3 -3
  429. data/spec/unit/provider/service/upstart_service_spec.rb +9 -9
  430. data/spec/unit/provider/subversion_spec.rb +1 -1
  431. data/spec/unit/provider/template_spec.rb +35 -11
  432. data/spec/unit/provider/user/dscl_spec.rb +285 -681
  433. data/spec/unit/provider/user/useradd_spec.rb +1 -22
  434. data/spec/unit/provider/user_spec.rb +1 -1
  435. data/spec/unit/recipe_spec.rb +10 -8
  436. data/spec/unit/registry_helper_spec.rb +374 -0
  437. data/spec/unit/resource/mount_spec.rb +0 -11
  438. data/spec/unit/resource/registry_key_spec.rb +171 -0
  439. data/spec/unit/resource/remote_file_spec.rb +21 -23
  440. data/spec/unit/resource/ruby_block_spec.rb +7 -3
  441. data/spec/unit/resource/service_spec.rb +11 -0
  442. data/spec/unit/resource_spec.rb +4 -19
  443. data/spec/unit/rest/auth_credentials_spec.rb +2 -19
  444. data/spec/unit/rest_spec.rb +130 -284
  445. data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
  446. data/spec/unit/run_context_spec.rb +18 -4
  447. data/spec/unit/run_list_spec.rb +0 -209
  448. data/spec/unit/run_lock_spec.rb +37 -0
  449. data/spec/unit/runner_spec.rb +101 -2
  450. data/spec/unit/scan_access_control_spec.rb +4 -4
  451. data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
  452. data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
  453. data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +14 -69
  454. data/spec/unit/shell_out_spec.rb +18 -0
  455. data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
  456. metadata +275 -234
  457. checksums.yaml +0 -15
  458. data/README.rdoc +0 -177
  459. data/distro/common/html/knife-recipe.1.html +0 -92
  460. data/lib/chef/certificate.rb +0 -161
  461. data/lib/chef/checksum.rb +0 -167
  462. data/lib/chef/checksum_cache.rb +0 -190
  463. data/lib/chef/cookbook_version_selector.rb +0 -168
  464. data/lib/chef/couchdb.rb +0 -246
  465. data/lib/chef/index_queue/amqp_client.rb +0 -116
  466. data/lib/chef/index_queue/consumer.rb +0 -76
  467. data/lib/chef/index_queue/indexable.rb +0 -109
  468. data/lib/chef/knife/bootstrap/ubuntu12.10-gems.erb +0 -60
  469. data/lib/chef/monkey_patches/moneta.rb +0 -50
  470. data/lib/chef/monkey_patches/uri.rb +0 -70
  471. data/lib/chef/openid_registration.rb +0 -187
  472. data/lib/chef/provider/user/solaris.rb +0 -90
  473. data/lib/chef/solr_query.rb +0 -187
  474. data/lib/chef/solr_query/lucene.treetop +0 -150
  475. data/lib/chef/solr_query/lucene_nodes.rb +0 -285
  476. data/lib/chef/solr_query/query_transform.rb +0 -65
  477. data/lib/chef/solr_query/solr_http_request.rb +0 -132
  478. data/lib/chef/webui_user.rb +0 -231
  479. data/spec/data/cookbooks/openldap/files/default/.dotfile +0 -1
  480. data/spec/data/cookbooks/openldap/files/default/.ssh/id_rsa +0 -1
  481. data/spec/data/cookbooks/openldap/files/default/remotedir/.a_dotdir/.a_dotfile_in_a_dotdir +0 -1
  482. data/spec/data/cookbooks/openldap/files/default/remotedir/remotesubdir/.a_dotfile +0 -1
  483. data/spec/data/mac_users/10.7-8.plist.xml +0 -559
  484. data/spec/data/mac_users/10.7-8.shadow.xml +0 -11
  485. data/spec/data/mac_users/10.7.plist.xml +0 -559
  486. data/spec/data/mac_users/10.7.shadow.xml +0 -11
  487. data/spec/data/mac_users/10.8.plist.xml +0 -559
  488. data/spec/data/mac_users/10.8.shadow.xml +0 -21
  489. data/spec/data/mac_users/10.9.plist.xml +0 -560
  490. data/spec/data/mac_users/10.9.shadow.xml +0 -21
  491. data/spec/functional/resource/base.rb +0 -40
  492. data/spec/functional/resource/group_spec.rb +0 -343
  493. data/spec/functional/resource/user/dscl_spec.rb +0 -199
  494. data/spec/unit/certificate_spec.rb +0 -76
  495. data/spec/unit/checksum_cache_spec.rb +0 -209
  496. data/spec/unit/checksum_spec.rb +0 -94
  497. data/spec/unit/couchdb_spec.rb +0 -274
  498. data/spec/unit/index_queue_spec.rb +0 -391
  499. data/spec/unit/mixin/language_spec.rb +0 -305
  500. data/spec/unit/openid_registration_spec.rb +0 -153
  501. data/spec/unit/provider/user/solaris_spec.rb +0 -414
  502. data/spec/unit/provider/whyrun_safe_ruby_block_spec.rb +0 -47
  503. data/spec/unit/solr_query/query_transform_spec.rb +0 -454
  504. data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
  505. data/spec/unit/solr_query_spec.rb +0 -203
  506. data/spec/unit/webui_user_spec.rb +0 -238
@@ -27,12 +27,12 @@ end
27
27
  describe Chef::Mixin::Checksum do
28
28
  before(:each) do
29
29
  @checksum_user = Chef::CMCCheck.new
30
- @cache = Chef::ChecksumCache.instance
30
+ @cache = Chef::Digester.instance
31
31
  @file = CHEF_SPEC_DATA + "/checksum/random.txt"
32
32
  @stat = mock("File::Stat", { :mtime => Time.at(0) })
33
33
  File.stub!(:stat).and_return(@stat)
34
34
  end
35
-
35
+
36
36
  it "gets the checksum of a file" do
37
37
  @checksum_user.checksum(@file).should == "09ee9c8cc70501763563bcf9c218d71b2fbf4186bf8e1e0da07f0f42c80a3394"
38
38
  end
@@ -36,14 +36,14 @@ describe Chef::Mixin::DeepMerge, "deep_merge!" do
36
36
  it "tests merging an hash w/array into blank hash" do
37
37
  hash_src = {'id' => '2'}
38
38
  hash_dst = {}
39
- @dm.deep_merge!(hash_src.dup, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
39
+ @dm.deep_merge!(hash_src.dup, hash_dst)
40
40
  hash_dst.should == hash_src
41
41
  end
42
42
 
43
43
  it "tests merging an hash w/array into blank hash" do
44
44
  hash_src = {'region' => {'id' => ['227', '2']}}
45
45
  hash_dst = {}
46
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
46
+ @dm.deep_merge!(hash_src, hash_dst)
47
47
  hash_dst.should == hash_src
48
48
  end
49
49
 
@@ -75,392 +75,102 @@ describe Chef::Mixin::DeepMerge, "deep_merge!" do
75
75
  hash_dst.should == hash_src
76
76
  end
77
77
 
78
- context "while merging arrays" do
79
- it ":deep_merge_array_concat should be set by default" do
80
- Chef::Config[:deep_merge_array_concat].should == true
81
- end
82
-
83
- context "when :deep_merge_array_concat is set" do
84
- before do
85
- Chef::Config.stub!(:[]).with(:deep_merge_array_concat).and_return(true)
86
- end
87
-
88
- it "tests hashes holding array" do
89
- hash_src = {"property" => ["1","3"]}
90
- hash_dst = {"property" => ["2","4"]}
91
- @dm.deep_merge!(hash_src, hash_dst)
92
- hash_dst.should == {"property" => ["1","3"]}
93
- end
94
-
95
- it "tests hashes holding array (sorted)" do
96
- hash_src = {"property" => ["3","1"]}
97
- hash_dst = {"property" => ["2","4"]}
98
- @dm.deep_merge!(hash_src, hash_dst, {:sort_merged_arrays => true})
99
- hash_dst.should == {"property" => ["1","3"]}
100
- end
101
-
102
- it "tests hashes holding hashes holding arrays (array with duplicate elements are preserved)" do
103
- hash_src = {"property" => {"bedroom_count" => ["1", "2", "2"], "bathroom_count" => ["1", "4+"]}}
104
- hash_dst = {"property" => {"bedroom_count" => ["3", "2"], "bathroom_count" => ["2"]}}
105
- @dm.deep_merge!(hash_src, hash_dst)
106
- hash_dst.should == {"property" => {"bedroom_count" => ["1","2","2"], "bathroom_count" => ["1", "4+"]}}
107
- end
108
-
109
- it "tests 3 hash layers holding arrays of int (src arrays are picked)" do
110
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["1", "4+"]}}
111
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
112
- @dm.deep_merge!(hash_src, hash_dst)
113
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["1","4+"]}}
114
- end
115
-
116
- it "tests 3 hash layers holding arrays of int (src arrays are picked) but second hash's array is overwritten" do
117
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
118
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
119
- @dm.deep_merge!(hash_src, hash_dst)
120
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
121
- end
122
-
123
- it "tests 3 hash layers holding arrays of int (src arrays are picked) but second hash's array is NOT overwritten" do
124
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
125
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
126
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
127
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["2"]}}
128
- end
129
-
130
- it "tests 3 hash layers holding arrays of int, but one holds int. This one overwrites, but src are picked for the rest" do
131
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [1]}, "bathroom_count" => ["1"]}}
132
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
133
- @dm.deep_merge!(hash_src, hash_dst)
134
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [1]}, "bathroom_count" => ["1"]}}
135
- end
136
-
137
- it "tests 3 hash layers holding arrays of int, but source is incomplete." do
138
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3]}, "bathroom_count" => ["1"]}}
139
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
140
- @dm.deep_merge!(hash_src, hash_dst)
141
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [4]}, "bathroom_count" => ["1"]}}
142
- end
143
-
144
- it "tests 3 hash layers holding arrays of int, but source is shorter and has new 2nd level ints." do
145
- hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
146
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
147
- @dm.deep_merge!(hash_src, hash_dst)
148
- hash_dst.should == {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3], "queen_bed" => [4]}, "bathroom_count" => ["1"]}}
149
- end
150
-
151
- # KNOCKOUT_PREFIX testing
152
- # the next few tests are looking for correct behavior from specific real-world params/session merges
153
- # using the custom modifiers built for param/session merges
154
-
155
- [nil, ","].each do |ko_split|
156
- it "tests typical params/session style hash with knockout_merge elements" do
157
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
158
- hash_dst = {"property"=>{"bedroom_count"=>["1", "2", "3"]}}
159
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
160
- hash_dst.should == {"property"=>{"bedroom_count"=>["2", "3"]}}
161
- end
162
-
163
- it "tests typical params/session style hash with knockout_merge elements" do
164
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
165
- hash_dst = {"property"=>{"bedroom_count"=>["3"]}}
166
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
167
- hash_dst.should == {"property"=>{"bedroom_count"=>["2","3"]}}
168
- end
169
-
170
- it "tests typical params/session style hash with knockout_merge elements" do
171
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
172
- hash_dst = {"property"=>{"bedroom_count"=>["4"]}}
173
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
174
- hash_dst.should == {"property"=>{"bedroom_count"=>["2","3"]}}
175
- end
176
-
177
- it "tests typical params/session style hash with knockout_merge elements" do
178
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
179
- hash_dst = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "4"]}}
180
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
181
- hash_dst.should == {"property"=>{"bedroom_count"=>["2","3"]}}
182
- end
183
-
184
- it "tests typical params/session style hash with knockout_merge elements" do
185
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1", @field_ko_prefix+":2", "3", "4"]}}
186
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
187
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
188
- hash_dst.should == {"amenity"=>{"id"=>["3","4"]}}
189
- end
190
- end
191
-
192
- it "tests same as previous but without ko_split value, this merge should fail" do
193
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1,"+@field_ko_prefix+":2", "3,4"]}}
194
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
195
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
196
- hash_dst.should == {"amenity"=>{"id"=>["3,4"]}}
197
- end
198
-
199
- it "tests edge test: make sure that when we turn off knockout_prefix that all values are processed correctly" do
200
- hash_src = {"region" => {'ids' => ["7", @field_ko_prefix, "2", "6,8"]}}
201
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
202
- @dm.deep_merge!(hash_src, hash_dst, {:unpack_arrays => ","})
203
- hash_dst.should == {'region' => {'ids' => ["7", @field_ko_prefix, "2", "6", "8"], 'id'=>'11'}}
204
- end
205
-
206
- it "tests edge test 2: make sure that when we turn off source array split that all values are processed correctly" do
207
- hash_src = {"region" => {'ids' => ["7", "3", @field_ko_prefix, "6,8"]}}
208
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
209
- @dm.deep_merge!(hash_src, hash_dst)
210
- hash_dst.should == {'region' => {'ids' => ["7", "3", @field_ko_prefix, "6,8"], 'id'=>'11'}}
211
- end
212
-
213
- it "tests hash of array of hashes" do
214
- hash_src = {"item" => [{"1" => "3"}, {"2" => "4"}]}
215
- hash_dst = {"item" => [{"3" => "5"}]}
216
- @dm.deep_merge!(hash_src, hash_dst)
217
- hash_dst.should == {"item" => [{"1" => "3"}, {"2" => "4"}]}
218
- end
219
-
220
- end
221
-
222
- # These tests ensure that deep_merge behavior didn't change when
223
- # the config option disables the array merging during deep merge
224
- # while fixing CHEF-4631.
225
- context "when :deep_merge_array_concat is not set" do
226
- before do
227
- Chef::Config.stub!(:[]).with(:deep_merge_array_concat).and_return(false)
228
- end
229
-
230
- it "tests hashes holding array" do
231
- hash_src = {"property" => ["1","3"]}
232
- hash_dst = {"property" => ["2","4"]}
233
- @dm.deep_merge!(hash_src, hash_dst)
234
- hash_dst.should == {"property" => ["2","4","1","3"]}
235
- end
236
-
237
- it "tests hashes holding array (sorted)" do
238
- hash_src = {"property" => ["1","3"]}
239
- hash_dst = {"property" => ["2","4"]}
240
- @dm.deep_merge!(hash_src, hash_dst, {:sort_merged_arrays => true})
241
- hash_dst.should == {"property" => ["1","2","3","4"]}
242
- end
243
-
244
- it "tests hashes holding hashes holding arrays (array with duplicate elements is merged with dest then src" do
245
- hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
246
- hash_dst = {"property" => {"bedroom_count" => ["3", "2"], "bathroom_count" => ["2"]}}
247
- @dm.deep_merge!(hash_src, hash_dst)
248
- hash_dst.should == {"property" => {"bedroom_count" => ["3","2","1"], "bathroom_count" => ["2", "1", "4+"]}}
249
- end
250
-
251
- it "tests 3 hash layers holding arrays of int (arrays are merged)" do
252
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["1", "4+"]}}
253
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
254
- @dm.deep_merge!(hash_src, hash_dst)
255
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => ["2","1","4+"]}}
256
- end
257
-
258
- it "tests 3 hash layers holding arrays of int (arrays are merged) but second hash's array is overwritten" do
259
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
260
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
261
- @dm.deep_merge!(hash_src, hash_dst)
262
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => "1"}}
263
- end
264
-
265
- it "tests 3 hash layers holding arrays of int (arrays are merged) but second hash's array is NOT overwritten" do
266
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
267
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
268
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
269
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => ["2"]}}
270
- end
271
-
272
- it "tests 3 hash layers holding arrays of int, but one holds int. This one overwrites, but the rest merge" do
273
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [1]}, "bathroom_count" => ["1"]}}
274
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
275
- @dm.deep_merge!(hash_src, hash_dst)
276
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [4,1]}, "bathroom_count" => ["2","1"]}}
277
- end
278
-
279
- it "tests 3 hash layers holding arrays of int, but source is incomplete." do
280
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3]}, "bathroom_count" => ["1"]}}
281
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
282
- @dm.deep_merge!(hash_src, hash_dst)
283
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}
284
- end
285
-
286
- it "tests 3 hash layers holding arrays of int, but source is shorter and has new 2nd level ints." do
287
- hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
288
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
289
- @dm.deep_merge!(hash_src, hash_dst)
290
- hash_dst.should == {"property" => {"bedroom_count" => {2=>3, "king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}
291
- end
292
-
293
- # KNOCKOUT_PREFIX testing
294
- # the next few tests are looking for correct behavior from specific real-world params/session merges
295
- # using the custom modifiers built for param/session merges
296
-
297
- [nil, ","].each do |ko_split|
298
- it "tests typical params/session style hash with knockout_merge elements" do
299
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
300
- hash_dst = {"property"=>{"bedroom_count"=>["1", "2", "3"]}}
301
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
302
- hash_dst.should == {"property"=>{"bedroom_count"=>["2", "3"]}}
303
- end
304
-
305
- it "tests typical params/session style hash with knockout_merge elements" do
306
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
307
- hash_dst = {"property"=>{"bedroom_count"=>["3"]}}
308
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
309
- hash_dst.should == {"property"=>{"bedroom_count"=>["3","2"]}}
310
- end
311
-
312
- it "tests typical params/session style hash with knockout_merge elements" do
313
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
314
- hash_dst = {"property"=>{"bedroom_count"=>["4"]}}
315
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
316
- hash_dst.should == {"property"=>{"bedroom_count"=>["4","2","3"]}}
317
- end
318
-
319
- it "tests typical params/session style hash with knockout_merge elements" do
320
- hash_src = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "2", "3"]}}
321
- hash_dst = {"property"=>{"bedroom_count"=>[@field_ko_prefix+":1", "4"]}}
322
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
323
- hash_dst.should == {"property"=>{"bedroom_count"=>["4","2","3"]}}
324
- end
325
-
326
- it "tests typical params/session style hash with knockout_merge elements" do
327
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1", @field_ko_prefix+":2", "3", "4"]}}
328
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
329
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ko_split})
330
- hash_dst.should == {"amenity"=>{"id"=>["3","4"]}}
331
- end
332
- end
333
-
334
- it "tests same as previous but without ko_split value, this merge should fail" do
335
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1,"+@field_ko_prefix+":2", "3,4"]}}
336
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
337
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
338
- hash_dst.should == {"amenity"=>{"id"=>["1","2","3,4"]}}
339
- end
340
-
341
- it "tests edge test: make sure that when we turn off knockout_prefix that all values are processed correctly" do
342
- hash_src = {"region" => {'ids' => ["7", @field_ko_prefix, "2", "6,8"]}}
343
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
344
- @dm.deep_merge!(hash_src, hash_dst, {:unpack_arrays => ","})
345
- hash_dst.should == {'region' => {'ids' => ["1", "2", "3", "4", "7", @field_ko_prefix, "6", "8"], 'id'=>'11'}}
346
- end
347
-
348
- it "tests edge test 2: make sure that when we turn off source array split that all values are processed correctly" do
349
- hash_src = {"region" => {'ids' => ["7", "3", @field_ko_prefix, "6,8"]}}
350
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
351
- @dm.deep_merge!(hash_src, hash_dst)
352
- hash_dst.should == {'region' => {'ids' => ["1", "2", "3", "4", "7", @field_ko_prefix, "6,8"], 'id'=>'11'}}
353
- end
354
-
355
- it "tests hash of array of hashes" do
356
- hash_src = {"item" => [{"1" => "3"}, {"2" => "4"}]}
357
- hash_dst = {"item" => [{"3" => "5"}]}
358
- @dm.deep_merge!(hash_src, hash_dst)
359
- hash_dst.should == {"item" => [{"3" => "5"}, {"1" => "3"}, {"2" => "4"}]}
360
- end
361
- end
78
+ it "tests hashes holding array" do
79
+ hash_src = {"property" => ["1","3"]}
80
+ hash_dst = {"property" => ["2","4"]}
81
+ @dm.deep_merge!(hash_src, hash_dst)
82
+ hash_dst.should == {"property" => ["2","4","1","3"]}
362
83
  end
363
84
 
364
- it "tests 1 hash overwriting 3 hash layers holding arrays of int" do
365
- hash_src = {"property" => "1"}
366
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
85
+ it "tests hashes holding hashes holding arrays (array with duplicate elements is merged with dest then src" do
86
+ hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
87
+ hash_dst = {"property" => {"bedroom_count" => ["3", "2"], "bathroom_count" => ["2"]}}
367
88
  @dm.deep_merge!(hash_src, hash_dst)
368
- hash_dst.should == {"property" => "1"}
89
+ hash_dst.should == {"property" => {"bedroom_count" => ["3","2","1"], "bathroom_count" => ["2", "1", "4+"]}}
369
90
  end
370
91
 
371
- it "tests 1 hash NOT overwriting 3 hash layers holding arrays of int" do
372
- hash_src = {"property" => "1"}
373
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
374
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
375
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
92
+ it "tests hash holding hash holding array v string (string is overwritten by array)" do
93
+ hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
94
+ hash_dst = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["2"]}}
95
+ @dm.deep_merge!(hash_src, hash_dst)
96
+ hash_dst.should == {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2","1","4+"]}}
376
97
  end
377
98
 
378
- it "tests 3 hash layers holding arrays of int, but source is empty" do
379
- hash_src = {}
380
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
99
+ it "tests hash holding hash holding string v array (array is overwritten by string)" do
100
+ hash_src = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["1", "4+"]}}
101
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
381
102
  @dm.deep_merge!(hash_src, hash_dst)
382
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
103
+ hash_dst.should == {"property" => {"bedroom_count" => "3", "bathroom_count" => ["2","1","4+"]}}
383
104
  end
384
105
 
385
- it "tests 3 hash layers holding arrays of int, but dest is empty" do
386
- hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
387
- hash_dst = {}
106
+ it "tests hash holding hash holding hash v array (array is overwritten by hash)" do
107
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["1", "4+"]}}
108
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
388
109
  @dm.deep_merge!(hash_src, hash_dst)
389
- hash_dst.should == {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
110
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["2","1","4+"]}}
390
111
  end
391
112
 
392
- it "tests hash holding hash holding array v string (string is overwritten by array)" do
393
- hash_src = {"property" => {"bedroom_count" => ["1", "2"]}}
394
- hash_dst = {"property" => {"bedroom_count" => "3"}}
113
+ it "tests 3 hash layers holding integers (integers are overwritten by source)" do
114
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["1", "4+"]}}
115
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => 2, "queen_bed" => 4}, "bathroom_count" => ["2"]}}
395
116
  @dm.deep_merge!(hash_src, hash_dst)
396
- hash_dst.should == {"property" => {"bedroom_count" => ["1", "2"]}}
117
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["2","1","4+"]}}
397
118
  end
398
119
 
399
- it "tests hash holding hash holding array v string (string is NOT overwritten by array)" do
400
- hash_src = {"property" => {"bedroom_count" => ["1", "2"]}}
401
- hash_dst = {"property" => {"bedroom_count" => "3"}}
402
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
403
- hash_dst.should == {"property" => {"bedroom_count" => "3"}}
120
+ it "tests 3 hash layers holding arrays of int (arrays are merged)" do
121
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["1", "4+"]}}
122
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
123
+ @dm.deep_merge!(hash_src, hash_dst)
124
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => ["2","1","4+"]}}
404
125
  end
405
126
 
406
- it "tests hash holding hash holding string v array (array is overwritten by string)" do
407
- hash_src = {"property" => {"bedroom_count" => "3"}}
408
- hash_dst = {"property" => {"bedroom_count" => ["1", "2"]}}
127
+ it "tests 1 hash overwriting 3 hash layers holding arrays of int" do
128
+ hash_src = {"property" => "1"}
129
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
409
130
  @dm.deep_merge!(hash_src, hash_dst)
410
- hash_dst.should == {"property" => {"bedroom_count" => "3"}}
131
+ hash_dst.should == {"property" => "1"}
411
132
  end
412
133
 
413
- it "tests hash holding hash holding string v array (array does NOT overwrite string)" do
414
- hash_src = {"property" => {"bedroom_count" => "3"}}
415
- hash_dst = {"property" => {"bedroom_count" => ["1", "2"]}}
416
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
417
- hash_dst.should == {"property" => {"bedroom_count" => ["1", "2"]}}
134
+ it "tests 3 hash layers holding arrays of int (arrays are merged) but second hash's array is overwritten" do
135
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
136
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
137
+ @dm.deep_merge!(hash_src, hash_dst)
138
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => "1"}}
418
139
  end
419
140
 
420
- it "tests hash holding hash holding hash v array (array is overwritten by hash)" do
421
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}}}
422
- hash_dst = {"property" => {"bedroom_count" => ["1", "2"]}}
141
+ it "tests 3 hash layers holding arrays of int, but one holds int. This one overwrites, but the rest merge" do
142
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [1]}, "bathroom_count" => ["1"]}}
143
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
423
144
  @dm.deep_merge!(hash_src, hash_dst)
424
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}}}
145
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [4,1]}, "bathroom_count" => ["2","1"]}}
425
146
  end
426
147
 
427
- it "tests hash holding hash holding hash v array (array is NOT overwritten by hash)" do
428
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}}}
429
- hash_dst = {"property" => {"bedroom_count" => ["1", "2"]}}
430
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
431
- hash_dst.should == {"property" => {"bedroom_count" => ["1", "2"]}}
148
+ it "tests 3 hash layers holding arrays of int, but source is incomplete." do
149
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3]}, "bathroom_count" => ["1"]}}
150
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
151
+ @dm.deep_merge!(hash_src, hash_dst)
152
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}
432
153
  end
433
154
 
434
- it "tests 3 hash layers holding integers (integers are overwritten by source)" do
435
- hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}}}
436
- hash_dst = {"property" => {"bedroom_count" => {"king_bed" => 2, "queen_bed" => 4}}}
155
+ it "tests 3 hash layers holding arrays of int, but source is shorter and has new 2nd level ints." do
156
+ hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
157
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
437
158
  @dm.deep_merge!(hash_src, hash_dst)
438
- hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}}}
159
+ hash_dst.should == {"property" => {"bedroom_count" => {2=>3, "king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}
439
160
  end
440
161
 
441
- it "tests parameter management for knockout_prefix and overwrite unmergable" do
442
- hash_src = {"x" => 1}
443
- hash_dst = {"y" => 2}
444
-
445
- lambda {
446
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => ""})
447
- }.should raise_error(Chef::Mixin::DeepMerge::InvalidParameter)
448
-
449
- lambda {
450
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => ""})
451
- }.should raise_error(Chef::Mixin::DeepMerge::InvalidParameter)
452
-
453
- lambda {
454
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => @field_ko_prefix})
455
- }.should raise_error(Chef::Mixin::DeepMerge::InvalidParameter)
456
-
457
- lambda {
458
- @dm.deep_merge!(@dm.deep_merge!(hash_src, hash_dst))
459
- }.should_not raise_error(Chef::Mixin::DeepMerge::InvalidParameter)
162
+ it "tests 3 hash layers holding arrays of int, but source is empty" do
163
+ hash_src = {}
164
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
165
+ @dm.deep_merge!(hash_src, hash_dst)
166
+ hash_dst.should == {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
167
+ end
460
168
 
461
- lambda {
462
- @dm.deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
463
- }.should_not raise_error(Chef::Mixin::DeepMerge::InvalidParameter)
169
+ it "tests 3 hash layers holding arrays of int, but dest is empty" do
170
+ hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
171
+ hash_dst = {}
172
+ @dm.deep_merge!(hash_src, hash_dst)
173
+ hash_dst.should == {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
464
174
  end
465
175
 
466
176
  it "tests hash holding arrays of arrays" do
@@ -470,357 +180,32 @@ describe Chef::Mixin::DeepMerge, "deep_merge!" do
470
180
  hash_dst.should == {["1","2","3"] => ["1", "2"], ["4", "5"] => ["3"]}
471
181
  end
472
182
 
473
- it "tests merging of hash with blank hash, and make sure that source array split still functions" do
474
- hash_src = {'property' => {'bedroom_count' => ["1","2,3"]}}
475
- hash_dst = {}
476
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
477
- hash_dst.should == {'property' => {'bedroom_count' => ["1","2","3"]}}
478
- end
479
-
480
183
  it "tests merging of hash with blank hash, and make sure that source array split does not function when turned off" do
481
184
  hash_src = {'property' => {'bedroom_count' => ["1","2,3"]}}
482
185
  hash_dst = {}
483
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
186
+ @dm.deep_merge!(hash_src, hash_dst)
484
187
  hash_dst.should == {'property' => {'bedroom_count' => ["1","2,3"]}}
485
188
  end
486
189
 
487
- it "tests merging into a blank hash with overwrite_unmergeables turned on" do
190
+ it "tests merging into a blank hash" do
488
191
  hash_src = {"action"=>"browse", "controller"=>"results"}
489
192
  hash_dst = {}
490
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
193
+ @dm.deep_merge!(hash_src, hash_dst)
491
194
  hash_dst.should == hash_src
492
195
  end
493
196
 
494
- it "tests special params/session style hash with knockout_merge elements in form src: [\"1\",\"2\"] dest:[\"@ko:1,@ko:2\", \"3,4\"]" do
495
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1,"+@field_ko_prefix+":2", "3,4"]}}
496
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
497
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
498
- hash_dst.should == {"amenity"=>{"id"=>["3","4"]}}
499
- end
500
-
501
- it "tests special params/session style hash with knockout_merge elements in form src: [\"1\",\"2\"] dest:[\"@ko:1,@ko:2\", \"3,4\"]" do
502
- hash_src = {"amenity"=>{"id"=>[@field_ko_prefix+":1,2", "3,4", @field_ko_prefix+":5", "6"]}}
503
- hash_dst = {"amenity"=>{"id"=>["1", "2"]}}
504
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
505
- hash_dst.should == {"amenity"=>{"id"=>["2","3","4","6"]}}
506
- end
507
-
508
- it "tests special params/session style hash with knockout_merge elements in form src: [\"@ko:1,@ko:2\", \"3,4\", \"@ko:5\", \"6\"] dest:[\"1,2\", \"3,4\"]" do
509
- hash_src = {"amenity"=>{"id"=>["#{@field_ko_prefix}:1,#{@field_ko_prefix}:2", "3,4", "#{@field_ko_prefix}:5", "6"]}}
510
- hash_dst = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
511
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
512
- hash_dst.should == {"amenity"=>{"id"=>["3","4","6"]}}
513
- end
514
-
515
- it "unamed upstream - tbd" do
516
- hash_src = {"url_regions"=>[], "region"=>{"ids"=>["227,233"]}, "action"=>"browse", "task"=>"browse", "controller"=>"results"}
517
- hash_dst = {"region"=>{"ids"=>["227"]}}
518
- @dm.deep_merge!(hash_src.dup, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
519
- hash_dst.should == {"url_regions"=>[], "region"=>{"ids"=>["227","233"]}, "action"=>"browse", "task"=>"browse", "controller"=>"results"}
520
- end
521
-
522
- it "unamed upstream - tbd" do
523
- hash_src = {"region"=>{"ids"=>[@field_ko_prefix,"227"], "id"=>"230"}}
524
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
525
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
526
- hash_dst.should == {"region"=>{"ids"=>["227"], "id"=>"230"}}
527
- end
528
-
529
- it "unamed upstream - tbd" do
530
- hash_src = {"region"=>{"ids"=>[@field_ko_prefix,"227", "232", "233"], "id"=>"232"}}
531
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
532
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
533
- hash_dst.should == {"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}
534
- end
535
-
536
- it "unamed upstream - tbd" do
537
- hash_src = {"region"=>{"ids"=>["#{@field_ko_prefix},227,232,233"], "id"=>"232"}}
538
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
539
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
540
- hash_dst.should == {"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}
541
- end
542
-
543
- it "unamed upstream - tbd" do
544
- hash_src = {"region"=>{"ids"=>["#{@field_ko_prefix},227,232","233"], "id"=>"232"}}
545
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
546
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
547
- hash_dst.should == {"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}
548
- end
549
-
550
- it "unamed upstream - tbd" do
551
- hash_src = {"region"=>{"ids"=>["#{@field_ko_prefix},227"], "id"=>"230"}}
552
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
553
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
554
- hash_dst.should == {"region"=>{"ids"=>["227"], "id"=>"230"}}
555
- end
556
-
557
- it "unamed upstream - tbd" do
558
- hash_src = {"region"=>{"ids"=>["#{@field_ko_prefix},227"], "id"=>"230"}}
559
- hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}, "action"=>"browse", "task"=>"browse", "controller"=>"results", "property_order_by"=>"property_type.descr"}
560
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
561
- hash_dst.should == {"region"=>{"ids"=>["227"], "id"=>"230"}, "action"=>"browse", "task"=>"browse",
562
- "controller"=>"results", "property_order_by"=>"property_type.descr"}
563
- end
564
-
565
- it "unamed upstream - tbd" do
566
- hash_src = {"query_uuid"=>"6386333d-389b-ab5c-8943-6f3a2aa914d7", "region"=>{"ids"=>["#{@field_ko_prefix},227"], "id"=>"230"}}
567
- hash_dst = {"query_uuid"=>"6386333d-389b-ab5c-8943-6f3a2aa914d7", "url_regions"=>[], "region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}, "action"=>"browse", "task"=>"browse", "controller"=>"results", "property_order_by"=>"property_type.descr"}
568
- @dm.deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
569
- hash_dst.should == {"query_uuid" => "6386333d-389b-ab5c-8943-6f3a2aa914d7", "url_regions"=>[],
570
- "region"=>{"ids"=>["227"], "id"=>"230"}, "action"=>"browse", "task"=>"browse",
571
- "controller"=>"results", "property_order_by"=>"property_type.descr"}
572
- end
573
-
574
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
575
- hash_src = {'amenity' => @field_ko_prefix}
576
- hash_dst = {"amenity" => "1"}
577
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
578
- hash_dst.should == {'amenity' => ""}
579
- end
580
-
581
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
582
- hash_src = {'amenity' => [@field_ko_prefix]}
583
- hash_dst = {"amenity" => "1"}
584
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
585
- hash_dst.should == {'amenity' => []}
586
- end
587
-
588
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
589
- hash_src = {'amenity' => @field_ko_prefix}
590
- hash_dst = {"amenity" => ["1"]}
591
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
592
- hash_dst.should == {'amenity' => ""}
593
- end
594
-
595
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
596
- hash_src = {'amenity' => [@field_ko_prefix]}
597
- hash_dst = {"amenity" => ["1"]}
598
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
599
- hash_dst.should == {'amenity' => []}
600
- end
601
-
602
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
603
- hash_src = {'amenity' => [@field_ko_prefix]}
604
- hash_dst = {"amenity" => "1"}
605
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
606
- hash_dst.should == {'amenity' => []}
607
- end
608
-
609
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
610
- hash_src = {'amenity' => [@field_ko_prefix, "2"]}
611
- hash_dst = {'amenity' => ["1", "3", "7+"]}
612
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
613
- hash_dst.should == {'amenity' => ["2"]}
614
- end
615
-
616
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
617
- hash_src = {'amenity' => [@field_ko_prefix, "2"]}
618
- hash_dst = {'amenity' => "5"}
619
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
620
- hash_dst.should == {'amenity' => ['2']}
621
- end
622
-
623
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
624
- hash_src = {'amenity' => @field_ko_prefix}
625
- hash_dst = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
626
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
627
- hash_dst.should == {'amenity' => ""}
628
- end
629
-
630
- it "tests knock out entire dest hash if \"@ko\" is passed for source" do
631
- hash_src = {'amenity' => [@field_ko_prefix]}
632
- hash_dst = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
633
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
634
- hash_dst.should == {'amenity' => []}
635
- end
636
-
637
- it "tests knock out dest array if \"@ko\" is passed for source" do
638
- hash_src = {"region" => {'ids' => @field_ko_prefix}}
639
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"]}}
640
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
641
- hash_dst.should == {'region' => {'ids' => ""}}
642
- end
643
-
644
- it "tests knock out dest array but leave other elements of hash intact" do
645
- hash_src = {"region" => {'ids' => @field_ko_prefix}}
646
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
647
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
648
- hash_dst.should == {'region' => {'ids' => "", 'id'=>'11'}}
649
- end
650
-
651
- it "tests knock out entire tree of dest hash" do
652
- hash_src = {"region" => @field_ko_prefix}
653
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
654
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
655
- hash_dst.should == {'region' => ""}
656
- end
657
-
658
- it "tests knock out entire tree of dest hash - retaining array format" do
659
- hash_src = {"region" => {'ids' => [@field_ko_prefix]}}
660
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
661
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
662
- hash_dst.should == {'region' => {'ids' => [], 'id'=>'11'}}
663
- end
664
-
665
- it "tests knock out entire tree of dest hash & replace with new content" do
666
- hash_src = {"region" => {'ids' => ["2", @field_ko_prefix, "6"]}}
667
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
668
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
669
- hash_dst.should == {'region' => {'ids' => ["2", "6"], 'id'=>'11'}}
670
- end
671
-
672
- it "tests knock out entire tree of dest hash & replace with new content" do
673
- hash_src = {"region" => {'ids' => ["7", @field_ko_prefix, "6"]}}
674
- hash_dst = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
675
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
676
- hash_dst.should == {'region' => {'ids' => ["7", "6"], 'id'=>'11'}}
677
- end
678
-
679
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"1\"} -> merges to {'key' => \"\"}" do
680
- hash_src = {"amenity"=>@field_ko_prefix+":1"}
681
- hash_dst = {"amenity"=>"1"}
682
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
683
- hash_dst.should == {"amenity"=>""}
684
- end
685
-
686
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"2\"} -> merges to {'key' => \"\"}" do
687
- hash_src = {"amenity"=>@field_ko_prefix+":1"}
688
- hash_dst = {"amenity"=>"2"}
689
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
690
- hash_dst.should == {"amenity"=>""}
691
- end
692
-
693
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"1\"} -> merges to {'key' => \"\"}" do
694
- hash_src = {"amenity"=>[@field_ko_prefix+":1"]}
695
- hash_dst = {"amenity"=>"1"}
696
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
697
- hash_dst.should == {"amenity"=>[]}
698
- end
699
-
700
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"1\"} -> merges to {'key' => \"\"}" do
701
- hash_src = {"amenity"=>[@field_ko_prefix+":1"]}
702
- hash_dst = {"amenity"=>["1"]}
703
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
704
- hash_dst.should == {"amenity"=>[]}
705
- end
706
-
707
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"1\"} -> merges to {'key' => \"\"}" do
708
- hash_src = {"amenity"=>@field_ko_prefix+":1"}
709
- hash_dst = {}
710
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
711
- hash_dst.should == {"amenity"=>""}
712
- end
713
-
714
- it "tests Example: src = {'key' => \"@ko:1\"}, dst = {'key' => \"1\"} -> merges to {'key' => \"\"}" do
715
- hash_src = {"amenity"=>@field_ko_prefix+":1"}
716
- hash_dst = {"amenity"=>["1"]}
717
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
718
- hash_dst.should == {"amenity"=>""}
719
- end
720
-
721
197
  it "tests are unmerged hashes passed unmodified w/out :unpack_arrays?" do
722
198
  hash_src = {"amenity"=>{"id"=>["26,27"]}}
723
199
  hash_dst = {}
724
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix})
200
+ @dm.deep_merge!(hash_src, hash_dst)
725
201
  hash_dst.should == {"amenity"=>{"id"=>["26,27"]}}
726
202
  end
727
203
 
728
- it "tests hash should be merged" do
729
- hash_src = {"amenity"=>{"id"=>["26,27"]}}
730
- hash_dst = {}
731
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
732
- hash_dst.should == {"amenity"=>{"id"=>["26","27"]}}
733
- end
734
-
735
- it "tests second merge of same values should result in no change in output" do
736
- hash_src = {"amenity"=>{"id"=>["26,27"]}}
737
- hash_dst = {}
738
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
739
- hash_dst.should == {"amenity"=>{"id"=>["26","27"]}}
740
- end
741
-
742
- it "tests hashes with knockout values are suppressed" do
743
- hash_src = {"amenity"=>{"id"=>["#{@field_ko_prefix}:26,#{@field_ko_prefix}:27,28"]}}
744
- hash_dst = {}
745
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
746
- hash_dst.should == {"amenity"=>{"id"=>["28"]}}
747
- end
748
-
749
- it "unamed upstream - tbd" do
750
- hash_src= {'region' =>{'ids'=>[@field_ko_prefix]}, 'query_uuid' => 'zzz'}
751
- hash_dst= {'region' =>{'ids'=>['227','2','3','3']}, 'query_uuid' => 'zzz'}
752
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
753
- hash_dst.should == {'region' =>{'ids'=>[]}, 'query_uuid' => 'zzz'}
754
- end
755
-
756
- it "unamed upstream - tbd" do
757
- hash_src= {'region' =>{'ids'=>[@field_ko_prefix]}, 'query_uuid' => 'zzz'}
758
- hash_dst= {'region' =>{'ids'=>['227','2','3','3'], 'id' => '3'}, 'query_uuid' => 'zzz'}
759
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
760
- hash_dst.should == {'region' =>{'ids'=>[], 'id'=>'3'}, 'query_uuid' => 'zzz'}
761
- end
762
-
763
- it "unamed upstream - tbd" do
764
- hash_src= {'region' =>{'ids'=>[@field_ko_prefix]}, 'query_uuid' => 'zzz'}
765
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
766
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
767
- hash_dst.should == {'region' =>{'muni_city_id' => '2244', 'ids'=>[], 'id'=>'3'}, 'query_uuid' => 'zzz'}
768
- end
769
-
770
- it "unamed upstream - tbd" do
771
- hash_src= {'region' =>{'ids'=>[@field_ko_prefix], 'id' => '5'}, 'query_uuid' => 'zzz'}
772
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
773
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
774
- hash_dst.should == {'region' =>{'muni_city_id' => '2244', 'ids'=>[], 'id'=>'5'}, 'query_uuid' => 'zzz'}
775
- end
776
-
777
- it "unamed upstream - tbd" do
778
- hash_src= {'region' =>{'ids'=>[@field_ko_prefix, '227'], 'id' => '5'}, 'query_uuid' => 'zzz'}
779
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
780
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
781
- hash_dst.should == {'region' =>{'muni_city_id' => '2244', 'ids'=>['227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}
782
- end
783
-
784
- it "unamed upstream - tbd" do
785
- hash_src= {'region' =>{'muni_city_id' => @field_ko_prefix, 'ids'=>@field_ko_prefix, 'id'=>'5'}, 'query_uuid' => 'zzz'}
786
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
787
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
788
- hash_dst.should == {'region' =>{'muni_city_id' => '', 'ids'=>'', 'id'=>'5'}, 'query_uuid' => 'zzz'}
789
- end
790
-
791
- it "unamed upstream - tbd" do
792
- hash_src= {'region' =>{'muni_city_id' => @field_ko_prefix, 'ids'=>[@field_ko_prefix], 'id'=>'5'}, 'query_uuid' => 'zzz'}
793
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
794
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
795
- hash_dst.should == {'region' =>{'muni_city_id' => '', 'ids'=>[], 'id'=>'5'}, 'query_uuid' => 'zzz'}
796
- end
797
-
798
- it "unamed upstream - tbd" do
799
- hash_src= {'region' =>{'muni_city_id' => @field_ko_prefix, 'ids'=>[@field_ko_prefix,'227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}
800
- hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
801
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
802
- hash_dst.should == {'region' =>{'muni_city_id' => '', 'ids'=>['227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}
803
- end
804
-
805
- it "unamed upstream - tbd" do
806
- hash_src = {"muni_city_id"=>@field_ko_prefix, "id"=>""}
807
- hash_dst = {"muni_city_id"=>"", "id"=>""}
808
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
809
- hash_dst.should == {"muni_city_id"=>"", "id"=>""}
810
- end
811
-
812
- it "unamed upstream - tbd" do
813
- hash_src = {"region"=>{"muni_city_id"=>@field_ko_prefix, "id"=>""}}
814
- hash_dst = {"region"=>{"muni_city_id"=>"", "id"=>""}}
815
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
816
- hash_dst.should == {"region"=>{"muni_city_id"=>"", "id"=>""}}
817
- end
818
-
819
- it "unamed upstream - tbd" do
820
- hash_src = {"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>@field_ko_prefix, "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}
821
- hash_dst = {"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>"", "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}
822
- @dm.deep_merge!(hash_src, hash_dst, {:knockout_prefix => @field_ko_prefix, :unpack_arrays => ","})
823
- hash_dst.should == {"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>"", "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}
204
+ it "tests hash of array of hashes" do
205
+ hash_src = {"item" => [{"1" => "3"}, {"2" => "4"}]}
206
+ hash_dst = {"item" => [{"3" => "5"}]}
207
+ @dm.deep_merge!(hash_src, hash_dst)
208
+ hash_dst.should == {"item" => [{"3" => "5"}, {"1" => "3"}, {"2" => "4"}]}
824
209
  end
825
210
 
826
211
  # Additions since import
@@ -878,66 +263,10 @@ describe Chef::Mixin::DeepMerge do
878
263
  @dm.merge(hash_dst, hash_src).should == {"name" => "value"}
879
264
  end
880
265
 
881
- context "when :deep_merge_array_concat is set" do
882
- before do
883
- Chef::Config.stub!(:[]).with(:deep_merge_array_concat).and_return(true)
884
- end
885
-
886
- it "should pick src arrays within hashes" do
887
- hash_dst = {"property" => ["2","4"]}
888
- hash_src = {"property" => ["1","3"]}
889
- @dm.merge(hash_dst, hash_src).should == {"property" => ["1","3"]}
890
- end
891
-
892
- it "should not modify the source or destination during the merge" do
893
- hash_dst = {"property" => ["1","2","3"]}
894
- hash_src = {"property" => ["4","5","6"]}
895
- ret = @dm.merge(hash_dst, hash_src)
896
- hash_dst.should == {"property" => ["1","2","3"]}
897
- hash_src.should == {"property" => ["4","5","6"]}
898
- ret.should == {"property" => ["4","5","6"]}
899
- end
900
-
901
- it "should not knockout matching array value when merging arrays within hashes" do
902
- hash_dst = {"property" => ["2","4"]}
903
- hash_src = {"property" => ["1","!merge:4"]}
904
- hash_src_no_colon = {"property" => ["1","!merge"]}
905
- @dm.merge(hash_dst, hash_src).should == {"property" => ["1", "!merge:4"]}
906
- @dm.merge(hash_dst, hash_src_no_colon).should == {"property" => ["1", "!merge"]}
907
- end
908
- end
909
-
910
- # These tests ensure that deep_merge behavior didn't change when
911
- # the config option disables the array merging during deep merge
912
- # while fixing CHEF-4631.
913
- context "when :deep_merge_array_concat is not set" do
914
- before do
915
- Chef::Config.stub!(:[]).with(:deep_merge_array_concat).and_return(false)
916
- end
917
-
918
- it "should merge arrays within hashes" do
919
- hash_dst = {"property" => ["2","4"]}
920
- hash_src = {"property" => ["1","3"]}
921
- @dm.merge(hash_dst, hash_src).should == {"property" => ["2","4","1","3"]}
922
- end
923
-
924
- it "should not modify the source or destination during the merge" do
925
- hash_dst = {"property" => ["1","2","3"]}
926
- hash_src = {"property" => ["4","5","6"]}
927
- ret = @dm.merge(hash_dst, hash_src)
928
- hash_dst.should == {"property" => ["1","2","3"]}
929
- hash_src.should == {"property" => ["4","5","6"]}
930
- ret.should == {"property" => ["1","2","3","4","5","6"]}
931
- end
932
-
933
- it "should not knockout matching array value when merging arrays within hashes" do
934
- hash_dst = {"property" => ["2","4"]}
935
- hash_src = {"property" => ["1","!merge:4"]}
936
- hash_src_no_colon = {"property" => ["1","!merge"]}
937
- @dm.merge(hash_dst, hash_src).should == {"property" => ["2", "4", "1", "!merge:4"]}
938
- @dm.merge(hash_dst, hash_src_no_colon).should == {"property" => ["2", "4", "1", "!merge"]}
939
- end
940
-
266
+ it "should merge arrays within hashes" do
267
+ hash_dst = {"property" => ["2","4"]}
268
+ hash_src = {"property" => ["1","3"]}
269
+ @dm.merge(hash_dst, hash_src).should == {"property" => ["2","4","1","3"]}
941
270
  end
942
271
 
943
272
  it "should merge deeply nested hashes" do
@@ -946,67 +275,40 @@ describe Chef::Mixin::DeepMerge do
946
275
  @dm.merge(hash_dst, hash_src).should == {"property" => {"values" => {"are" => "stable", "can" => "change", "may" => "rise"}}}
947
276
  end
948
277
 
949
- end
950
-
951
- describe "role_merge" do
952
- it "should knockout matching array value when merging arrays within hashes" do
953
- hash_dst = {"property" => ["2","4"]}
954
- hash_src = {"property" => ["1","!merge:4"]}
955
- @dm.role_merge(hash_dst, hash_src).should == {"property" => ["2","1"]}
956
- end
957
-
958
- it "should knockout all array values when merging arrays within hashes, leaving 2" do
959
- hash_dst = {"property" => ["2","4"]}
960
- hash_src = {"property" => ["!merge:","1","2"]}
961
- hash_src_no_colon = {"property" => ["!merge","1","2"]}
962
- @dm.role_merge(hash_dst, hash_src).should == {"property" => ["1","2"]}
963
- @dm.role_merge(hash_dst, hash_src_no_colon).should == {"property" => ["1","2"]}
964
- end
965
-
966
- it "should knockout all array values when merging arrays within hashes, leaving 0" do
967
- hash_dst = {"property" => ["2","4"]}
968
- hash_src = {"property" => ["!merge:"]}
969
- hash_src_no_colon = {"property" => ["!merge"]}
970
- @dm.role_merge(hash_dst, hash_src).should == {"property" => []}
971
- @dm.role_merge(hash_dst, hash_src_no_colon).should == {"property" => []}
972
- end
973
-
974
- it "should knockout matching array value when merging arrays within hashes" do
975
- hash_dst = {"property" => ["2","4"]}
976
- hash_src = {"property" => ["1","!merge:4"]}
977
- @dm.role_merge(hash_dst, hash_src).should == {"property" => ["2","1"]}
278
+ it "should not modify the source or destination during the merge" do
279
+ hash_dst = {"property" => ["1","2","3"]}
280
+ hash_src = {"property" => ["4","5","6"]}
281
+ ret = @dm.merge(hash_dst, hash_src)
282
+ hash_dst.should == {"property" => ["1","2","3"]}
283
+ hash_src.should == {"property" => ["4","5","6"]}
284
+ ret.should == {"property" => ["1","2","3","4","5","6"]}
978
285
  end
979
286
 
980
- it "should concat arrays" do
981
- hash_dst = {"property" => ["2","4"]}
982
- hash_src = {"property" => ["1","4"]}
983
- @dm.role_merge(hash_dst, hash_src).should == {"property" => ["2","4", "1","4"]}
984
- end
985
287
  end
986
288
 
987
- describe "horizontal_merge" do
988
- it "should concat arrays" do
289
+ describe "role_merge" do
290
+ it "errors out if knockout merge use is detected in an array" do
989
291
  hash_dst = {"property" => ["2","4"]}
990
- hash_src = {"property" => ["1","3"]}
991
- @dm.horizontal_merge(hash_dst, hash_src).should == {"property" => ["2","4", "1","3"]}
292
+ hash_src = {"property" => ["1","!merge:4"]}
293
+ lambda {@dm.role_merge(hash_dst, hash_src)}.should raise_error(Chef::Mixin::DeepMerge::InvalidSubtractiveMerge)
992
294
  end
993
295
 
994
- it "should concat arrays without removing same elements" do
995
- hash_dst = {"property" => ["2","4"]}
996
- hash_src = {"property" => ["1","2"]}
997
- @dm.horizontal_merge(hash_dst, hash_src).should == {"property" => ["2","4", "1","2"]}
296
+ it "errors out if knockout merge use is detected in an array (reversed merge order)" do
297
+ hash_dst = {"property" => ["1","!merge:4"]}
298
+ hash_src = {"property" => ["2","4"]}
299
+ lambda {@dm.role_merge(hash_dst, hash_src)}.should raise_error(Chef::Mixin::DeepMerge::InvalidSubtractiveMerge)
998
300
  end
999
301
 
1000
- it "should be able to merge array values with an empty hash as source" do
302
+ it "errors out if knockout merge use is detected in a string" do
1001
303
  hash_dst = {"property" => ["2","4"]}
1002
- hash_src = {}
1003
- @dm.horizontal_merge(hash_dst, hash_src).should == {"property" => ["2","4"]}
304
+ hash_src = {"property" => "!merge"}
305
+ lambda {@dm.role_merge(hash_dst, hash_src)}.should raise_error(Chef::Mixin::DeepMerge::InvalidSubtractiveMerge)
1004
306
  end
1005
307
 
1006
- it "should be able to merge array values with an empty hash as dest" do
1007
- hash_dst = {}
1008
- hash_src = {"property" => ["2","4"]}
1009
- @dm.horizontal_merge(hash_dst, hash_src).should == {"property" => ["2","4"]}
308
+ it "errors out if knockout merge use is detected in a string (reversed merge order)" do
309
+ hash_dst = {"property" => "!merge"}
310
+ hash_src= {"property" => ["2","4"]}
311
+ lambda {@dm.role_merge(hash_dst, hash_src)}.should raise_error(Chef::Mixin::DeepMerge::InvalidSubtractiveMerge)
1010
312
  end
1011
313
  end
1012
314
  end