chef-cli 1.0.3

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 (372) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +32 -0
  3. data/LICENSE +201 -0
  4. data/Rakefile +70 -0
  5. data/bin/chef +25 -0
  6. data/chef-cli.gemspec +53 -0
  7. data/lib/chef-cli.rb +19 -0
  8. data/lib/chef-cli/authenticated_http.rb +22 -0
  9. data/lib/chef-cli/builtin_commands.rb +62 -0
  10. data/lib/chef-cli/chef_runner.rb +114 -0
  11. data/lib/chef-cli/chef_server_api_multi.rb +73 -0
  12. data/lib/chef-cli/cli.rb +206 -0
  13. data/lib/chef-cli/command/base.rb +89 -0
  14. data/lib/chef-cli/command/clean_policy_cookbooks.rb +115 -0
  15. data/lib/chef-cli/command/clean_policy_revisions.rb +112 -0
  16. data/lib/chef-cli/command/delete_policy.rb +121 -0
  17. data/lib/chef-cli/command/delete_policy_group.rb +121 -0
  18. data/lib/chef-cli/command/describe_cookbook.rb +98 -0
  19. data/lib/chef-cli/command/diff.rb +316 -0
  20. data/lib/chef-cli/command/env.rb +99 -0
  21. data/lib/chef-cli/command/exec.rb +45 -0
  22. data/lib/chef-cli/command/export.rb +156 -0
  23. data/lib/chef-cli/command/gem.rb +48 -0
  24. data/lib/chef-cli/command/generate.rb +123 -0
  25. data/lib/chef-cli/command/generator_commands.rb +83 -0
  26. data/lib/chef-cli/command/generator_commands/attribute.rb +37 -0
  27. data/lib/chef-cli/command/generator_commands/base.rb +157 -0
  28. data/lib/chef-cli/command/generator_commands/build_cookbook.rb +126 -0
  29. data/lib/chef-cli/command/generator_commands/chef_exts/generator_desc_resource.rb +40 -0
  30. data/lib/chef-cli/command/generator_commands/chef_exts/quieter_doc_formatter.rb +38 -0
  31. data/lib/chef-cli/command/generator_commands/chef_exts/recipe_dsl_ext.rb +39 -0
  32. data/lib/chef-cli/command/generator_commands/cookbook.rb +251 -0
  33. data/lib/chef-cli/command/generator_commands/cookbook_code_file.rb +100 -0
  34. data/lib/chef-cli/command/generator_commands/cookbook_file.rb +46 -0
  35. data/lib/chef-cli/command/generator_commands/generator_generator.rb +175 -0
  36. data/lib/chef-cli/command/generator_commands/helpers.rb +37 -0
  37. data/lib/chef-cli/command/generator_commands/policyfile.rb +125 -0
  38. data/lib/chef-cli/command/generator_commands/recipe.rb +37 -0
  39. data/lib/chef-cli/command/generator_commands/repo.rb +140 -0
  40. data/lib/chef-cli/command/generator_commands/resource.rb +37 -0
  41. data/lib/chef-cli/command/generator_commands/template.rb +47 -0
  42. data/lib/chef-cli/command/install.rb +121 -0
  43. data/lib/chef-cli/command/provision.rb +38 -0
  44. data/lib/chef-cli/command/push.rb +118 -0
  45. data/lib/chef-cli/command/push_archive.rb +126 -0
  46. data/lib/chef-cli/command/shell_init.rb +185 -0
  47. data/lib/chef-cli/command/show_policy.rb +164 -0
  48. data/lib/chef-cli/command/undelete.rb +155 -0
  49. data/lib/chef-cli/command/update.rb +140 -0
  50. data/lib/chef-cli/command/verify.rb +548 -0
  51. data/lib/chef-cli/commands_map.rb +113 -0
  52. data/lib/chef-cli/completions/bash.sh.erb +5 -0
  53. data/lib/chef-cli/completions/chef.fish.erb +10 -0
  54. data/lib/chef-cli/completions/zsh.zsh.erb +21 -0
  55. data/lib/chef-cli/component_test.rb +226 -0
  56. data/lib/chef-cli/configurable.rb +88 -0
  57. data/lib/chef-cli/cookbook_metadata.rb +45 -0
  58. data/lib/chef-cli/cookbook_omnifetch.rb +32 -0
  59. data/lib/chef-cli/cookbook_profiler/git.rb +152 -0
  60. data/lib/chef-cli/cookbook_profiler/identifiers.rb +72 -0
  61. data/lib/chef-cli/cookbook_profiler/null_scm.rb +31 -0
  62. data/lib/chef-cli/dist.rb +31 -0
  63. data/lib/chef-cli/exceptions.rb +153 -0
  64. data/lib/chef-cli/generator.rb +165 -0
  65. data/lib/chef-cli/helpers.rb +170 -0
  66. data/lib/chef-cli/pager.rb +104 -0
  67. data/lib/chef-cli/policyfile/artifactory_cookbook_source.rb +102 -0
  68. data/lib/chef-cli/policyfile/attribute_merge_checker.rb +110 -0
  69. data/lib/chef-cli/policyfile/chef_repo_cookbook_source.rb +138 -0
  70. data/lib/chef-cli/policyfile/chef_server_cookbook_source.rb +99 -0
  71. data/lib/chef-cli/policyfile/chef_server_lock_fetcher.rb +167 -0
  72. data/lib/chef-cli/policyfile/community_cookbook_source.rb +95 -0
  73. data/lib/chef-cli/policyfile/comparison_base.rb +123 -0
  74. data/lib/chef-cli/policyfile/cookbook_location_specification.rb +154 -0
  75. data/lib/chef-cli/policyfile/cookbook_locks.rb +466 -0
  76. data/lib/chef-cli/policyfile/cookbook_sources.rb +23 -0
  77. data/lib/chef-cli/policyfile/delivery_supermarket_source.rb +89 -0
  78. data/lib/chef-cli/policyfile/differ.rb +263 -0
  79. data/lib/chef-cli/policyfile/dsl.rb +288 -0
  80. data/lib/chef-cli/policyfile/git_lock_fetcher.rb +265 -0
  81. data/lib/chef-cli/policyfile/included_policies_cookbook_source.rb +156 -0
  82. data/lib/chef-cli/policyfile/lister.rb +229 -0
  83. data/lib/chef-cli/policyfile/local_lock_fetcher.rb +132 -0
  84. data/lib/chef-cli/policyfile/lock_applier.rb +80 -0
  85. data/lib/chef-cli/policyfile/lock_fetcher_mixin.rb +37 -0
  86. data/lib/chef-cli/policyfile/null_cookbook_source.rb +49 -0
  87. data/lib/chef-cli/policyfile/policyfile_location_specification.rb +128 -0
  88. data/lib/chef-cli/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -0
  89. data/lib/chef-cli/policyfile/remote_lock_fetcher.rb +108 -0
  90. data/lib/chef-cli/policyfile/reports/install.rb +69 -0
  91. data/lib/chef-cli/policyfile/reports/table_printer.rb +57 -0
  92. data/lib/chef-cli/policyfile/reports/upload.rb +70 -0
  93. data/lib/chef-cli/policyfile/solution_dependencies.rb +311 -0
  94. data/lib/chef-cli/policyfile/source_uri.rb +57 -0
  95. data/lib/chef-cli/policyfile/storage_config.rb +112 -0
  96. data/lib/chef-cli/policyfile/undo_record.rb +139 -0
  97. data/lib/chef-cli/policyfile/undo_stack.rb +128 -0
  98. data/lib/chef-cli/policyfile/uploader.rb +222 -0
  99. data/lib/chef-cli/policyfile_compiler.rb +528 -0
  100. data/lib/chef-cli/policyfile_lock.rb +581 -0
  101. data/lib/chef-cli/policyfile_services/clean_policies.rb +95 -0
  102. data/lib/chef-cli/policyfile_services/clean_policy_cookbooks.rb +123 -0
  103. data/lib/chef-cli/policyfile_services/export_repo.rb +419 -0
  104. data/lib/chef-cli/policyfile_services/install.rb +167 -0
  105. data/lib/chef-cli/policyfile_services/push.rb +112 -0
  106. data/lib/chef-cli/policyfile_services/push_archive.rb +164 -0
  107. data/lib/chef-cli/policyfile_services/rm_policy.rb +141 -0
  108. data/lib/chef-cli/policyfile_services/rm_policy_group.rb +85 -0
  109. data/lib/chef-cli/policyfile_services/show_policy.rb +234 -0
  110. data/lib/chef-cli/policyfile_services/undelete.rb +108 -0
  111. data/lib/chef-cli/policyfile_services/update_attributes.rb +110 -0
  112. data/lib/chef-cli/service_exception_inspectors.rb +24 -0
  113. data/lib/chef-cli/service_exception_inspectors/base.rb +39 -0
  114. data/lib/chef-cli/service_exception_inspectors/http.rb +119 -0
  115. data/lib/chef-cli/service_exceptions.rb +142 -0
  116. data/lib/chef-cli/shell_out.rb +36 -0
  117. data/lib/chef-cli/skeletons/code_generator/files/default/Berksfile +3 -0
  118. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/README.md +146 -0
  119. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/kitchen.yml +21 -0
  120. data/lib/chef-cli/skeletons/code_generator/files/default/build_cookbook/test-fixture-recipe.rb +8 -0
  121. data/lib/chef-cli/skeletons/code_generator/files/default/chefignore +110 -0
  122. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -0
  123. data/lib/chef-cli/skeletons/code_generator/files/default/cookbook_readmes/README.md +66 -0
  124. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-config.json +17 -0
  125. data/lib/chef-cli/skeletons/code_generator/files/default/delivery-project.toml +34 -0
  126. data/lib/chef-cli/skeletons/code_generator/files/default/gitignore +22 -0
  127. data/lib/chef-cli/skeletons/code_generator/files/default/repo/README.md +20 -0
  128. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
  129. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -0
  130. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +6 -0
  131. data/lib/chef-cli/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -0
  132. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/README.md +56 -0
  133. data/lib/chef-cli/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +4 -0
  134. data/lib/chef-cli/skeletons/code_generator/files/default/repo/dot-chef-repo.txt +6 -0
  135. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/README.md +9 -0
  136. data/lib/chef-cli/skeletons/code_generator/files/default/repo/environments/example.json +13 -0
  137. data/lib/chef-cli/skeletons/code_generator/files/default/repo/policyfiles/README.md +24 -0
  138. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/README.md +9 -0
  139. data/lib/chef-cli/skeletons/code_generator/files/default/repo/roles/example.json +13 -0
  140. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper.rb +2 -0
  141. data/lib/chef-cli/skeletons/code_generator/files/default/spec_helper_policyfile.rb +2 -0
  142. data/lib/chef-cli/skeletons/code_generator/metadata.rb +8 -0
  143. data/lib/chef-cli/skeletons/code_generator/recipes/attribute.rb +11 -0
  144. data/lib/chef-cli/skeletons/code_generator/recipes/build_cookbook.rb +175 -0
  145. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook.rb +167 -0
  146. data/lib/chef-cli/skeletons/code_generator/recipes/cookbook_file.rb +23 -0
  147. data/lib/chef-cli/skeletons/code_generator/recipes/helpers.rb +19 -0
  148. data/lib/chef-cli/skeletons/code_generator/recipes/policyfile.rb +7 -0
  149. data/lib/chef-cli/skeletons/code_generator/recipes/recipe.rb +50 -0
  150. data/lib/chef-cli/skeletons/code_generator/recipes/repo.rb +71 -0
  151. data/lib/chef-cli/skeletons/code_generator/recipes/resource.rb +12 -0
  152. data/lib/chef-cli/skeletons/code_generator/recipes/template.rb +31 -0
  153. data/lib/chef-cli/skeletons/code_generator/templates/default/CHANGELOG.md.erb +11 -0
  154. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -0
  155. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.apachev2.erb +201 -0
  156. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -0
  157. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -0
  158. data/lib/chef-cli/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -0
  159. data/lib/chef-cli/skeletons/code_generator/templates/default/Policyfile.rb.erb +25 -0
  160. data/lib/chef-cli/skeletons/code_generator/templates/default/README.md.erb +4 -0
  161. data/lib/chef-cli/skeletons/code_generator/templates/default/attribute.rb.erb +0 -0
  162. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/Berksfile.erb +7 -0
  163. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/metadata.rb.erb +10 -0
  164. data/lib/chef-cli/skeletons/code_generator/templates/default/build_cookbook/recipe.rb.erb +9 -0
  165. data/lib/chef-cli/skeletons/code_generator/templates/default/cookbook_file.erb +0 -0
  166. data/lib/chef-cli/skeletons/code_generator/templates/default/helpers.rb.erb +39 -0
  167. data/lib/chef-cli/skeletons/code_generator/templates/default/inspec_default_test.rb.erb +16 -0
  168. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen.yml.erb +38 -0
  169. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_dokken.yml.erb +36 -0
  170. data/lib/chef-cli/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +32 -0
  171. data/lib/chef-cli/skeletons/code_generator/templates/default/metadata.rb.erb +20 -0
  172. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe.rb.erb +5 -0
  173. data/lib/chef-cli/skeletons/code_generator/templates/default/recipe_spec.rb.erb +29 -0
  174. data/lib/chef-cli/skeletons/code_generator/templates/default/repo/gitignore.erb +128 -0
  175. data/lib/chef-cli/skeletons/code_generator/templates/default/resource.rb.erb +1 -0
  176. data/lib/chef-cli/skeletons/code_generator/templates/default/template.erb +0 -0
  177. data/lib/chef-cli/ui.rb +57 -0
  178. data/lib/chef-cli/version.rb +20 -0
  179. data/lib/kitchen/provisioner/policyfile_zero.rb +195 -0
  180. data/spec/shared/a_file_generator.rb +125 -0
  181. data/spec/shared/a_generated_file.rb +12 -0
  182. data/spec/shared/command_with_ui_object.rb +11 -0
  183. data/spec/shared/custom_generator_cookbook.rb +136 -0
  184. data/spec/shared/fixture_cookbook_checksums.rb +46 -0
  185. data/spec/shared/setup_git_committer_config.rb +54 -0
  186. data/spec/shared/setup_git_cookbooks.rb +53 -0
  187. data/spec/spec_helper.rb +51 -0
  188. data/spec/test_helpers.rb +84 -0
  189. data/spec/unit/chef_runner_spec.rb +139 -0
  190. data/spec/unit/chef_server_api_multi_spec.rb +120 -0
  191. data/spec/unit/cli_spec.rb +375 -0
  192. data/spec/unit/command/base_spec.rb +195 -0
  193. data/spec/unit/command/clean_policy_cookbooks_spec.rb +180 -0
  194. data/spec/unit/command/clean_policy_revisions_spec.rb +180 -0
  195. data/spec/unit/command/delete_policy_group_spec.rb +206 -0
  196. data/spec/unit/command/delete_policy_spec.rb +206 -0
  197. data/spec/unit/command/diff_spec.rb +311 -0
  198. data/spec/unit/command/env_spec.rb +86 -0
  199. data/spec/unit/command/exec_spec.rb +178 -0
  200. data/spec/unit/command/export_spec.rb +199 -0
  201. data/spec/unit/command/generate_spec.rb +142 -0
  202. data/spec/unit/command/generator_commands/attribute_spec.rb +31 -0
  203. data/spec/unit/command/generator_commands/base_spec.rb +180 -0
  204. data/spec/unit/command/generator_commands/build_cookbook_spec.rb +377 -0
  205. data/spec/unit/command/generator_commands/chef_exts/generator_desc_resource_spec.rb +77 -0
  206. data/spec/unit/command/generator_commands/chef_exts/recipe_dsl_ext_spec.rb +111 -0
  207. data/spec/unit/command/generator_commands/cookbook_file_spec.rb +31 -0
  208. data/spec/unit/command/generator_commands/cookbook_spec.rb +769 -0
  209. data/spec/unit/command/generator_commands/generator_generator_spec.rb +227 -0
  210. data/spec/unit/command/generator_commands/helpers_spec.rb +31 -0
  211. data/spec/unit/command/generator_commands/policyfile_spec.rb +223 -0
  212. data/spec/unit/command/generator_commands/recipe_spec.rb +37 -0
  213. data/spec/unit/command/generator_commands/repo_spec.rb +374 -0
  214. data/spec/unit/command/generator_commands/resource_spec.rb +31 -0
  215. data/spec/unit/command/generator_commands/template_spec.rb +31 -0
  216. data/spec/unit/command/install_spec.rb +179 -0
  217. data/spec/unit/command/push_archive_spec.rb +153 -0
  218. data/spec/unit/command/push_spec.rb +198 -0
  219. data/spec/unit/command/shell_init_spec.rb +339 -0
  220. data/spec/unit/command/show_policy_spec.rb +234 -0
  221. data/spec/unit/command/undelete_spec.rb +244 -0
  222. data/spec/unit/command/update_spec.rb +283 -0
  223. data/spec/unit/command/verify_spec.rb +341 -0
  224. data/spec/unit/commands_map_spec.rb +57 -0
  225. data/spec/unit/component_test_spec.rb +128 -0
  226. data/spec/unit/configurable_spec.rb +68 -0
  227. data/spec/unit/cookbook_metadata_spec.rb +96 -0
  228. data/spec/unit/cookbook_profiler/git_spec.rb +176 -0
  229. data/spec/unit/cookbook_profiler/identifiers_spec.rb +81 -0
  230. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -0
  231. data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -0
  232. data/spec/unit/fixtures/command/cli_test_command.rb +26 -0
  233. data/spec/unit/fixtures/command/explicit_path_example.rb +7 -0
  234. data/spec/unit/fixtures/configurable/test_config_loader.rb +5 -0
  235. data/spec/unit/fixtures/configurable/test_configurable.rb +10 -0
  236. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  237. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -0
  238. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  239. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -0
  240. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  241. data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  242. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -0
  243. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -0
  244. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -0
  245. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -0
  246. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -0
  247. data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -0
  248. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -0
  249. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -0
  250. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -0
  251. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/kitchen.yml +16 -0
  252. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -0
  253. data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -0
  254. data/spec/unit/fixtures/cookbooks_api/chef_server_universe.json +56 -0
  255. data/spec/unit/fixtures/cookbooks_api/pruned_chef_server_universe.json +30 -0
  256. data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1322 -0
  257. data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -0
  258. data/spec/unit/fixtures/cookbooks_api/universe.json +1 -0
  259. data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +33 -0
  260. data/spec/unit/fixtures/dev_cookbooks/README.md +16 -0
  261. data/spec/unit/fixtures/dev_cookbooks/bar-cookbook.gitbundle +0 -0
  262. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/bin/.keep +0 -0
  263. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/.keep +0 -0
  264. data/spec/unit/fixtures/eg_omnibus_dir/missing_apps/embedded/bin/.keep +0 -0
  265. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/bin/.keep +0 -0
  266. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/berkshelf/.keep +0 -0
  267. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/apps/test-kitchen/.keep +0 -0
  268. data/spec/unit/fixtures/eg_omnibus_dir/missing_component/embedded/bin/.keep +0 -0
  269. data/spec/unit/fixtures/eg_omnibus_dir/valid/bin/.keep +0 -0
  270. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -0
  271. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -0
  272. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef-dk/.keep +0 -0
  273. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -0
  274. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -0
  275. data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/bin/.keep +0 -0
  276. data/spec/unit/fixtures/example_app/Policyfile.rb +0 -0
  277. data/spec/unit/fixtures/example_cookbook/.gitignore +17 -0
  278. data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -0
  279. data/spec/unit/fixtures/example_cookbook/Berksfile +3 -0
  280. data/spec/unit/fixtures/example_cookbook/README.md +4 -0
  281. data/spec/unit/fixtures/example_cookbook/chefignore +96 -0
  282. data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -0
  283. data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -0
  284. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -0
  285. data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -0
  286. data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -0
  287. data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -0
  288. data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -0
  289. data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -0
  290. data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -0
  291. data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -0
  292. data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -0
  293. data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -0
  294. data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -0
  295. data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -0
  296. data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -0
  297. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -0
  298. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -0
  299. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -0
  300. data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -0
  301. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -0
  302. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -0
  303. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -0
  304. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -0
  305. data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -0
  306. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -0
  307. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -0
  308. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -0
  309. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -0
  310. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/extra/extra_file.txt +0 -0
  311. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -0
  312. data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -0
  313. data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -0
  314. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -0
  315. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -0
  316. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -0
  317. data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -0
  318. data/spec/unit/generator_spec.rb +119 -0
  319. data/spec/unit/pager_spec.rb +117 -0
  320. data/spec/unit/policyfile/artifactory_cookbook_source_spec.rb +59 -0
  321. data/spec/unit/policyfile/attribute_merge_checker_spec.rb +80 -0
  322. data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +93 -0
  323. data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +55 -0
  324. data/spec/unit/policyfile/chef_server_lock_fetcher_spec.rb +161 -0
  325. data/spec/unit/policyfile/community_cookbook_source_spec.rb +83 -0
  326. data/spec/unit/policyfile/comparison_base_spec.rb +340 -0
  327. data/spec/unit/policyfile/cookbook_location_specification_spec.rb +347 -0
  328. data/spec/unit/policyfile/cookbook_locks_spec.rb +527 -0
  329. data/spec/unit/policyfile/delivery_supermarket_source_spec.rb +129 -0
  330. data/spec/unit/policyfile/differ_spec.rb +686 -0
  331. data/spec/unit/policyfile/git_lock_fetcher_spec.rb +155 -0
  332. data/spec/unit/policyfile/included_policies_cookbook_source_spec.rb +242 -0
  333. data/spec/unit/policyfile/lister_spec.rb +268 -0
  334. data/spec/unit/policyfile/local_lock_fetcher_spec.rb +199 -0
  335. data/spec/unit/policyfile/lock_applier_spec.rb +100 -0
  336. data/spec/unit/policyfile/lock_fetcher_mixin_spec.rb +60 -0
  337. data/spec/unit/policyfile/null_cookbook_source_spec.rb +34 -0
  338. data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -0
  339. data/spec/unit/policyfile/remote_lock_fetcher_spec.rb +129 -0
  340. data/spec/unit/policyfile/reports/install_spec.rb +114 -0
  341. data/spec/unit/policyfile/reports/upload_spec.rb +94 -0
  342. data/spec/unit/policyfile/solution_dependencies_spec.rb +170 -0
  343. data/spec/unit/policyfile/source_uri_spec.rb +36 -0
  344. data/spec/unit/policyfile/storage_config_spec.rb +180 -0
  345. data/spec/unit/policyfile/undo_record_spec.rb +258 -0
  346. data/spec/unit/policyfile/undo_stack_spec.rb +265 -0
  347. data/spec/unit/policyfile/uploader_spec.rb +410 -0
  348. data/spec/unit/policyfile_demands_spec.rb +1197 -0
  349. data/spec/unit/policyfile_evaluation_spec.rb +628 -0
  350. data/spec/unit/policyfile_includes_dsl_spec.rb +220 -0
  351. data/spec/unit/policyfile_includes_spec.rb +720 -0
  352. data/spec/unit/policyfile_install_with_includes_spec.rb +232 -0
  353. data/spec/unit/policyfile_lock_build_spec.rb +1065 -0
  354. data/spec/unit/policyfile_lock_install_spec.rb +137 -0
  355. data/spec/unit/policyfile_lock_serialization_spec.rb +424 -0
  356. data/spec/unit/policyfile_lock_validation_spec.rb +608 -0
  357. data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -0
  358. data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +272 -0
  359. data/spec/unit/policyfile_services/export_repo_spec.rb +473 -0
  360. data/spec/unit/policyfile_services/install_spec.rb +209 -0
  361. data/spec/unit/policyfile_services/push_archive_spec.rb +359 -0
  362. data/spec/unit/policyfile_services/push_spec.rb +249 -0
  363. data/spec/unit/policyfile_services/rm_policy_group_spec.rb +237 -0
  364. data/spec/unit/policyfile_services/rm_policy_spec.rb +263 -0
  365. data/spec/unit/policyfile_services/show_policy_spec.rb +887 -0
  366. data/spec/unit/policyfile_services/undelete_spec.rb +302 -0
  367. data/spec/unit/policyfile_services/update_attributes_spec.rb +229 -0
  368. data/spec/unit/policyfile_services/update_spec.rb +162 -0
  369. data/spec/unit/service_exception_inspectors/base_spec.rb +41 -0
  370. data/spec/unit/service_exception_inspectors/http_spec.rb +138 -0
  371. data/spec/unit/shell_out_spec.rb +34 -0
  372. metadata +796 -0
@@ -0,0 +1,339 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2014-2018, Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "spec_helper"
19
+ require "chef-cli/command/shell_init"
20
+
21
+ describe ChefCLI::Command::ShellInit do
22
+
23
+ let(:expected_path) { [omnibus_bin_dir, user_bin_dir, omnibus_embedded_bin_dir, ENV["PATH"], git_bin_dir].join(File::PATH_SEPARATOR) }
24
+ let(:stdout_io) { StringIO.new }
25
+ let(:stderr_io) { StringIO.new }
26
+
27
+ let(:command_instance) do
28
+ ChefCLI::Command::ShellInit.new.tap do |c|
29
+ allow(c).to receive(:stdout).and_return(stdout_io)
30
+ allow(c).to receive(:stderr).and_return(stderr_io)
31
+ end
32
+ end
33
+
34
+ shared_context "shell init script" do |shell|
35
+ let(:user_bin_dir) { File.expand_path(File.join(Gem.user_dir, "bin")) }
36
+ let(:expected_gem_root) { Gem.default_dir.to_s }
37
+ let(:expected_gem_home) { Gem.user_dir }
38
+ let(:expected_gem_path) { Gem.path.join(File::PATH_SEPARATOR) }
39
+
40
+ before do
41
+ allow(::Dir).to receive(:exist?).and_call_original
42
+ end
43
+
44
+ context "with no explicit omnibus directory" do
45
+
46
+ let(:omnibus_bin_dir) { "/foo/bin" }
47
+ let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
48
+ let(:git_bin_dir) { "/foo/gitbin" }
49
+ let(:argv) { [shell] }
50
+
51
+ before do
52
+ allow(command_instance).to receive(:omnibus_embedded_bin_dir).and_return(omnibus_embedded_bin_dir)
53
+ allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
54
+ allow(command_instance).to receive(:git_bin_dir).and_return(git_bin_dir)
55
+ allow(::Dir).to receive(:exist?).with(git_bin_dir).and_return(true)
56
+ end
57
+
58
+ it "emits a script to add ChefCLI's ruby to the shell environment" do
59
+ command_instance.run(argv)
60
+ expect(stdout_io.string).to include(expected_environment_commands)
61
+ end
62
+
63
+ it "does not emit any empty lines", if: %w{powershell posh}.include?(shell) do
64
+ command_instance.run(argv)
65
+ stdout_io.string.each_line do |s|
66
+ expect(s.strip).not_to be_empty
67
+ end
68
+ end
69
+ end
70
+
71
+ context "with an explicit omnibus directory as an argument" do
72
+
73
+ let(:omnibus_root) { File.join(fixtures_path, "eg_omnibus_dir/valid/") }
74
+ let(:omnibus_bin_dir) { File.join(omnibus_root, "bin") }
75
+ let(:omnibus_embedded_bin_dir) { File.join(omnibus_root, "embedded/bin") }
76
+ let(:git_bin_dir) { File.join(omnibus_root, "gitbin") }
77
+
78
+ let(:argv) { [shell, "--omnibus-dir", omnibus_root] }
79
+
80
+ before do
81
+ allow(::Dir).to receive(:exist?).with(git_bin_dir).and_return(true)
82
+ end
83
+
84
+ it "emits a script to add the package's ruby to the shell environment" do
85
+ command_instance.run(argv)
86
+ expect(stdout_io.string).to include(expected_environment_commands)
87
+ end
88
+
89
+ it "does not emit any empty lines", if: %w{powershell posh}.include?(shell) do
90
+ command_instance.run(argv)
91
+ stdout_io.string.each_line do |s|
92
+ expect(s.strip).not_to be_empty
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ shared_examples "a posix shell script" do |shell|
99
+ before do
100
+ stub_const("File::PATH_SEPARATOR", ":")
101
+ end
102
+
103
+ let(:expected_environment_commands) do
104
+ <<~EOH
105
+ export PATH="#{expected_path}"
106
+ export GEM_ROOT="#{expected_gem_root}"
107
+ export GEM_HOME="#{expected_gem_home}"
108
+ export GEM_PATH="#{expected_gem_path}"
109
+ EOH
110
+ end
111
+ include_context "shell init script", shell
112
+ end
113
+
114
+ shared_examples "a powershell script" do |shell|
115
+ before do
116
+ stub_const("File::PATH_SEPARATOR", ";")
117
+ end
118
+
119
+ let(:expected_environment_commands) do
120
+ <<~EOH
121
+ $env:PATH="#{expected_path}"
122
+ $env:GEM_ROOT="#{expected_gem_root}"
123
+ $env:GEM_HOME="#{expected_gem_home}"
124
+ $env:GEM_PATH="#{expected_gem_path}"
125
+ EOH
126
+ end
127
+ include_context "shell init script", shell
128
+ end
129
+
130
+ context "for sh" do
131
+ it_behaves_like "a posix shell script", "sh"
132
+ end
133
+
134
+ context "for bash" do
135
+ it_behaves_like "a posix shell script", "bash"
136
+
137
+ describe "generating auto-complete" do
138
+
139
+ let(:command_descriptions) do
140
+ {
141
+ "exec" => "Runs the command in context of the embedded ruby",
142
+ "env" => "Prints environment variables used by #{ChefCLI::Dist::PRODUCT}",
143
+ "gem" => "Runs the `gem` command in context of the embedded ruby",
144
+ "generate" => "Generate a new app, cookbook, or component",
145
+ }
146
+ end
147
+
148
+ let(:omnibus_bin_dir) { "/foo/bin" }
149
+ let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
150
+
151
+ let(:argv) { [ "bash" ] }
152
+
153
+ let(:expected_completion_function) do
154
+ <<~END_COMPLETION
155
+ _chef_comp() {
156
+ local COMMANDS="exec env gem generate"
157
+ COMPREPLY=($(compgen -W "$COMMANDS" -- ${COMP_WORDS[COMP_CWORD]} ))
158
+ }
159
+ complete -F _chef_comp chef
160
+ END_COMPLETION
161
+ end
162
+
163
+ before do
164
+ # Stub this or else we'd have to update the test every time a new command
165
+ # is added.
166
+ allow(command_instance.shell_completion_template_context).to receive(:commands)
167
+ .and_return(command_descriptions)
168
+
169
+ allow(command_instance).to receive(:omnibus_embedded_bin_dir).and_return(omnibus_embedded_bin_dir)
170
+ allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
171
+ end
172
+
173
+ it "generates a completion function for the chef command" do
174
+ command_instance.run(argv)
175
+ expect(stdout_io.string).to include(expected_completion_function)
176
+ end
177
+
178
+ end
179
+ end
180
+
181
+ context "for zsh" do
182
+
183
+ it_behaves_like "a posix shell script", "zsh"
184
+
185
+ describe "generating auto-complete" do
186
+
187
+ let(:command_descriptions) do
188
+ {
189
+ "exec" => "Runs the command in context of the embedded ruby",
190
+ "env" => "Prints environment variables used by #{ChefCLI::Dist::PRODUCT}",
191
+ "gem" => "Runs the `gem` command in context of the embedded ruby",
192
+ "generate" => "Generate a new app, cookbook, or component",
193
+ }
194
+ end
195
+
196
+ let(:omnibus_bin_dir) { "/foo/bin" }
197
+ let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
198
+
199
+ let(:argv) { [ "zsh" ] }
200
+
201
+ let(:expected_completion_function) do
202
+ <<~END_COMPLETION
203
+ function _chef() {
204
+
205
+ local -a _1st_arguments
206
+ _1st_arguments=(
207
+ 'exec:Runs the command in context of the embedded ruby'
208
+ 'env:Prints environment variables used by #{ChefCLI::Dist::PRODUCT}'
209
+ 'gem:Runs the `gem` command in context of the embedded ruby'
210
+ 'generate:Generate a new app, cookbook, or component'
211
+ )
212
+
213
+ _arguments \\
214
+ '(-v --version)'{-v,--version}'[version information]' \\
215
+ '*:: :->subcmds' && return 0
216
+
217
+ if (( CURRENT == 1 )); then
218
+ _describe -t commands "chef subcommand" _1st_arguments
219
+ return
220
+ fi
221
+ }
222
+
223
+ compdef _chef chef
224
+
225
+ END_COMPLETION
226
+ end
227
+
228
+ before do
229
+ # Stub this or else we'd have to update the test every time a new command
230
+ # is added.
231
+ allow(command_instance.shell_completion_template_context).to receive(:commands)
232
+ .and_return(command_descriptions)
233
+
234
+ allow(command_instance).to receive(:omnibus_embedded_bin_dir).and_return(omnibus_embedded_bin_dir)
235
+ allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
236
+ end
237
+
238
+ it "generates a completion function for the chef command" do
239
+ command_instance.run(argv)
240
+ expect(stdout_io.string).to include(expected_completion_function)
241
+ end
242
+ end
243
+ end
244
+
245
+ context "for fish" do
246
+ before do
247
+ stub_const("File::PATH_SEPARATOR", ":")
248
+ end
249
+ let(:expected_path) { [omnibus_bin_dir, user_bin_dir, omnibus_embedded_bin_dir, ENV["PATH"], git_bin_dir].join(":").split(":").join('" "') }
250
+ let(:expected_environment_commands) do
251
+ <<~EOH
252
+ set -gx PATH "#{expected_path}" 2>/dev/null;
253
+ set -gx GEM_ROOT "#{expected_gem_root}";
254
+ set -gx GEM_HOME "#{expected_gem_home}";
255
+ set -gx GEM_PATH "#{expected_gem_path}";
256
+ EOH
257
+ end
258
+
259
+ include_context "shell init script", "fish"
260
+
261
+ describe "generating auto-complete" do
262
+
263
+ let(:command_descriptions) do
264
+ {
265
+ "exec" => "Runs the command in context of the embedded ruby",
266
+ "env" => "Prints environment variables used by #{ChefCLI::Dist::PRODUCT}",
267
+ "gem" => "Runs the `gem` command in context of the embedded ruby",
268
+ "generate" => "Generate a new app, cookbook, or component",
269
+ }
270
+ end
271
+
272
+ let(:omnibus_bin_dir) { "/foo/bin" }
273
+ let(:omnibus_embedded_bin_dir) { "/foo/embedded/bin" }
274
+
275
+ let(:argv) { [ "fish" ] }
276
+
277
+ let(:expected_completion_function) do
278
+ <<~END_COMPLETION
279
+ # Fish Shell command-line completions for #{ChefCLI::Dist::PRODUCT}
280
+
281
+ function __fish_chef_no_command --description 'Test if chef has yet to be given the main command'
282
+ set -l cmd (commandline -opc)
283
+ test (count $cmd) -eq 1
284
+ end
285
+
286
+ complete -c chef -f -n '__fish_chef_no_command' -a exec -d "Runs the command in context of the embedded ruby"
287
+ complete -c chef -f -n '__fish_chef_no_command' -a env -d "Prints environment variables used by Chef Workstation"
288
+ complete -c chef -f -n '__fish_chef_no_command' -a gem -d "Runs the `gem` command in context of the embedded ruby"
289
+ complete -c chef -f -n '__fish_chef_no_command' -a generate -d "Generate a new app, cookbook, or component"
290
+ END_COMPLETION
291
+ end
292
+
293
+ before do
294
+ # Stub this or else we'd have to update the test every time a new command
295
+ # is added.
296
+ allow(command_instance.shell_completion_template_context).to receive(:commands)
297
+ .and_return(command_descriptions)
298
+
299
+ allow(command_instance).to receive(:omnibus_embedded_bin_dir).and_return(omnibus_embedded_bin_dir)
300
+ allow(command_instance).to receive(:omnibus_bin_dir).and_return(omnibus_bin_dir)
301
+ end
302
+
303
+ it "generates a completion function for the chef command" do
304
+ command_instance.run(argv)
305
+ expect(stdout_io.string).to include(expected_completion_function)
306
+ end
307
+ end
308
+ end
309
+
310
+ %w{powershell posh}.each do |shell|
311
+ context "for #{shell}" do
312
+ it_behaves_like "a powershell script", shell
313
+ end
314
+ end
315
+
316
+ context "when no shell is specified" do
317
+
318
+ let(:argv) { [] }
319
+
320
+ it "exits with an error message" do
321
+ expect(command_instance.run(argv)).to eq(1)
322
+ expect(stderr_io.string).to include("Please specify what shell you are using")
323
+ end
324
+
325
+ end
326
+
327
+ context "when an unsupported shell is specified" do
328
+
329
+ let(:argv) { ["nosuchsh"] }
330
+
331
+ it "exits with an error message" do
332
+ expect(command_instance.run(argv)).to eq(1)
333
+ expect(stderr_io.string).to include("Shell `nosuchsh' is not currently supported")
334
+ expect(stderr_io.string).to include("Supported shells are: bash fish zsh sh powershell posh")
335
+ end
336
+
337
+ end
338
+
339
+ end
@@ -0,0 +1,234 @@
1
+ #
2
+ # Copyright:: Copyright (c) 2015 Chef Software Inc.
3
+ # License:: Apache License, Version 2.0
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+ #
17
+
18
+ require "spec_helper"
19
+ require "shared/command_with_ui_object"
20
+ require "chef-cli/command/show_policy"
21
+
22
+ describe ChefCLI::Command::ShowPolicy do
23
+
24
+ it_behaves_like "a command with a UI object"
25
+
26
+ subject(:command) do
27
+ described_class.new
28
+ end
29
+
30
+ let(:show_policy_service) { command.show_policy_service }
31
+
32
+ let(:chef_config_loader) { instance_double("Chef::WorkstationConfigLoader") }
33
+
34
+ let(:chef_config) { double("Chef::Config") }
35
+
36
+ # nil means the config loader will do the default path lookup
37
+ let(:config_arg) { nil }
38
+
39
+ before do
40
+ stub_const("Chef::Config", chef_config)
41
+ allow(Chef::WorkstationConfigLoader).to receive(:new).with(config_arg).and_return(chef_config_loader)
42
+ end
43
+
44
+ describe "parsing args and options" do
45
+ let(:params) { [] }
46
+
47
+ before do
48
+ command.apply_params!(params)
49
+ end
50
+
51
+ context "when given a path to the config" do
52
+
53
+ let(:params) { %w{ -c ~/otherstuff/config.rb } }
54
+
55
+ let(:config_arg) { "~/otherstuff/config.rb" }
56
+
57
+ before do
58
+ expect(chef_config_loader).to receive(:load)
59
+ end
60
+
61
+ it "reads the chef/knife config" do
62
+ expect(Chef::WorkstationConfigLoader).to receive(:new).with(config_arg).and_return(chef_config_loader)
63
+ expect(command.chef_config).to eq(chef_config)
64
+ expect(show_policy_service.chef_config).to eq(chef_config)
65
+ end
66
+
67
+ end
68
+
69
+ describe "settings that require loading chef config" do
70
+
71
+ before do
72
+ allow(chef_config_loader).to receive(:load)
73
+ end
74
+
75
+ context "with no params" do
76
+
77
+ it "disables debug by default" do
78
+ expect(command.debug?).to be(false)
79
+ end
80
+
81
+ it "is configured to show all policies across all groups" do
82
+ expect(show_policy_service.show_all_policies?).to be(true)
83
+ end
84
+
85
+ it "disables displaying orphans" do
86
+ expect(command.show_orphans?).to be(false)
87
+ expect(show_policy_service.show_orphans?).to be(false)
88
+ end
89
+
90
+ end
91
+
92
+ context "when debug mode is set" do
93
+
94
+ let(:params) { [ "-D" ] }
95
+
96
+ it "enables debug" do
97
+ expect(command.debug?).to be(true)
98
+ end
99
+
100
+ end
101
+
102
+ context "when --show-orphans is given" do
103
+
104
+ let(:params) { %w{ -o } }
105
+
106
+ it "enables displaying orphans" do
107
+ expect(command.show_orphans?).to be(true)
108
+ expect(show_policy_service.show_orphans?).to be(true)
109
+ end
110
+
111
+ end
112
+
113
+ context "when given a policy name" do
114
+
115
+ let(:params) { %w{ appserver } }
116
+
117
+ it "is not configured to show all policies" do
118
+ expect(show_policy_service.show_all_policies?).to be(false)
119
+ end
120
+
121
+ it "is configured to show the given policy" do
122
+ expect(command.policy_name).to eq("appserver")
123
+ expect(show_policy_service.policy_name).to eq("appserver")
124
+ end
125
+
126
+ end
127
+
128
+ context "when given a policy name and a policy group name" do
129
+
130
+ let(:params) { %w{ appserver production } }
131
+
132
+ it "is not configured to show all policies" do
133
+ expect(show_policy_service.show_all_policies?).to be(false)
134
+ end
135
+
136
+ it "is configured to show the given policy" do
137
+ expect(command.policy_name).to eq("appserver")
138
+ expect(show_policy_service.policy_name).to eq("appserver")
139
+ end
140
+
141
+ it "is configured to display the exact revision for the given policy+group" do
142
+ expect(command.policy_group).to eq("production")
143
+ expect(show_policy_service.policy_group).to eq("production")
144
+ end
145
+
146
+ end
147
+
148
+ end
149
+ end
150
+
151
+ describe "running the command" do
152
+
153
+ let(:ui) { TestHelpers::TestUI.new }
154
+
155
+ before do
156
+ allow(chef_config_loader).to receive(:load)
157
+ command.ui = ui
158
+ end
159
+
160
+ context "when given too many arguments" do
161
+
162
+ let(:params) { %w{ appserver policygroup wut-is-this } }
163
+
164
+ it "shows usage and exits" do
165
+ expect(command.run(params)).to eq(1)
166
+ end
167
+
168
+ end
169
+
170
+ context "when the list service raises an exception" do
171
+
172
+ let(:backtrace) { caller[0...3] }
173
+
174
+ let(:cause) do
175
+ e = StandardError.new("some operation failed")
176
+ e.set_backtrace(backtrace)
177
+ e
178
+ end
179
+
180
+ let(:exception) do
181
+ ChefCLI::PolicyfileListError.new("Failed to list policies", cause)
182
+ end
183
+
184
+ before do
185
+ allow(command.show_policy_service).to receive(:run).and_raise(exception)
186
+ end
187
+
188
+ it "prints a debugging message and exits non-zero" do
189
+ expect(command.run([])).to eq(1)
190
+
191
+ expected_output = <<~E
192
+ Error: Failed to list policies
193
+ Reason: (StandardError) some operation failed
194
+
195
+ E
196
+
197
+ expect(ui.output).to eq(expected_output)
198
+ end
199
+
200
+ context "when debug is enabled" do
201
+
202
+ it "includes the backtrace in the error" do
203
+
204
+ command.run(%w{ -D })
205
+
206
+ expected_output = <<~E
207
+ Error: Failed to list policies
208
+ Reason: (StandardError) some operation failed
209
+
210
+
211
+ E
212
+ expected_output << backtrace.join("\n") << "\n"
213
+
214
+ expect(ui.output).to eq(expected_output)
215
+ end
216
+
217
+ end
218
+
219
+ end
220
+
221
+ context "when the list service executes successfully" do
222
+
223
+ before do
224
+ expect(command.show_policy_service).to receive(:run)
225
+ end
226
+
227
+ it "exits 0" do
228
+ expect(command.run([])).to eq(0)
229
+ end
230
+
231
+ end
232
+
233
+ end
234
+ end