chef-cli 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
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,263 @@
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 "chef-cli/policyfile_services/rm_policy"
20
+
21
+ describe ChefCLI::PolicyfileServices::RmPolicy do
22
+
23
+ let(:policy_name) { "appserver" }
24
+
25
+ let(:http_client) { instance_double(Chef::ServerAPI) }
26
+
27
+ let(:policy_revisions_data) do
28
+ {
29
+ "revisions" => {
30
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
31
+ },
32
+ }
33
+ end
34
+
35
+ let(:ui) { TestHelpers::TestUI.new }
36
+
37
+ let(:chef_config) do
38
+ double("Chef::Config",
39
+ chef_server_url: "https://localhost:10443",
40
+ client_key: "/path/to/client/key.pem",
41
+ node_name: "deuce")
42
+ end
43
+
44
+ subject(:rm_policy_service) do
45
+ described_class.new(policy_name: policy_name, ui: ui, config: chef_config)
46
+ end
47
+
48
+ let(:undo_record) do
49
+ rm_policy_service.undo_record
50
+ end
51
+
52
+ let(:undo_stack) do
53
+ rm_policy_service.undo_stack
54
+ end
55
+
56
+ it "configures an HTTP client" do
57
+ expect(Chef::ServerAPI).to receive(:new).with("https://localhost:10443",
58
+ signing_key_filename: "/path/to/client/key.pem",
59
+ client_name: "deuce")
60
+ rm_policy_service.http_client
61
+ end
62
+
63
+ context "when the server returns an error fetching the policy data" do
64
+
65
+ let(:response) do
66
+ Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
67
+ r.instance_variable_set(:@body, "oops")
68
+ end
69
+ end
70
+
71
+ let(:http_exception) do
72
+ begin
73
+ response.error!
74
+ rescue => e
75
+ e
76
+ end
77
+ end
78
+
79
+ before do
80
+ allow(rm_policy_service).to receive(:http_client).and_return(http_client)
81
+ end
82
+
83
+ describe "when getting an error fetching policy revisions" do
84
+
85
+ before do
86
+ expect(http_client).to receive(:get).with("/policies/appserver").and_return(policy_revisions_data)
87
+ expect(http_client).to receive(:get)
88
+ .with("/policies/appserver/revisions/2222222222222222222222222222222222222222222222222222222222222222")
89
+ .and_raise(http_exception)
90
+ end
91
+
92
+ it "re-raises the error with a standardized exception class" do
93
+ expect { rm_policy_service.run }.to raise_error(ChefCLI::DeletePolicyError)
94
+ end
95
+
96
+ end
97
+
98
+ end
99
+
100
+ context "when the given policy doesn't exist" do
101
+
102
+ let(:policy_group) { "incorrect_policy_group_name" }
103
+
104
+ let(:response) do
105
+ Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
106
+ r.instance_variable_set(:@body, "not found")
107
+ end
108
+ end
109
+
110
+ let(:http_exception) do
111
+ begin
112
+ response.error!
113
+ rescue => e
114
+ e
115
+ end
116
+ end
117
+
118
+ before do
119
+ allow(rm_policy_service).to receive(:http_client).and_return(http_client)
120
+ expect(http_client).to receive(:get).with("/policies/appserver").and_raise(http_exception)
121
+ end
122
+
123
+ it "prints a message stating that the policy doesn't exist" do
124
+ expect { rm_policy_service.run }.to_not raise_error
125
+ expect(ui.output).to eq("Policy 'appserver' does not exist on the server\n")
126
+ end
127
+
128
+ end
129
+
130
+ # This case makes undo impossible to implement, because there are no APIs to
131
+ # create a policy name without creating a revision (i.e., there is no
132
+ # `POST /policies`). Because of the separation between CLI and service
133
+ # objects, running `chef delete-policy empty-policy` will still tell the user
134
+ # they can undo that action by running `chef undelete --last`, but that isn't
135
+ # true. That said, a policy with no revisions is invisible to `chef-client`
136
+ # and `chef show-policy`; the only way to create that state with the CLI is to
137
+ # `chef delete-policy-group` all the groups that policy was applied to and
138
+ # then run `chef clean-policy-revisions`, which can be undone by running
139
+ # `chef undelete` multiple times. So we'll test this scenario to make sure we
140
+ # don't crash, but not worry about the slightly incorrect behavior.
141
+ context "when the policy exists but has no revisions" do
142
+
143
+ let(:empty_policy_data) { {} }
144
+
145
+ before do
146
+ allow(rm_policy_service).to receive(:http_client).and_return(http_client)
147
+ expect(http_client).to receive(:get).with("/policies/appserver").and_return(empty_policy_data)
148
+ expect(http_client).to receive(:delete).with("/policies/appserver")
149
+
150
+ expect(undo_stack).to receive(:push).with(undo_record)
151
+ end
152
+
153
+ it "removes the policy" do
154
+ rm_policy_service.run
155
+ end
156
+
157
+ end
158
+
159
+ context "when the policy has several revisions" do
160
+
161
+ let(:policy_appserver_2) do
162
+ {
163
+ "name" => "appserver",
164
+ "revision_id" => "2222222222222222222222222222222222222222222222222222222222222222",
165
+ }
166
+ end
167
+
168
+ let(:policy_group_data) do
169
+ {
170
+ "dev" => {
171
+ "uri" => "https://chef.example/organizations/testorg/policy_groups/dev",
172
+ },
173
+ "preprod" => {
174
+ "uri" => "https://chef.example/organizations/testorg/policy_groups/preprod",
175
+ },
176
+ }
177
+ end
178
+
179
+ before do
180
+ allow(rm_policy_service).to receive(:http_client).and_return(http_client)
181
+
182
+ expect(http_client).to receive(:get).with("/policies/appserver").and_return(policy_revisions_data)
183
+ expect(http_client).to receive(:get).with("/policy_groups").and_return(policy_group_data)
184
+
185
+ expect(http_client).to receive(:get)
186
+ .with("/policies/appserver/revisions/2222222222222222222222222222222222222222222222222222222222222222")
187
+ .and_return(policy_appserver_2)
188
+ expect(http_client).to receive(:delete).with("/policies/appserver")
189
+
190
+ expect(undo_stack).to receive(:push).with(undo_record)
191
+ end
192
+
193
+ it "removes the policy" do
194
+ rm_policy_service.run
195
+ expect(ui.output).to include("Removed policy 'appserver'.")
196
+ end
197
+
198
+ it "stores the policy revisions in the restore file" do
199
+ rm_policy_service.run
200
+
201
+ expect(undo_record.description).to eq("delete-policy appserver")
202
+ expect(undo_record.policy_groups).to eq( [ ] )
203
+ expect(undo_record.policy_revisions.size).to eq(1)
204
+ stored_revision_info = undo_record.policy_revisions.first
205
+ expect(stored_revision_info.policy_group).to be_nil
206
+ expect(stored_revision_info.policy_name).to eq("appserver")
207
+ expect(stored_revision_info.data).to eq(policy_appserver_2)
208
+ end
209
+
210
+ context "and some policy revisions are associated to policy groups" do
211
+
212
+ let(:policy_group_data) do
213
+ {
214
+ "dev" => {
215
+ "uri" => "https://chef.example/organizations/testorg/policy_groups/dev",
216
+ "policies" => {
217
+ "appserver" => { "revision_id" => "2222222222222222222222222222222222222222222222222222222222222222" },
218
+ "load-balancer" => { "revision_id" => "5555555555555555555555555555555555555555555555555555555555555555" },
219
+ "db" => { "revision_id" => "9999999999999999999999999999999999999999999999999999999999999999" },
220
+ },
221
+ },
222
+ "preprod" => {
223
+ "uri" => "https://chef.example/organizations/testorg/policy_groups/preprod",
224
+ "policies" => {
225
+ "appserver" => { "revision_id" => "2222222222222222222222222222222222222222222222222222222222222222" },
226
+ "load-balancer" => { "revision_id" => "5555555555555555555555555555555555555555555555555555555555555555" },
227
+ "db" => { "revision_id" => "9999999999999999999999999999999999999999999999999999999999999999" },
228
+ },
229
+ },
230
+ "prod" => {
231
+ "uri" => "https://chef.example/organizations/testorg/policy_groups/prod",
232
+ "policies" => {
233
+ "appserver" => { "revision_id" => "1111111111111111111111111111111111111111111111111111111111111111" },
234
+ "load-balancer" => { "revision_id" => "5555555555555555555555555555555555555555555555555555555555555555" },
235
+ "db" => { "revision_id" => "9999999999999999999999999999999999999999999999999999999999999999" },
236
+ },
237
+ },
238
+ }
239
+ end
240
+
241
+ it "maps the policy revisions to their groups in the restore file" do
242
+ rm_policy_service.run
243
+
244
+ expect(undo_record.description).to eq("delete-policy appserver")
245
+ expect(undo_record.policy_groups).to eq( [ ] )
246
+ expect(undo_record.policy_revisions.size).to eq(2)
247
+
248
+ stored_revision_info_1 = undo_record.policy_revisions.first
249
+ expect(stored_revision_info_1.policy_group).to eq("dev")
250
+ expect(stored_revision_info_1.policy_name).to eq("appserver")
251
+ expect(stored_revision_info_1.data).to eq(policy_appserver_2)
252
+
253
+ stored_revision_info_2 = undo_record.policy_revisions.last
254
+ expect(stored_revision_info_2.policy_group).to eq("preprod")
255
+ expect(stored_revision_info_2.policy_name).to eq("appserver")
256
+ expect(stored_revision_info_2.data).to eq(policy_appserver_2)
257
+ end
258
+
259
+ end
260
+
261
+ end
262
+
263
+ end
@@ -0,0 +1,887 @@
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 "chef-cli/policyfile_services/show_policy"
20
+
21
+ describe ChefCLI::PolicyfileServices::ShowPolicy do
22
+
23
+ let(:chef_config) { double("Chef::Config") }
24
+
25
+ let(:ui) { TestHelpers::TestUI.new }
26
+
27
+ let(:policy_name) { nil }
28
+
29
+ let(:policy_group) { nil }
30
+
31
+ let(:show_orphans) { false }
32
+
33
+ let(:summary_diff) { false }
34
+
35
+ subject(:show_policy_service) do
36
+ described_class.new(config: chef_config,
37
+ ui: ui,
38
+ policy_name: policy_name,
39
+ policy_group: policy_group,
40
+ show_orphans: show_orphans,
41
+ summary_diff: summary_diff)
42
+ end
43
+
44
+ let(:policy_lister) do
45
+ show_policy_service.policy_lister
46
+ end
47
+
48
+ let(:policyfile_locks_content) {}
49
+
50
+ describe "show all" do
51
+
52
+ let(:params) { [] }
53
+
54
+ let(:policies_by_name) { {} }
55
+ let(:policies_by_group) { {} }
56
+
57
+ describe "when an error occurs fetching data from the server" do
58
+
59
+ let(:http_client) { instance_double(Chef::ServerAPI) }
60
+
61
+ let(:response) do
62
+ Net::HTTPResponse.send(:response_class, "500").new("1.0", "500", "Internal Server Error").tap do |r|
63
+ r.instance_variable_set(:@body, "oops")
64
+ end
65
+ end
66
+
67
+ let(:http_exception) do
68
+ begin
69
+ response.error!
70
+ rescue => e
71
+ e
72
+ end
73
+ end
74
+
75
+ let(:policies_url) { "/policies" }
76
+
77
+ let(:policy_groups_url) { "/policy_groups" }
78
+
79
+ before do
80
+ allow(policy_lister).to receive(:http_client).and_return(http_client)
81
+ end
82
+
83
+ describe "when fetching policy revisions by policy group" do
84
+
85
+ before do
86
+ expect(http_client).to receive(:get).and_raise(http_exception)
87
+ end
88
+
89
+ it "raises an error" do
90
+ expect { show_policy_service.run }.to raise_error(ChefCLI::PolicyfileListError)
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ context "when the server returns the data successfully" do
97
+
98
+ before do
99
+ policy_lister.set!(policies_by_name, policies_by_group)
100
+ policy_lister.policy_lock_content = policyfile_locks_content
101
+
102
+ show_policy_service.run
103
+ end
104
+
105
+ context "when there are no policies or groups on the server" do
106
+
107
+ it "prints a message to stderr that there aren't any policies or groups" do
108
+ expect(ui.output).to eq("No policies or policy groups exist on the server\n")
109
+ end
110
+
111
+ end
112
+
113
+ context "when there are policies but no groups" do
114
+
115
+ let(:policies_by_name) do
116
+ {
117
+ "appserver" => {
118
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
119
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
120
+ },
121
+ "load-balancer" => {
122
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
123
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
124
+ },
125
+ "db" => {
126
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
127
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
128
+ },
129
+ }
130
+ end
131
+
132
+ it "prints a message to stderr that there are no active policies" do
133
+ expected_output = <<~OUTPUT
134
+ appserver
135
+ =========
136
+
137
+ Policy appserver is not assigned to any groups
138
+
139
+ load-balancer
140
+ =============
141
+
142
+ Policy load-balancer is not assigned to any groups
143
+
144
+ db
145
+ ==
146
+
147
+ Policy db is not assigned to any groups
148
+
149
+ OUTPUT
150
+ expect(ui.output).to eq(expected_output)
151
+ end
152
+
153
+ context "with orphans shown" do
154
+
155
+ let(:show_orphans) { true }
156
+
157
+ it "shows all policies as orphaned" do
158
+ expected_output = <<~OUTPUT
159
+ appserver
160
+ =========
161
+
162
+ Policy appserver is not assigned to any groups
163
+
164
+ Orphaned:
165
+ ---------
166
+
167
+ * 1111111111
168
+ * 2222222222
169
+
170
+ load-balancer
171
+ =============
172
+
173
+ Policy load-balancer is not assigned to any groups
174
+
175
+ Orphaned:
176
+ ---------
177
+
178
+ * 5555555555
179
+ * 6666666666
180
+
181
+ db
182
+ ==
183
+
184
+ Policy db is not assigned to any groups
185
+
186
+ Orphaned:
187
+ ---------
188
+
189
+ * 9999999999
190
+ * aaaaaaaaaa
191
+
192
+ OUTPUT
193
+ expect(ui.output).to eq(expected_output)
194
+ end
195
+ end
196
+
197
+ end
198
+
199
+ context "when there are groups but no policies" do
200
+
201
+ let(:policies_by_group) do
202
+ {
203
+ "dev" => {},
204
+ "staging" => {},
205
+ "prod" => {},
206
+ }
207
+ end
208
+
209
+ it "prints a message to stderr and exits" do
210
+ expect(ui.output).to eq("No policies exist on the server\n")
211
+ end
212
+
213
+ end
214
+
215
+ context "when there is a revision of each kind of policy assigned to every policy group" do
216
+
217
+ let(:policies_by_name) do
218
+ {
219
+ "appserver" => {
220
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
221
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
222
+ },
223
+ "load-balancer" => {
224
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
225
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
226
+ },
227
+ "db" => {
228
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
229
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
230
+ },
231
+ }
232
+ end
233
+
234
+ let(:policies_by_group) do
235
+ {
236
+ "dev" => {
237
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
238
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
239
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
240
+ },
241
+ "staging" => {
242
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
243
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
244
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
245
+ },
246
+ "prod" => {
247
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
248
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
249
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
250
+ },
251
+ }
252
+ end
253
+
254
+ it "shows each policy name, followed by a list of group_name -> revision" do
255
+ expected_output = <<~OUTPUT
256
+ appserver
257
+ =========
258
+
259
+ * dev: 1111111111
260
+ * staging: 2222222222
261
+ * prod: 2222222222
262
+
263
+ load-balancer
264
+ =============
265
+
266
+ * dev: 5555555555
267
+ * staging: 5555555555
268
+ * prod: 6666666666
269
+
270
+ db
271
+ ==
272
+
273
+ * dev: 9999999999
274
+ * staging: 9999999999
275
+ * prod: aaaaaaaaaa
276
+
277
+ OUTPUT
278
+ expect(ui.output).to eq(expected_output)
279
+ end
280
+
281
+ end
282
+
283
+ context "when there is a revision of each kind of policy assigned to every policy group, plus orphaned policies" do
284
+ let(:policies_by_name) do
285
+ {
286
+ "appserver" => {
287
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
288
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
289
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
290
+ },
291
+ "load-balancer" => {
292
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
293
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
294
+ "7777777777777777777777777777777777777777777777777777777777777777" => {},
295
+ },
296
+ "db" => {
297
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
298
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
299
+ "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" => {},
300
+ },
301
+ }
302
+ end
303
+
304
+ let(:policies_by_group) do
305
+ {
306
+ "dev" => {
307
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
308
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
309
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
310
+ },
311
+ "staging" => {
312
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
313
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
314
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
315
+ },
316
+ "prod" => {
317
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
318
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
319
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
320
+ },
321
+ }
322
+ end
323
+
324
+ it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
325
+ expected_output = <<~OUTPUT
326
+ appserver
327
+ =========
328
+
329
+ * dev: 1111111111
330
+ * staging: 2222222222
331
+ * prod: 2222222222
332
+
333
+ load-balancer
334
+ =============
335
+
336
+ * dev: 5555555555
337
+ * staging: 5555555555
338
+ * prod: 6666666666
339
+
340
+ db
341
+ ==
342
+
343
+ * dev: 9999999999
344
+ * staging: 9999999999
345
+ * prod: aaaaaaaaaa
346
+
347
+ OUTPUT
348
+ expect(ui.output).to eq(expected_output)
349
+ end
350
+
351
+ context "with orphans shown" do
352
+
353
+ let(:show_orphans) { true }
354
+
355
+ it "shows each policy name, followed by a list of group_name -> revision, followed by a list of orphaned policies" do
356
+ expected_output = <<~OUTPUT
357
+ appserver
358
+ =========
359
+
360
+ * dev: 1111111111
361
+ * staging: 2222222222
362
+ * prod: 2222222222
363
+
364
+ Orphaned:
365
+ ---------
366
+
367
+ * 3333333333
368
+
369
+ load-balancer
370
+ =============
371
+
372
+ * dev: 5555555555
373
+ * staging: 5555555555
374
+ * prod: 6666666666
375
+
376
+ Orphaned:
377
+ ---------
378
+
379
+ * 7777777777
380
+
381
+ db
382
+ ==
383
+
384
+ * dev: 9999999999
385
+ * staging: 9999999999
386
+ * prod: aaaaaaaaaa
387
+
388
+ Orphaned:
389
+ ---------
390
+
391
+ * bbbbbbbbbb
392
+
393
+ OUTPUT
394
+ expect(ui.output).to eq(expected_output)
395
+ end
396
+
397
+ end
398
+ end
399
+
400
+ context "when some groups do not have a revision of every policy" do
401
+ let(:policies_by_name) do
402
+ {
403
+ "appserver" => {
404
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
405
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
406
+ },
407
+ "load-balancer" => {
408
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
409
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
410
+ },
411
+ "db" => {
412
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
413
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
414
+ },
415
+ "memcache" => {
416
+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
417
+ },
418
+ }
419
+ end
420
+
421
+ let(:policies_by_group) do
422
+ {
423
+ "dev" => {
424
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
425
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
426
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
427
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
428
+ },
429
+ "staging" => {
430
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
431
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
432
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
433
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
434
+ },
435
+ "prod" => {
436
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
437
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
438
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
439
+ },
440
+ }
441
+ end
442
+
443
+ it "shows each policy name, followed by a list of group_name -> revision, omitting groups that don't have that policy" do
444
+ expected_output = <<~OUTPUT
445
+ appserver
446
+ =========
447
+
448
+ * dev: 1111111111
449
+ * staging: 2222222222
450
+ * prod: 2222222222
451
+
452
+ load-balancer
453
+ =============
454
+
455
+ * dev: 5555555555
456
+ * staging: 5555555555
457
+ * prod: 6666666666
458
+
459
+ db
460
+ ==
461
+
462
+ * dev: 9999999999
463
+ * staging: 9999999999
464
+ * prod: aaaaaaaaaa
465
+
466
+ memcache
467
+ ========
468
+
469
+ * dev: dddddddddd
470
+ * staging: dddddddddd
471
+ * prod: *NOT APPLIED*
472
+
473
+ OUTPUT
474
+ expect(ui.output).to eq(expected_output)
475
+ end
476
+
477
+ end
478
+ end
479
+ end
480
+
481
+ describe "showing a single policy" do
482
+
483
+ let(:policy_name) { "appserver" }
484
+
485
+ let(:policies_by_name) { {} }
486
+ let(:policies_by_group) { {} }
487
+
488
+ before do
489
+ policy_lister.set!(policies_by_name, policies_by_group)
490
+ end
491
+
492
+ context "when the server returns the data successfully" do
493
+
494
+ before do
495
+ policy_lister.set!(policies_by_name, policies_by_group)
496
+ policy_lister.policy_lock_content = policyfile_locks_content
497
+
498
+ show_policy_service.run
499
+ end
500
+
501
+ context "when there are no policies or groups on the server" do
502
+
503
+ let(:policies_by_name) do
504
+ {}
505
+ end
506
+
507
+ let(:policies_by_group) do
508
+ {}
509
+ end
510
+
511
+ it "prints a message to stderr that there are no copies of the policy on the server" do
512
+ expected_output = <<~OUTPUT
513
+ appserver
514
+ =========
515
+
516
+ No policies named 'appserver' are associated with a policy group
517
+
518
+ OUTPUT
519
+
520
+ expect(ui.output).to eq(expected_output)
521
+ end
522
+ end
523
+
524
+ context "when there are no revisions of the policy on the server" do
525
+
526
+ let(:policies_by_name) do
527
+ {
528
+ "load-balancer" => {
529
+ "5555555555555555555555555555555555555555555555555555555555555555" => {},
530
+ "6666666666666666666666666666666666666666666666666666666666666666" => {},
531
+ },
532
+ "db" => {
533
+ "9999999999999999999999999999999999999999999999999999999999999999" => {},
534
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" => {},
535
+ },
536
+ "memcache" => {
537
+ "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" => {},
538
+ },
539
+ }
540
+ end
541
+
542
+ let(:policies_by_group) do
543
+ {
544
+ "dev" => {
545
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
546
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
547
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
548
+ },
549
+ "staging" => {
550
+ "load-balancer" => "5555555555555555555555555555555555555555555555555555555555555555",
551
+ "db" => "9999999999999999999999999999999999999999999999999999999999999999",
552
+ "memcache" => "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
553
+ },
554
+ "prod" => {
555
+ "load-balancer" => "6666666666666666666666666666666666666666666666666666666666666666",
556
+ "db" => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
557
+ },
558
+ }
559
+ end
560
+
561
+ it "prints a message to stderr that there are no copies of the policy on the server" do
562
+ expected_output = <<~OUTPUT
563
+ appserver
564
+ =========
565
+
566
+ No policies named 'appserver' are associated with a policy group
567
+
568
+ OUTPUT
569
+
570
+ expect(ui.output).to eq(expected_output)
571
+ end
572
+
573
+ end
574
+
575
+ context "when all policies are orphaned and orphans are not shown" do
576
+ let(:policies_by_name) do
577
+ {
578
+ "appserver" => {
579
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
580
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
581
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
582
+ },
583
+ }
584
+
585
+ end
586
+
587
+ let(:policies_by_group) do
588
+ {}
589
+ end
590
+
591
+ it "explains that no policies are assigned to a group" do
592
+ expected_output = <<~OUTPUT
593
+ appserver
594
+ =========
595
+
596
+ No policies named 'appserver' are associated with a policy group
597
+
598
+ OUTPUT
599
+
600
+ expect(ui.output).to eq(expected_output)
601
+ end
602
+ end
603
+
604
+ context "when all policy groups have the same revision of the policy" do
605
+
606
+ let(:policies_by_name) do
607
+ {
608
+ "appserver" => {
609
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
610
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
611
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
612
+ },
613
+ }
614
+
615
+ end
616
+
617
+ let(:policies_by_group) do
618
+ {
619
+ "dev" => {
620
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
621
+ },
622
+ "staging" => {
623
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
624
+ },
625
+ "prod" => {
626
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
627
+ },
628
+ }
629
+ end
630
+ it "lists each of the groups with the associated revision" do
631
+ expected_output = <<~OUTPUT
632
+ appserver
633
+ =========
634
+
635
+ * dev: 2222222222
636
+ * staging: 2222222222
637
+ * prod: 2222222222
638
+
639
+ OUTPUT
640
+ expect(ui.output).to eq(expected_output)
641
+ end
642
+
643
+ end
644
+
645
+ context "when policy groups have revisions with differing cookbooks" do
646
+
647
+ let(:policies_by_name) do
648
+ {
649
+ "appserver" => {
650
+ "1111111111111111111111111111111111111111111111111111111111111111" => {},
651
+ "2222222222222222222222222222222222222222222222222222222222222222" => {},
652
+ "3333333333333333333333333333333333333333333333333333333333333333" => {},
653
+ },
654
+ }
655
+
656
+ end
657
+
658
+ let(:policies_by_group) do
659
+ {
660
+ "dev" => {
661
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
662
+ },
663
+ "staging" => {
664
+ "appserver" => "2222222222222222222222222222222222222222222222222222222222222222",
665
+ },
666
+ "prod" => {
667
+ "appserver" => "1111111111111111111111111111111111111111111111111111111111111111",
668
+ },
669
+ }
670
+ end
671
+
672
+ it "lists each of the groups with the associated revision" do
673
+ expected_output = <<~OUTPUT
674
+ appserver
675
+ =========
676
+
677
+ * dev: 2222222222
678
+ * staging: 2222222222
679
+ * prod: 1111111111
680
+
681
+ OUTPUT
682
+ expect(ui.output).to eq(expected_output)
683
+ end
684
+
685
+ context "when the diff summary option is given" do
686
+
687
+ let(:appserver_lock_contents_111) do
688
+ {
689
+ "cookbook_locks" => {
690
+ "apache2" => {
691
+ "version" => "2.1.3",
692
+ "identifier" => "abcdef" + ("0" * 34),
693
+ },
694
+ "yum" => {
695
+ "version" => "4.5.6",
696
+ "identifier" => "123abc" + ("0" * 34),
697
+ },
698
+ "apt" => {
699
+ "version" => "10.0.0",
700
+ "identifier" => "ffffff" + ("0" * 34),
701
+ },
702
+
703
+ },
704
+ }
705
+ end
706
+
707
+ let(:appserver_lock_contents_222) do
708
+ {
709
+ "cookbook_locks" => {
710
+ "apache2" => {
711
+ "version" => "2.0.5",
712
+ "identifier" => "aaa123" + ("0" * 34),
713
+ },
714
+ "yum" => {
715
+ "version" => "4.5.2",
716
+ "identifier" => "867530" + ("9" * 34),
717
+ },
718
+ "apt" => {
719
+ "version" => "10.0.0",
720
+ "identifier" => "ffffff" + ("0" * 34),
721
+ },
722
+ "other_cookbook" => {
723
+ "version" => "9.8.7",
724
+ "identifier" => "113113" + ("0" * 34),
725
+ },
726
+ },
727
+ }
728
+ end
729
+
730
+ let(:policyfile_locks_content) do
731
+ {
732
+ "appserver" => {
733
+ "1111111111111111111111111111111111111111111111111111111111111111" => appserver_lock_contents_111,
734
+ "2222222222222222222222222222222222222222222222222222222222222222" => appserver_lock_contents_222,
735
+ },
736
+ }
737
+ end
738
+
739
+ let(:summary_diff) { true }
740
+
741
+ it "lists each of the groups and displays the version and identifier of the differing cookbooks" do
742
+ expected_output = <<~OUTPUT
743
+ appserver
744
+ =========
745
+
746
+ dev: 2222222222
747
+ -------------------
748
+
749
+ * apache2: 2.0.5 (aaa1230000)
750
+ * yum: 4.5.2 (8675309999)
751
+ * other_cookbook: 9.8.7 (1131130000)
752
+
753
+ staging: 2222222222
754
+ -------------------
755
+
756
+ * apache2: 2.0.5 (aaa1230000)
757
+ * yum: 4.5.2 (8675309999)
758
+ * other_cookbook: 9.8.7 (1131130000)
759
+
760
+ prod: 1111111111
761
+ -------------------
762
+
763
+ * apache2: 2.1.3 (abcdef0000)
764
+ * yum: 4.5.6 (123abc0000)
765
+ * other_cookbook: *NONE*
766
+
767
+ OUTPUT
768
+ expect(ui.output).to eq(expected_output)
769
+ end
770
+ end
771
+
772
+ context "when orphans are displayed" do
773
+
774
+ let(:show_orphans) { true }
775
+
776
+ it "lists each of the groups, then lists the orphaned revisions" do
777
+ expected_output = <<~OUTPUT
778
+ appserver
779
+ =========
780
+
781
+ * dev: 2222222222
782
+ * staging: 2222222222
783
+ * prod: 1111111111
784
+
785
+ Orphaned:
786
+ ---------
787
+
788
+ * 3333333333
789
+
790
+ OUTPUT
791
+
792
+ expect(ui.output).to eq(expected_output)
793
+ end
794
+
795
+ end
796
+ end
797
+
798
+ end
799
+ end # showing a single policy
800
+
801
+ describe "show policy in a specific policy group" do
802
+
803
+ let(:policy_name) { "appserver" }
804
+
805
+ let(:policy_group) { "dev" }
806
+
807
+ let(:http_client) { instance_double("Chef::ServerAPI", url: "https://chef.example/organizations/monkeynews") }
808
+
809
+ before do
810
+ allow(show_policy_service).to receive(:http_client).and_return(http_client)
811
+ end
812
+
813
+ it "enables show_policy_revision" do
814
+ expect(show_policy_service.show_policy_revision?).to be(true)
815
+ end
816
+
817
+ context "when there is no policy assigned for the given name and group" do
818
+
819
+ let(:response) do
820
+ Net::HTTPResponse.send(:response_class, "404").new("1.0", "404", "Not Found").tap do |r|
821
+ r.instance_variable_set(:@body, "nope")
822
+ end
823
+ end
824
+
825
+ let(:http_exception) do
826
+ begin
827
+ response.error!
828
+ rescue => e
829
+ e
830
+ end
831
+ end
832
+
833
+ before do
834
+ expect(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_raise(http_exception)
835
+ end
836
+
837
+ it "prints a message saying there is no policy assigned" do
838
+ message = "No Policyfile lock named 'appserver' found in policy_group 'dev' at https://chef.example/organizations/monkeynews"
839
+ expect { show_policy_service.run }.to raise_error(ChefCLI::PolicyfileDownloadError, message)
840
+ end
841
+
842
+ end
843
+
844
+ context "when the policy exists" do
845
+
846
+ let(:policyfile_lock_data) do
847
+ {
848
+ "revision_id" => "cf5b8a020bdc1ba6914093a8a07a5514cce8a3a2979a967b1f32ea704a61785b",
849
+ "name" => "example",
850
+ "run_list" => [ "recipe[omnibus::default]" ],
851
+ "cookbook_locks" => {
852
+ "omnibus" => {
853
+ "version" => "2.2.0",
854
+ "identifier" => "64b3e64306cff223206348e46af545b19032b170",
855
+ "dotted_decimal_identifier" => "28345299219435506.9887234981653237.76628930769264",
856
+ "cache_key" => "omnibus-2cf98f9797cacce9c8688fc4e74858b858e2bc14",
857
+ "origin" => "git@github.com:opscode-cookbooks/omnibus.git",
858
+ "source_options" => {
859
+ "git" => "git@github.com:opscode-cookbooks/omnibus.git",
860
+ "revision" => "2cf98f9797cacce9c8688fc4e74858b858e2bc14",
861
+ "branch" => "master",
862
+ },
863
+ },
864
+ },
865
+ }
866
+ end
867
+
868
+ let(:policyfile_lock_json) { FFI_Yajl::Encoder.encode(policyfile_lock_data, pretty: true) }
869
+
870
+ let(:pager) { instance_double("ChefCLI::Pager", ui: ui) }
871
+
872
+ before do
873
+ allow(ChefCLI::Pager).to receive(:new).and_return(pager)
874
+ allow(pager).to receive(:with_pager).and_yield(pager)
875
+ allow(http_client).to receive(:get).with("policy_groups/dev/policies/appserver").and_return(policyfile_lock_data)
876
+ end
877
+
878
+ it "displays the policy" do
879
+ show_policy_service.run
880
+ expect(ui.output).to include(policyfile_lock_json)
881
+ end
882
+
883
+ end
884
+
885
+ end
886
+
887
+ end