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,375 @@
1
+ # Copyright:: Copyright (c) 2014-2018 Chef Software Inc.
2
+ # License:: Apache License, Version 2.0
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require "spec_helper"
18
+ require "stringio"
19
+ require "chef-cli/cli"
20
+ require "unit/fixtures/command/cli_test_command"
21
+
22
+ describe ChefCLI::CLI do
23
+
24
+ let(:argv) { [] }
25
+
26
+ # Setup a new commands map so we control what subcommands exist. Otherwise
27
+ # we'd have to update this test for every new subcommand we add or code the
28
+ # tests defensively.
29
+ let(:commands_map) { ChefCLI::CommandsMap.new }
30
+
31
+ let(:stdout_io) { StringIO.new }
32
+ let(:stderr_io) { StringIO.new }
33
+
34
+ def stdout
35
+ stdout_io.string
36
+ end
37
+
38
+ def stderr
39
+ stderr_io.string
40
+ end
41
+
42
+ let(:base_help_message) do
43
+ <<~E
44
+ Usage:
45
+ chef -h/--help
46
+ chef -v/--version
47
+ chef command [arguments...] [options...]
48
+
49
+
50
+ Available Commands:
51
+ verify Test the embedded ChefCLI applications
52
+ gem Runs the `gem` command in context of the embedded ruby
53
+ example Example subcommand for testing
54
+ E
55
+ end
56
+
57
+ let(:version_message) { "#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n" }
58
+
59
+ def run_cli(expected_exit_code)
60
+ expect(cli).to receive(:exit).with(expected_exit_code)
61
+ expect(cli).to receive(:sanity_check!)
62
+ cli.run
63
+ end
64
+
65
+ def run_cli_with_sanity_check(expected_exit_code)
66
+ expect(cli).to receive(:exit).with(expected_exit_code)
67
+ cli.run
68
+ end
69
+
70
+ def run_cli_and_validate_tool_versions
71
+ full_version_message = version_message
72
+ tools.each do |name, details|
73
+ expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(0, "#{details["version_output"]}", ""))
74
+ full_version_message += "#{name} version: #{details["expected_version"]}\n"
75
+ end
76
+ run_cli(0)
77
+ expect(stdout).to eq(full_version_message)
78
+ end
79
+
80
+ def mock_shell_out(exitstatus, stdout, stderr)
81
+ shell_out = double("mixlib_shell_out")
82
+ allow(shell_out).to receive(:exitstatus).and_return(exitstatus)
83
+ allow(shell_out).to receive(:stdout).and_return(stdout)
84
+ allow(shell_out).to receive(:stderr).and_return(stderr)
85
+ shell_out
86
+ end
87
+
88
+ subject(:cli) do
89
+ ChefCLI::CLI.new(argv).tap do |c|
90
+ allow(c).to receive(:commands_map).and_return(commands_map)
91
+ allow(c).to receive(:stdout).and_return(stdout_io)
92
+ allow(c).to receive(:stderr).and_return(stderr_io)
93
+ end
94
+ end
95
+
96
+ before do
97
+ commands_map.builtin "verify", :Verify, desc: "Test the embedded ChefCLI applications"
98
+
99
+ commands_map.builtin "gem", :GemForwarder, require_path: "chef-cli/command/gem",
100
+ desc: "Runs the `gem` command in context of the embedded ruby"
101
+
102
+ commands_map.builtin "example", :TestCommand, require_path: "unit/fixtures/command/cli_test_command",
103
+ desc: "Example subcommand for testing"
104
+ end
105
+
106
+ context "given no arguments or options" do
107
+
108
+ it "prints the help output" do
109
+ run_cli(0)
110
+ expect(stdout).to eq(base_help_message)
111
+ end
112
+
113
+ end
114
+
115
+ context "given -h" do
116
+ let(:argv) { %w{-h} }
117
+
118
+ it "prints the help output" do
119
+ run_cli(0)
120
+ expect(stdout).to eq(base_help_message)
121
+ end
122
+ end
123
+
124
+ context "given -v" do
125
+ let(:argv) { %w{-v} }
126
+
127
+ let(:tools) do
128
+ {
129
+ "Chef Infra Client" => {
130
+ "command" => "chef-client",
131
+ "version_output" => "Chef Infra Client: 15.0.300",
132
+ "expected_version" => "15.0.300",
133
+ },
134
+ "Chef InSpec" => {
135
+ "command" => "inspec",
136
+ "version_output" => "4.6.2\n\nYour version of InSpec is out of date! The latest version is 4.6.4.",
137
+ "expected_version" => "4.6.2",
138
+ },
139
+ "Test Kitchen" => {
140
+ "command" => "kitchen",
141
+ "version_output" => "Test Kitchen version 2.2.5",
142
+ "expected_version" => "2.2.5",
143
+ },
144
+ "Foodcritic" => {
145
+ "command" => "foodcritic",
146
+ "version_output" => "foodcritic 16.0.0",
147
+ "expected_version" => "16.0.0",
148
+ },
149
+ "Cookstyle" => {
150
+ "command" => "cookstyle",
151
+ "version_output" => "Cookstyle 4.0.0\n * RuboCop 0.62.0",
152
+ "expected_version" => "4.0.0",
153
+ },
154
+ }
155
+ end
156
+
157
+ it "does not print versions of tools with missing or errored tools" do
158
+ full_version_message = version_message
159
+ tools.each do |name, details|
160
+ if name == "inspec"
161
+ expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(1, "#{details["version_output"]}", ""))
162
+ full_version_message += "#{name} version: ERROR\n"
163
+ else
164
+ expect(cli).to receive(:shell_out).with("#{details["command"]} --version").and_return(mock_shell_out(0, "#{details["version_output"]}", ""))
165
+ full_version_message += "#{name} version: #{details["expected_version"]}\n"
166
+ end
167
+ end
168
+ run_cli(0)
169
+ expect(stdout).to eq(full_version_message)
170
+ end
171
+
172
+ it "prints the version and versions of chef-cli tools" do
173
+ run_cli_and_validate_tool_versions
174
+ end
175
+ end
176
+
177
+ context "given an invalid option" do
178
+
179
+ let(:argv) { %w{-nope} }
180
+
181
+ it "prints an 'invalid option message and the help output, then exits non-zero" do
182
+ run_cli(1)
183
+ expect(stdout).to eq(base_help_message)
184
+ expect(stderr).to eq("invalid option: -nope\n")
185
+ end
186
+
187
+ end
188
+
189
+ context "given an invalid/unknown subcommand" do
190
+ let(:argv) { %w{ancient-aliens} }
191
+
192
+ it "prints an 'unknown command' message and the help output" do
193
+ expected_err = "Unknown command `ancient-aliens'.\n"
194
+
195
+ run_cli(1)
196
+
197
+ expect(stderr).to eq(expected_err)
198
+ expect(stdout).to eq(base_help_message)
199
+ end
200
+
201
+ end
202
+
203
+ context "given a valid subcommand" do
204
+ let(:argv) { %w{example with some args --and-an-option} }
205
+
206
+ def test_result
207
+ ChefCLI::Command::TestCommand.test_result
208
+ end
209
+
210
+ before do
211
+ ChefCLI::Command::TestCommand.reset!
212
+ end
213
+
214
+ it "runs the subcommand" do
215
+ run_cli(23)
216
+ expect(test_result[:status]).to eq(:success)
217
+ end
218
+
219
+ it "exits with the return code given by the subcommand" do
220
+ run_cli(23)
221
+ end
222
+
223
+ it "passes arguments and options to the subcommand" do
224
+ params = %w{with some args --and-an-option}
225
+ run_cli(23)
226
+ expect(test_result[:params]).to eq(params)
227
+ end
228
+ end
229
+
230
+ context "sanity_check!" do
231
+
232
+ before do
233
+ allow(Gem).to receive(:ruby).and_return(ruby_path)
234
+ allow(cli).to receive(:package_home).and_return("/opt/chef-workstation")
235
+ end
236
+
237
+ context "when installed via omnibus" do
238
+ before do
239
+ allow(cli).to receive(:omnibus_install?).and_return true
240
+ end
241
+
242
+ context "on unix" do
243
+
244
+ let(:ruby_path) { "/opt/chef-workstation/embedded/bin/ruby" }
245
+ before do
246
+ stub_const("File::PATH_SEPARATOR", ":")
247
+ allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
248
+ path
249
+ end
250
+ end
251
+
252
+ it "complains if embedded is first" do
253
+ allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/embedded/bin:/opt/chef-workstation/bin" })
254
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
255
+ allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
256
+ run_cli_with_sanity_check(0)
257
+ expect(stdout).to eq(base_help_message)
258
+ expect(stderr).to include("please reverse that order")
259
+ expect(stderr).to include("chef shell-init")
260
+ end
261
+
262
+ it "complains if only embedded is present" do
263
+ allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/embedded/bin" })
264
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
265
+ allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
266
+ run_cli_with_sanity_check(0)
267
+ expect(stdout).to eq(base_help_message)
268
+ expect(stderr).to include("you must add")
269
+ expect(stderr).to include("chef shell-init")
270
+ end
271
+
272
+ it "passes when both are present in the correct order" do
273
+ allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/bin:/opt/chef-workstation/embedded/bin" })
274
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
275
+ allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
276
+ run_cli_with_sanity_check(0)
277
+ expect(stdout).to eq(base_help_message)
278
+ end
279
+
280
+ it "passes when only the omnibus bin dir is present" do
281
+ allow(cli).to receive(:env).and_return({ "PATH" => "/opt/chef-workstation/bin" })
282
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("/opt/chef-workstation/embedded/bin")
283
+ allow(cli).to receive(:omnibus_bin_dir).and_return("/opt/chef-workstation/bin")
284
+ run_cli_with_sanity_check(0)
285
+ expect(stdout).to eq(base_help_message)
286
+ end
287
+ end
288
+
289
+ context "on windows" do
290
+
291
+ let(:ruby_path) { "c:/opscode/chef-workstation/embedded/bin/ruby.exe" }
292
+ let(:omnibus_root) { "c:/opscode/chef-workstation" }
293
+
294
+ before do
295
+ # Would be preferable not to stub this, but `File.expand_path` does
296
+ # weird things with windows paths on unix machines.
297
+ #
298
+ # I manually verified the behavior:
299
+ #
300
+ # $ /c/opscode/chef-workstation/embedded/bin/ruby -e 'p File.expand_path(File.join(Gem.ruby, "..", "..", ".."))'
301
+ # "c:/opscode/chef-workstation"
302
+ allow(cli).to receive(:expected_omnibus_root).and_return(ruby_path)
303
+ allow(cli).to receive(:omnibus_install?).and_return(true)
304
+ allow(Chef::Platform).to receive(:windows?).and_return(true)
305
+ stub_const("File::PATH_SEPARATOR", ";")
306
+ allow(Chef::Util::PathHelper).to receive(:cleanpath) do |path|
307
+ path.tr "/", "\\"
308
+ end
309
+ end
310
+
311
+ it "complains if embedded is first" do
312
+ allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\embedded\bin;C:\opscode\chef-workstation\bin' })
313
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
314
+ allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
315
+ run_cli_with_sanity_check(0)
316
+ expect(stdout).to eq(base_help_message)
317
+ expect(stderr).to include("please reverse that order")
318
+ expect(stderr).to include("chef shell-init")
319
+ end
320
+
321
+ it "complains if only embedded is present" do
322
+ allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\embedded\bin' })
323
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
324
+ allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
325
+ run_cli_with_sanity_check(0)
326
+ expect(stdout).to eq(base_help_message)
327
+ expect(stderr).to include("you must add")
328
+ expect(stderr).to include("chef shell-init")
329
+ end
330
+
331
+ it "passes when both are present in the correct order" do
332
+ allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\bin;C:\opscode\chef-workstation\embedded\bin' })
333
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
334
+ allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
335
+ run_cli_with_sanity_check(0)
336
+ expect(stdout).to eq(base_help_message)
337
+ end
338
+
339
+ it "passes when only the omnibus bin dir is present" do
340
+ allow(cli).to receive(:env).and_return({ "PATH" => 'C:\opscode\chef-workstation\bin' })
341
+ allow(cli).to receive(:omnibus_embedded_bin_dir).and_return("c:/opscode/chef-workstation/embedded/bin")
342
+ allow(cli).to receive(:omnibus_bin_dir).and_return("c:/opscode/chef-workstation/bin")
343
+ run_cli_with_sanity_check(0)
344
+ expect(stdout).to eq(base_help_message)
345
+ end
346
+ end
347
+ end
348
+
349
+ context "when not installed via omnibus" do
350
+
351
+ before do
352
+ allow(cli).to receive(:omnibus_install?).and_return false
353
+ end
354
+ let(:ruby_path) { "/Users/bog/.lots_o_rubies/2.1.2/bin/ruby" }
355
+ let(:expected_root_path) { "/Users/bog/.lots_o_rubies" }
356
+
357
+ before do
358
+ allow(File).to receive(:exist?).with(expected_root_path).and_return(false)
359
+
360
+ [
361
+ :omnibus_root,
362
+ :omnibus_bin_dir,
363
+ :omnibus_embedded_bin_dir,
364
+ ].each do |method_name|
365
+ allow(cli).to receive(method_name).and_raise(ChefCLI::OmnibusInstallNotFound.new)
366
+ end
367
+ end
368
+
369
+ it "skips the sanity check without error" do
370
+ run_cli_with_sanity_check(0)
371
+ end
372
+
373
+ end
374
+ end
375
+ end
@@ -0,0 +1,195 @@
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/verify"
20
+
21
+ describe ChefCLI::Command::Base do
22
+ class TestCommand < ChefCLI::Command::Base
23
+ banner "use me please"
24
+
25
+ option :argue,
26
+ short: "-a ARG",
27
+ long: "--arg ARG",
28
+ description: "An option with a required argument"
29
+
30
+ option :user,
31
+ short: "-u",
32
+ long: "--user",
33
+ description: "If the user exists",
34
+ boolean: true
35
+
36
+ def run(params)
37
+ parse_options(params)
38
+ msg("thanks for passing me #{config[:user]}")
39
+ end
40
+ end
41
+
42
+ let(:stderr_io) { StringIO.new }
43
+ let(:stdout_io) { StringIO.new }
44
+ let(:command_instance) { TestCommand.new() }
45
+ let(:enforce_license) { false }
46
+
47
+ def stdout
48
+ stdout_io.string
49
+ end
50
+
51
+ def stderr
52
+ stderr_io.string
53
+ end
54
+
55
+ before do
56
+ allow(command_instance).to receive(:stdout).and_return(stdout_io)
57
+ allow(command_instance).to receive(:stderr).and_return(stderr_io)
58
+ end
59
+
60
+ def run_command(options)
61
+ command_instance.run_with_default_options(enforce_license, options)
62
+ end
63
+
64
+ it "should print the banner for -h" do
65
+ run_command(["-h"])
66
+ expect(stdout).to include("use me please\n")
67
+ end
68
+
69
+ it "should print the banner for --help" do
70
+ run_command(["--help"])
71
+ expect(stdout).to include("use me please\n")
72
+ end
73
+
74
+ it "prints the options along with the banner when displaying the help message" do
75
+ run_command(["--help"])
76
+ expect(stdout).to include("-u, --user If the user exists")
77
+ end
78
+
79
+ it "should print the version for -v" do
80
+ run_command(["-v"])
81
+ expect(stdout).to eq("#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n")
82
+ end
83
+
84
+ it "should print the version for --version" do
85
+ run_command(["--version"])
86
+ expect(stdout).to eq("#{ChefCLI::Dist::PRODUCT} version: #{ChefCLI::VERSION}\n")
87
+ end
88
+
89
+ it "should run the command passing in the custom options for long custom options" do
90
+ run_command(["--user"])
91
+ expect(stdout).to eq("thanks for passing me true\n")
92
+ end
93
+
94
+ it "should run the command passing in the custom options for short custom options" do
95
+ run_command(["-u"])
96
+ expect(stdout).to eq("thanks for passing me true\n")
97
+ end
98
+
99
+ describe "when enforce_license is true" do
100
+ let(:enforce_license) { true }
101
+
102
+ it "calls the license acceptance library" do
103
+ expect(LicenseAcceptance::Acceptor).to receive(:check_and_persist!).with("chef-workstation", ChefCLI::VERSION.to_s)
104
+ run_command([])
105
+ expect(stdout).to eq("thanks for passing me \n")
106
+ end
107
+ end
108
+
109
+ describe "when enforce_license is false" do
110
+ let(:enforce_license) { false }
111
+
112
+ it "does not call the license acceptance library" do
113
+ expect(LicenseAcceptance::Acceptor).to_not receive(:check_and_persist!)
114
+ run_command([])
115
+ expect(stdout).to eq("thanks for passing me \n")
116
+ end
117
+ end
118
+
119
+ describe "when given invalid options" do
120
+
121
+ it "prints the help banner and exits gracefully" do
122
+ expect(run_command(%w{-foo})).to eq(1)
123
+
124
+ expect(stderr).to eq("ERROR: invalid option: -foo\n\n")
125
+
126
+ expected = <<~E
127
+ use me please
128
+ -a, --arg ARG An option with a required argument
129
+ --chef-license ACCEPTANCE Accept the license for this product and any contained products ('accept', 'accept-no-persist', or 'accept-silent')
130
+ -h, --help Show this message
131
+ -u, --user If the user exists
132
+ -v, --version Show #{ChefCLI::Dist::PRODUCT} version
133
+
134
+ E
135
+ expect(stdout).to eq(expected)
136
+ end
137
+
138
+ end
139
+
140
+ describe "when given an option that requires an argument with no argument" do
141
+
142
+ it "prints the help banner and exits gracefully" do
143
+ expect(run_command(%w{-a})).to eq(1)
144
+
145
+ expect(stderr).to eq("ERROR: missing argument: -a\n\n")
146
+
147
+ expected = <<~E
148
+ use me please
149
+ -a, --arg ARG An option with a required argument
150
+ --chef-license ACCEPTANCE Accept the license for this product and any contained products ('accept', 'accept-no-persist', or 'accept-silent')
151
+ -h, --help Show this message
152
+ -u, --user If the user exists
153
+ -v, --version Show #{ChefCLI::Dist::PRODUCT} version
154
+
155
+ E
156
+ expect(stdout).to eq(expected)
157
+
158
+ end
159
+
160
+ end
161
+
162
+ describe "when parsing Chef's configuration fails" do
163
+
164
+ let(:exception_message) do
165
+ <<~MESSAGE
166
+ You have an error in your config file /Users/ddeleo/.chef/config.rb (Chef::Exceptions::ConfigurationError)
167
+
168
+ Mixlib::Config::UnknownConfigOptionError: Cannot set unsupported config value foo.
169
+ /Users/person/.chef/config.rb:50:in `from_string'
170
+ Relevant file content:
171
+ 49: chefcli.generator_cookbook "~/.chef/code_generator"
172
+ 50: chefcli.foo "bar"
173
+ 51:
174
+
175
+ MESSAGE
176
+ end
177
+
178
+ let(:exception) { Chef::Exceptions::ConfigurationError.new(exception_message) }
179
+
180
+ before do
181
+ allow(command_instance).to receive(:run).and_raise(exception)
182
+ end
183
+
184
+ it "exits non-zero" do
185
+ expect(run_command([])).to eq(1)
186
+ end
187
+
188
+ it "prints the exception message to stderr" do
189
+ run_command([])
190
+ expect(stderr).to include(exception_message)
191
+ end
192
+
193
+ end
194
+
195
+ end