chef-dk 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +190 -190
- data/Gemfile +26 -0
- data/LICENSE +201 -201
- data/README.md +276 -276
- data/Rakefile +18 -18
- data/bin/chef +25 -25
- data/lib/chef-dk.rb +19 -19
- data/lib/chef-dk/authenticated_http.rb +40 -40
- data/lib/chef-dk/builtin_commands.rb +60 -60
- data/lib/chef-dk/chef_runner.rb +98 -98
- data/lib/chef-dk/cli.rb +200 -200
- data/lib/chef-dk/command/base.rb +79 -75
- data/lib/chef-dk/command/clean_policy_cookbooks.rb +116 -116
- data/lib/chef-dk/command/clean_policy_revisions.rb +113 -113
- data/lib/chef-dk/command/delete_policy.rb +122 -122
- data/lib/chef-dk/command/delete_policy_group.rb +122 -122
- data/lib/chef-dk/command/diff.rb +316 -316
- data/lib/chef-dk/command/env.rb +90 -90
- data/lib/chef-dk/command/exec.rb +45 -45
- data/lib/chef-dk/command/export.rb +151 -153
- data/lib/chef-dk/command/gem.rb +47 -47
- data/lib/chef-dk/command/generate.rb +120 -118
- data/lib/chef-dk/command/generator_commands.rb +80 -80
- data/lib/chef-dk/command/generator_commands/app.rb +107 -107
- data/lib/chef-dk/command/generator_commands/attribute.rb +37 -37
- data/lib/chef-dk/command/generator_commands/base.rb +121 -121
- data/lib/chef-dk/command/generator_commands/cookbook.rb +119 -108
- data/lib/chef-dk/command/generator_commands/cookbook_code_file.rb +100 -100
- data/lib/chef-dk/command/generator_commands/cookbook_file.rb +45 -45
- data/lib/chef-dk/command/generator_commands/generator_generator.rb +177 -0
- data/lib/chef-dk/command/generator_commands/lwrp.rb +36 -36
- data/lib/chef-dk/command/generator_commands/policyfile.rb +86 -83
- data/lib/chef-dk/command/generator_commands/recipe.rb +36 -36
- data/lib/chef-dk/command/generator_commands/repo.rb +96 -96
- data/lib/chef-dk/command/generator_commands/template.rb +46 -46
- data/lib/chef-dk/command/install.rb +121 -121
- data/lib/chef-dk/command/provision.rb +438 -438
- data/lib/chef-dk/command/push.rb +118 -118
- data/lib/chef-dk/command/push_archive.rb +126 -126
- data/lib/chef-dk/command/shell_init.rb +180 -180
- data/lib/chef-dk/command/show_policy.rb +165 -165
- data/lib/chef-dk/command/undelete.rb +155 -155
- data/lib/chef-dk/command/update.rb +129 -129
- data/lib/chef-dk/command/verify.rb +490 -453
- data/lib/chef-dk/commands_map.rb +115 -115
- data/lib/chef-dk/completions/bash.sh.erb +5 -5
- data/lib/chef-dk/completions/chef.fish.erb +10 -10
- data/lib/chef-dk/completions/zsh.zsh.erb +21 -21
- data/lib/chef-dk/component_test.rb +171 -171
- data/lib/chef-dk/configurable.rb +57 -52
- data/lib/chef-dk/cookbook_metadata.rb +45 -45
- data/lib/chef-dk/cookbook_omnifetch.rb +32 -32
- data/lib/chef-dk/cookbook_profiler/git.rb +151 -151
- data/lib/chef-dk/cookbook_profiler/identifiers.rb +72 -72
- data/lib/chef-dk/cookbook_profiler/null_scm.rb +32 -32
- data/lib/chef-dk/exceptions.rb +113 -113
- data/lib/chef-dk/generator.rb +163 -162
- data/lib/chef-dk/helpers.rb +159 -159
- data/lib/chef-dk/pager.rb +106 -106
- data/lib/chef-dk/policyfile/chef_repo_cookbook_source.rb +122 -122
- data/lib/chef-dk/policyfile/chef_server_cookbook_source.rb +54 -54
- data/lib/chef-dk/policyfile/community_cookbook_source.rb +82 -82
- data/lib/chef-dk/policyfile/comparison_base.rb +124 -124
- data/lib/chef-dk/policyfile/cookbook_location_specification.rb +133 -133
- data/lib/chef-dk/policyfile/cookbook_locks.rb +466 -466
- data/lib/chef-dk/policyfile/cookbook_sources.rb +21 -21
- data/lib/chef-dk/policyfile/differ.rb +266 -266
- data/lib/chef-dk/policyfile/dsl.rb +197 -197
- data/lib/chef-dk/policyfile/lister.rb +232 -232
- data/lib/chef-dk/policyfile/null_cookbook_source.rb +45 -45
- data/lib/chef-dk/policyfile/read_cookbook_for_compat_mode_upload.rb +124 -124
- data/lib/chef-dk/policyfile/reports/install.rb +70 -70
- data/lib/chef-dk/policyfile/reports/table_printer.rb +58 -58
- data/lib/chef-dk/policyfile/reports/upload.rb +70 -70
- data/lib/chef-dk/policyfile/solution_dependencies.rb +298 -298
- data/lib/chef-dk/policyfile/storage_config.rb +100 -100
- data/lib/chef-dk/policyfile/undo_record.rb +142 -142
- data/lib/chef-dk/policyfile/undo_stack.rb +130 -130
- data/lib/chef-dk/policyfile/uploader.rb +213 -213
- data/lib/chef-dk/policyfile_compiler.rb +322 -322
- data/lib/chef-dk/policyfile_lock.rb +552 -552
- data/lib/chef-dk/policyfile_services/clean_policies.rb +95 -95
- data/lib/chef-dk/policyfile_services/clean_policy_cookbooks.rb +125 -125
- data/lib/chef-dk/policyfile_services/export_repo.rb +309 -281
- data/lib/chef-dk/policyfile_services/install.rb +125 -125
- data/lib/chef-dk/policyfile_services/push.rb +114 -114
- data/lib/chef-dk/policyfile_services/push_archive.rb +173 -173
- data/lib/chef-dk/policyfile_services/rm_policy.rb +142 -142
- data/lib/chef-dk/policyfile_services/rm_policy_group.rb +86 -86
- data/lib/chef-dk/policyfile_services/show_policy.rb +237 -237
- data/lib/chef-dk/policyfile_services/undelete.rb +108 -108
- data/lib/chef-dk/policyfile_services/update_attributes.rb +104 -104
- data/lib/chef-dk/service_exception_inspectors.rb +25 -25
- data/lib/chef-dk/service_exception_inspectors/base.rb +40 -40
- data/lib/chef-dk/service_exception_inspectors/http.rb +121 -121
- data/lib/chef-dk/service_exceptions.rb +143 -143
- data/lib/chef-dk/shell_out.rb +36 -36
- data/lib/chef-dk/skeletons/code_generator/files/default/Berksfile +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/chefignore +100 -100
- data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README-policy.md +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/cookbook_readmes/README.md +54 -54
- data/lib/chef-dk/skeletons/code_generator/files/default/gitignore +16 -16
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/README.md +28 -28
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/README.md +27 -0
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/attributes/default.rb +7 -7
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/metadata.rb +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/cookbooks/example/recipes/default.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/README.md +57 -57
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/data_bags/example/example_item.json +3 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/README.md +9 -9
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/environments/example.json +12 -12
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/README.md +8 -8
- data/lib/chef-dk/skeletons/code_generator/files/default/repo/roles/example.json +12 -12
- data/lib/chef-dk/skeletons/code_generator/files/default/serverspec_spec_helper.rb +8 -3
- data/lib/chef-dk/skeletons/code_generator/files/default/spec_helper.rb +2 -2
- data/lib/chef-dk/skeletons/code_generator/metadata.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/recipes/app.rb +97 -97
- data/lib/chef-dk/skeletons/code_generator/recipes/attribute.rb +12 -12
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook.rb +104 -92
- data/lib/chef-dk/skeletons/code_generator/recipes/cookbook_file.rb +24 -24
- data/lib/chef-dk/skeletons/code_generator/recipes/lwrp.rb +23 -23
- data/lib/chef-dk/skeletons/code_generator/recipes/policyfile.rb +8 -8
- data/lib/chef-dk/skeletons/code_generator/recipes/recipe.rb +27 -27
- data/lib/chef-dk/skeletons/code_generator/recipes/repo.rb +48 -47
- data/lib/chef-dk/skeletons/code_generator/recipes/template.rb +32 -32
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.all_rights.erb +3 -3
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.apache2.erb +201 -201
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv2.erb +339 -339
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.gplv3.erb +674 -674
- data/lib/chef-dk/skeletons/code_generator/templates/default/LICENSE.mit.erb +21 -21
- data/lib/chef-dk/skeletons/code_generator/templates/default/Policyfile.rb.erb +20 -16
- data/lib/chef-dk/skeletons/code_generator/templates/default/README.md.erb +4 -4
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen.yml.erb +16 -16
- data/lib/chef-dk/skeletons/code_generator/templates/default/kitchen_policyfile.yml.erb +27 -0
- data/lib/chef-dk/skeletons/code_generator/templates/default/metadata.rb.erb +7 -7
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe.rb.erb +5 -5
- data/lib/chef-dk/skeletons/code_generator/templates/default/recipe_spec.rb.erb +20 -20
- data/lib/chef-dk/skeletons/code_generator/templates/default/repo/gitignore.erb +11 -11
- data/lib/chef-dk/skeletons/code_generator/templates/default/serverspec_default_spec.rb.erb +9 -9
- data/lib/chef-dk/ui.rb +58 -58
- data/lib/chef-dk/version.rb +20 -20
- data/lib/kitchen/provisioner/policyfile_zero.rb +193 -164
- data/spec/shared/a_file_generator.rb +125 -125
- data/spec/shared/a_generated_file.rb +12 -12
- data/spec/shared/command_with_ui_object.rb +11 -11
- data/spec/shared/custom_generator_cookbook.rb +117 -117
- data/spec/shared/fixture_cookbook_checksums.rb +47 -47
- data/spec/shared/setup_git_cookbooks.rb +53 -53
- data/spec/spec_helper.rb +49 -48
- data/spec/test_helpers.rb +84 -84
- data/spec/unit/chef_runner_spec.rb +111 -110
- data/spec/unit/cli_spec.rb +357 -357
- data/spec/unit/command/base_spec.rb +169 -136
- data/spec/unit/command/clean_policy_cookbooks_spec.rb +181 -181
- data/spec/unit/command/clean_policy_revisions_spec.rb +181 -181
- data/spec/unit/command/delete_policy_group_spec.rb +207 -207
- data/spec/unit/command/delete_policy_spec.rb +207 -207
- data/spec/unit/command/diff_spec.rb +312 -312
- data/spec/unit/command/env_spec.rb +52 -52
- data/spec/unit/command/exec_spec.rb +179 -179
- data/spec/unit/command/export_spec.rb +189 -189
- data/spec/unit/command/generate_spec.rb +142 -142
- data/spec/unit/command/generator_commands/app_spec.rb +169 -169
- data/spec/unit/command/generator_commands/attribute_spec.rb +32 -32
- data/spec/unit/command/generator_commands/cookbook_file_spec.rb +32 -32
- data/spec/unit/command/generator_commands/cookbook_spec.rb +320 -240
- data/spec/unit/command/generator_commands/generator_generator_spec.rb +229 -0
- data/spec/unit/command/generator_commands/lwrp_spec.rb +32 -32
- data/spec/unit/command/generator_commands/policyfile_spec.rb +125 -125
- data/spec/unit/command/generator_commands/recipe_spec.rb +34 -34
- data/spec/unit/command/generator_commands/repo_spec.rb +283 -283
- data/spec/unit/command/generator_commands/template_spec.rb +32 -32
- data/spec/unit/command/install_spec.rb +179 -179
- data/spec/unit/command/provision_spec.rb +592 -592
- data/spec/unit/command/push_archive_spec.rb +153 -153
- data/spec/unit/command/push_spec.rb +199 -199
- data/spec/unit/command/shell_init_spec.rb +329 -329
- data/spec/unit/command/show_policy_spec.rb +235 -235
- data/spec/unit/command/undelete_spec.rb +246 -246
- data/spec/unit/command/update_spec.rb +251 -251
- data/spec/unit/command/verify_spec.rb +323 -322
- data/spec/unit/commands_map_spec.rb +57 -57
- data/spec/unit/component_test_spec.rb +126 -126
- data/spec/unit/cookbook_metadata_spec.rb +98 -98
- data/spec/unit/cookbook_profiler/git_spec.rb +176 -176
- data/spec/unit/cookbook_profiler/identifiers_spec.rb +83 -83
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_one.rb +9 -9
- data/spec/unit/fixtures/chef-runner-cookbooks/test_cookbook/recipes/recipe_two.rb +9 -9
- data/spec/unit/fixtures/command/cli_test_command.rb +26 -26
- data/spec/unit/fixtures/command/explicit_path_example.rb +7 -7
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/baz-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/dep_of_bar-1.2.3/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/.kitchen.yml +16 -16
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/Berksfile +3 -3
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/README.md +4 -4
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/chefignore +96 -96
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/metadata.rb +8 -8
- data/spec/unit/fixtures/cookbook_cache/foo-1.0.0/recipes/default.rb +8 -8
- data/spec/unit/fixtures/cookbooks_api/pruned_small_universe.json +1321 -1321
- data/spec/unit/fixtures/cookbooks_api/small_universe.json +2987 -2987
- data/spec/unit/fixtures/cookbooks_api/universe.json +1 -1
- data/spec/unit/fixtures/cookbooks_api/update_fixtures.rb +36 -36
- data/spec/unit/fixtures/dev_cookbooks/README.md +16 -16
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/integration_test +2 -2
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/berkshelf/verify_me +5 -5
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/chef/verify_me +3 -3
- data/spec/unit/fixtures/eg_omnibus_dir/valid/embedded/apps/test-kitchen/verify_me +2 -2
- data/spec/unit/fixtures/example_cookbook/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/example_cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/metadata.json +5 -5
- data/spec/unit/fixtures/example_cookbook_metadata_json_only/recipes/default.rb +8 -8
- data/spec/unit/fixtures/example_cookbook_no_metadata/.gitignore +17 -17
- data/spec/unit/fixtures/example_cookbook_no_metadata/.kitchen.yml +16 -16
- data/spec/unit/fixtures/example_cookbook_no_metadata/Berksfile +3 -3
- data/spec/unit/fixtures/example_cookbook_no_metadata/README.md +4 -4
- data/spec/unit/fixtures/example_cookbook_no_metadata/chefignore +96 -96
- data/spec/unit/fixtures/example_cookbook_no_metadata/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/another-local-cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/Berksfile +3 -3
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/metadata.rb +9 -9
- data/spec/unit/fixtures/local_path_cookbooks/cookbook-with-a-dep/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/.kitchen.yml +16 -16
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/Berksfile +3 -3
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/chefignore +96 -96
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/local-cookbook/recipes/default.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/metadata-missing/README.md +2 -2
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/.kitchen.yml +16 -16
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/README.md +4 -4
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/metadata.rb +8 -8
- data/spec/unit/fixtures/local_path_cookbooks/noignore-f59ee7a5bca6a4e606b67f7f856b768d847c39bb/recipes/default.rb +8 -8
- data/spec/unit/generator_spec.rb +120 -120
- data/spec/unit/helpers_spec.rb +92 -92
- data/spec/unit/pager_spec.rb +119 -119
- data/spec/unit/policyfile/chef_repo_cookbook_source_spec.rb +66 -66
- data/spec/unit/policyfile/chef_server_cookbook_source_spec.rb +34 -34
- data/spec/unit/policyfile/community_cookbook_source_spec.rb +51 -51
- data/spec/unit/policyfile/comparison_base_spec.rb +343 -343
- data/spec/unit/policyfile/cookbook_location_specification_spec.rb +252 -252
- data/spec/unit/policyfile/cookbook_locks_spec.rb +529 -529
- data/spec/unit/policyfile/differ_spec.rb +687 -687
- data/spec/unit/policyfile/lister_spec.rb +272 -272
- data/spec/unit/policyfile/null_cookbook_source_spec.rb +35 -35
- data/spec/unit/policyfile/read_cookbook_for_compat_mode_upload_spec.rb +92 -92
- data/spec/unit/policyfile/reports/install_spec.rb +115 -115
- data/spec/unit/policyfile/reports/upload_spec.rb +96 -96
- data/spec/unit/policyfile/solution_dependencies_spec.rb +145 -145
- data/spec/unit/policyfile/storage_config_spec.rb +172 -172
- data/spec/unit/policyfile/undo_record_spec.rb +260 -260
- data/spec/unit/policyfile/undo_stack_spec.rb +266 -266
- data/spec/unit/policyfile/uploader_spec.rb +410 -410
- data/spec/unit/policyfile_demands_spec.rb +876 -876
- data/spec/unit/policyfile_evaluation_spec.rb +441 -441
- data/spec/unit/policyfile_lock_build_spec.rb +1056 -1056
- data/spec/unit/policyfile_lock_install_spec.rb +138 -138
- data/spec/unit/policyfile_lock_serialization_spec.rb +425 -425
- data/spec/unit/policyfile_lock_validation_spec.rb +611 -611
- data/spec/unit/policyfile_services/clean_policies_spec.rb +236 -236
- data/spec/unit/policyfile_services/clean_policy_cookbooks_spec.rb +275 -275
- data/spec/unit/policyfile_services/export_repo_spec.rb +439 -416
- data/spec/unit/policyfile_services/install_spec.rb +191 -191
- data/spec/unit/policyfile_services/push_archive_spec.rb +345 -345
- data/spec/unit/policyfile_services/push_spec.rb +233 -233
- data/spec/unit/policyfile_services/rm_policy_group_spec.rb +241 -241
- data/spec/unit/policyfile_services/rm_policy_spec.rb +266 -266
- data/spec/unit/policyfile_services/show_policy_spec.rb +889 -889
- data/spec/unit/policyfile_services/undelete_spec.rb +304 -304
- data/spec/unit/policyfile_services/update_attributes_spec.rb +217 -217
- data/spec/unit/service_exception_inspectors/base_spec.rb +43 -43
- data/spec/unit/service_exception_inspectors/http_spec.rb +140 -140
- data/spec/unit/shell_out_spec.rb +34 -34
- metadata +9 -3
|
@@ -1,266 +1,266 @@
|
|
|
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-dk/policyfile/undo_stack'
|
|
20
|
-
|
|
21
|
-
describe ChefDK::Policyfile::UndoStack do
|
|
22
|
-
|
|
23
|
-
let(:chefdk_home) { File.join(tempdir, "chefdk_home", ".chefdk") }
|
|
24
|
-
|
|
25
|
-
let(:policy_revision) do
|
|
26
|
-
{
|
|
27
|
-
"name" => "appserver",
|
|
28
|
-
"revision_id" => "1111111111111111111111111111111111111111111111111111111111111111"
|
|
29
|
-
}
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
let(:undo_record) do
|
|
33
|
-
ChefDK::Policyfile::UndoRecord.new.tap do |undo_record|
|
|
34
|
-
undo_record.add_policy_group("preprod")
|
|
35
|
-
undo_record.add_policy_revision("appserver", "preprod", policy_revision)
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Probably takes a Chef::Config as an arg?
|
|
40
|
-
subject(:undo_stack) { described_class.new }
|
|
41
|
-
|
|
42
|
-
let(:expected_undo_dir) { File.join(chefdk_home, "undo") }
|
|
43
|
-
|
|
44
|
-
def undo_stack_files
|
|
45
|
-
Dir[File.join(expected_undo_dir, "*")]
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
before do
|
|
49
|
-
clear_tempdir
|
|
50
|
-
allow(ChefDK::Helpers).to receive(:chefdk_home).and_return(chefdk_home)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
after(:all) do
|
|
54
|
-
clear_tempdir
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "uses chefdk_home to infer the location of the undo directory" do
|
|
58
|
-
expect(undo_stack.undo_dir).to eq(expected_undo_dir)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
context "when there are no undo records" do
|
|
62
|
-
|
|
63
|
-
it "has zero items" do
|
|
64
|
-
expect(undo_stack.size).to eq(0)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
it "is empty" do
|
|
68
|
-
expect(undo_stack).to be_empty
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
it "has no items to iterate over" do
|
|
72
|
-
expect { |b| undo_stack.each_with_id(&b) }.to_not yield_control
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
it "has an empty list of undo records" do
|
|
76
|
-
expect(undo_stack.undo_records).to eq([])
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
it "raises an error when attempting to pop an item from the stack" do
|
|
80
|
-
expect { undo_stack.pop }.to raise_error(ChefDK::CantUndo)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
describe "pushing an undo record" do
|
|
84
|
-
|
|
85
|
-
before do
|
|
86
|
-
expect(File.exist?(chefdk_home)).to be(false)
|
|
87
|
-
expect(File.exist?(expected_undo_dir)).to be(false)
|
|
88
|
-
|
|
89
|
-
undo_stack.push(undo_record)
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
it "creates the undo directory" do
|
|
93
|
-
expect(File.exist?(chefdk_home)).to be(true)
|
|
94
|
-
expect(File.exist?(expected_undo_dir)).to be(true)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "creates the undo record" do
|
|
98
|
-
expect(undo_stack_files.size).to eq(1)
|
|
99
|
-
|
|
100
|
-
undo_record_json = IO.read(undo_stack_files.first)
|
|
101
|
-
undo_record_data = FFI_Yajl::Parser.parse(undo_record_json)
|
|
102
|
-
expect(undo_record_data).to eq(undo_record.for_serialization)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
context "when there is one undo record" do
|
|
110
|
-
|
|
111
|
-
# `Time.new` is stubbed later on, need to force it to be evaluated before
|
|
112
|
-
# then.
|
|
113
|
-
let!(:start_time) { Time.new }
|
|
114
|
-
|
|
115
|
-
let(:expected_id) { start_time.utc.strftime("%Y%m%d%H%M%S") }
|
|
116
|
-
|
|
117
|
-
let(:missing_id) { (start_time + 1).utc.strftime("%Y%m%d%H%M%S") }
|
|
118
|
-
|
|
119
|
-
before do
|
|
120
|
-
allow(Time).to receive(:new).and_return(start_time)
|
|
121
|
-
undo_stack.push(undo_record)
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "creates the item on disk" do
|
|
125
|
-
expect(File).to be_directory(undo_stack.undo_dir)
|
|
126
|
-
expect(undo_stack_files.size).to eq(1)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it "has one item" do
|
|
130
|
-
expect(undo_stack.size).to eq(1)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
it "is not empty" do
|
|
134
|
-
expect(undo_stack).to_not be_empty
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
it "checks whether a record exists by id" do
|
|
138
|
-
expect(undo_stack).to have_id(expected_id)
|
|
139
|
-
expect(undo_stack).to_not have_id(missing_id)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "deletes a record by id" do
|
|
143
|
-
expect(undo_stack.delete(expected_id)).to eq(undo_record)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
it "deletes a record by id and yields it" do
|
|
147
|
-
expect { |b| undo_stack.delete(expected_id, &b) }.to yield_with_args(undo_record)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
it "fails to delete a record that doesn't exist" do
|
|
151
|
-
expect { undo_stack.delete(missing_id) }.to raise_error(ChefDK::UndoRecordNotFound)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
it "pops the last record" do
|
|
155
|
-
expect(undo_stack.pop).to eq(undo_record)
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
it "pops the last record and yields it" do
|
|
159
|
-
expect { |b| undo_stack.pop(&b) }.to yield_with_args(undo_record)
|
|
160
|
-
end
|
|
161
|
-
|
|
162
|
-
it "iterates over the records" do
|
|
163
|
-
expect { |b| undo_stack.each_with_id(&b) }.to yield_successive_args([expected_id, undo_record])
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
it "has the undo record that was pushed" do
|
|
167
|
-
expect(undo_stack.undo_records.size).to eq(1)
|
|
168
|
-
expect(undo_stack.undo_records).to eq( [ undo_record ] )
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
context "and the record is removed" do
|
|
172
|
-
|
|
173
|
-
let!(:popped_record) { undo_stack.pop }
|
|
174
|
-
|
|
175
|
-
it "has no items" do
|
|
176
|
-
expect(undo_stack_files.size).to eq(0)
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
context "when the stack is at the maximum configured size" do
|
|
185
|
-
# `Time.new` is stubbed later on, need to force it to be evaluated before
|
|
186
|
-
# then.
|
|
187
|
-
let!(:start_time) { Time.new }
|
|
188
|
-
|
|
189
|
-
def next_time
|
|
190
|
-
@increment ||= 0
|
|
191
|
-
@increment += 1
|
|
192
|
-
|
|
193
|
-
start_time + @increment
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def incremented_undo_record(i)
|
|
197
|
-
record = {
|
|
198
|
-
"name" => "appserver",
|
|
199
|
-
"revision_id" => i.to_s * 64
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
ChefDK::Policyfile::UndoRecord.new.tap do |undo_record|
|
|
203
|
-
undo_record.description = "delete-policy-group preprod-#{i}"
|
|
204
|
-
undo_record.add_policy_group("preprod-#{i}")
|
|
205
|
-
undo_record.add_policy_revision("appserver", "preprod-#{i}", record)
|
|
206
|
-
end
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
before do
|
|
210
|
-
## # UndoStack assumes you're not creating more than 1 undo record/second,
|
|
211
|
-
## # which is reasonable in the real world but won't work here.
|
|
212
|
-
allow(Time).to receive(:new) { next_time }
|
|
213
|
-
|
|
214
|
-
10.times { |i| undo_stack.push(incremented_undo_record(i)) }
|
|
215
|
-
|
|
216
|
-
expect(undo_stack_files.size).to eq(10)
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
describe "pushing a new undo record" do
|
|
220
|
-
it "does not exceed the maximum size" do
|
|
221
|
-
undo_stack.push(incremented_undo_record(11))
|
|
222
|
-
|
|
223
|
-
expect(undo_stack_files.size).to eq(10)
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
it "removes the oldest record" do
|
|
227
|
-
oldest_record_file = undo_stack_files.sort.first
|
|
228
|
-
|
|
229
|
-
undo_stack.push(incremented_undo_record(11))
|
|
230
|
-
|
|
231
|
-
expect(File.exist?(oldest_record_file)).to be(false)
|
|
232
|
-
end
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
context "when the stack is above maximum configured size" do
|
|
236
|
-
|
|
237
|
-
let(:older_record_path) do
|
|
238
|
-
record_id = (Time.new - (3600 * 24)).utc.strftime("%Y%m%d%H%M%S")
|
|
239
|
-
File.join(expected_undo_dir, record_id)
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
before do
|
|
243
|
-
FileUtils.touch(older_record_path)
|
|
244
|
-
expect(undo_stack_files.size).to eq(11)
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
describe "pushing a new undo record" do
|
|
248
|
-
it "does not exceed the maximum size" do
|
|
249
|
-
undo_stack.push(incremented_undo_record(11))
|
|
250
|
-
|
|
251
|
-
expect(undo_stack_files.size).to eq(10)
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
it "removes the oldest record" do
|
|
255
|
-
oldest_record_file = undo_stack_files.sort.first
|
|
256
|
-
|
|
257
|
-
undo_stack.push(incremented_undo_record(11))
|
|
258
|
-
|
|
259
|
-
expect(File.exist?(oldest_record_file)).to be(false)
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
end
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
end
|
|
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-dk/policyfile/undo_stack'
|
|
20
|
+
|
|
21
|
+
describe ChefDK::Policyfile::UndoStack do
|
|
22
|
+
|
|
23
|
+
let(:chefdk_home) { File.join(tempdir, "chefdk_home", ".chefdk") }
|
|
24
|
+
|
|
25
|
+
let(:policy_revision) do
|
|
26
|
+
{
|
|
27
|
+
"name" => "appserver",
|
|
28
|
+
"revision_id" => "1111111111111111111111111111111111111111111111111111111111111111"
|
|
29
|
+
}
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
let(:undo_record) do
|
|
33
|
+
ChefDK::Policyfile::UndoRecord.new.tap do |undo_record|
|
|
34
|
+
undo_record.add_policy_group("preprod")
|
|
35
|
+
undo_record.add_policy_revision("appserver", "preprod", policy_revision)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Probably takes a Chef::Config as an arg?
|
|
40
|
+
subject(:undo_stack) { described_class.new }
|
|
41
|
+
|
|
42
|
+
let(:expected_undo_dir) { File.join(chefdk_home, "undo") }
|
|
43
|
+
|
|
44
|
+
def undo_stack_files
|
|
45
|
+
Dir[File.join(expected_undo_dir, "*")]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
before do
|
|
49
|
+
clear_tempdir
|
|
50
|
+
allow(ChefDK::Helpers).to receive(:chefdk_home).and_return(chefdk_home)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
after(:all) do
|
|
54
|
+
clear_tempdir
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "uses chefdk_home to infer the location of the undo directory" do
|
|
58
|
+
expect(undo_stack.undo_dir).to eq(expected_undo_dir)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "when there are no undo records" do
|
|
62
|
+
|
|
63
|
+
it "has zero items" do
|
|
64
|
+
expect(undo_stack.size).to eq(0)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "is empty" do
|
|
68
|
+
expect(undo_stack).to be_empty
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "has no items to iterate over" do
|
|
72
|
+
expect { |b| undo_stack.each_with_id(&b) }.to_not yield_control
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "has an empty list of undo records" do
|
|
76
|
+
expect(undo_stack.undo_records).to eq([])
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "raises an error when attempting to pop an item from the stack" do
|
|
80
|
+
expect { undo_stack.pop }.to raise_error(ChefDK::CantUndo)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
describe "pushing an undo record" do
|
|
84
|
+
|
|
85
|
+
before do
|
|
86
|
+
expect(File.exist?(chefdk_home)).to be(false)
|
|
87
|
+
expect(File.exist?(expected_undo_dir)).to be(false)
|
|
88
|
+
|
|
89
|
+
undo_stack.push(undo_record)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it "creates the undo directory" do
|
|
93
|
+
expect(File.exist?(chefdk_home)).to be(true)
|
|
94
|
+
expect(File.exist?(expected_undo_dir)).to be(true)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "creates the undo record" do
|
|
98
|
+
expect(undo_stack_files.size).to eq(1)
|
|
99
|
+
|
|
100
|
+
undo_record_json = IO.read(undo_stack_files.first)
|
|
101
|
+
undo_record_data = FFI_Yajl::Parser.parse(undo_record_json)
|
|
102
|
+
expect(undo_record_data).to eq(undo_record.for_serialization)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
context "when there is one undo record" do
|
|
110
|
+
|
|
111
|
+
# `Time.new` is stubbed later on, need to force it to be evaluated before
|
|
112
|
+
# then.
|
|
113
|
+
let!(:start_time) { Time.new }
|
|
114
|
+
|
|
115
|
+
let(:expected_id) { start_time.utc.strftime("%Y%m%d%H%M%S") }
|
|
116
|
+
|
|
117
|
+
let(:missing_id) { (start_time + 1).utc.strftime("%Y%m%d%H%M%S") }
|
|
118
|
+
|
|
119
|
+
before do
|
|
120
|
+
allow(Time).to receive(:new).and_return(start_time)
|
|
121
|
+
undo_stack.push(undo_record)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it "creates the item on disk" do
|
|
125
|
+
expect(File).to be_directory(undo_stack.undo_dir)
|
|
126
|
+
expect(undo_stack_files.size).to eq(1)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "has one item" do
|
|
130
|
+
expect(undo_stack.size).to eq(1)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "is not empty" do
|
|
134
|
+
expect(undo_stack).to_not be_empty
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it "checks whether a record exists by id" do
|
|
138
|
+
expect(undo_stack).to have_id(expected_id)
|
|
139
|
+
expect(undo_stack).to_not have_id(missing_id)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it "deletes a record by id" do
|
|
143
|
+
expect(undo_stack.delete(expected_id)).to eq(undo_record)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "deletes a record by id and yields it" do
|
|
147
|
+
expect { |b| undo_stack.delete(expected_id, &b) }.to yield_with_args(undo_record)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it "fails to delete a record that doesn't exist" do
|
|
151
|
+
expect { undo_stack.delete(missing_id) }.to raise_error(ChefDK::UndoRecordNotFound)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it "pops the last record" do
|
|
155
|
+
expect(undo_stack.pop).to eq(undo_record)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it "pops the last record and yields it" do
|
|
159
|
+
expect { |b| undo_stack.pop(&b) }.to yield_with_args(undo_record)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it "iterates over the records" do
|
|
163
|
+
expect { |b| undo_stack.each_with_id(&b) }.to yield_successive_args([expected_id, undo_record])
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
it "has the undo record that was pushed" do
|
|
167
|
+
expect(undo_stack.undo_records.size).to eq(1)
|
|
168
|
+
expect(undo_stack.undo_records).to eq( [ undo_record ] )
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "and the record is removed" do
|
|
172
|
+
|
|
173
|
+
let!(:popped_record) { undo_stack.pop }
|
|
174
|
+
|
|
175
|
+
it "has no items" do
|
|
176
|
+
expect(undo_stack_files.size).to eq(0)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
context "when the stack is at the maximum configured size" do
|
|
185
|
+
# `Time.new` is stubbed later on, need to force it to be evaluated before
|
|
186
|
+
# then.
|
|
187
|
+
let!(:start_time) { Time.new }
|
|
188
|
+
|
|
189
|
+
def next_time
|
|
190
|
+
@increment ||= 0
|
|
191
|
+
@increment += 1
|
|
192
|
+
|
|
193
|
+
start_time + @increment
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def incremented_undo_record(i)
|
|
197
|
+
record = {
|
|
198
|
+
"name" => "appserver",
|
|
199
|
+
"revision_id" => i.to_s * 64
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
ChefDK::Policyfile::UndoRecord.new.tap do |undo_record|
|
|
203
|
+
undo_record.description = "delete-policy-group preprod-#{i}"
|
|
204
|
+
undo_record.add_policy_group("preprod-#{i}")
|
|
205
|
+
undo_record.add_policy_revision("appserver", "preprod-#{i}", record)
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
before do
|
|
210
|
+
## # UndoStack assumes you're not creating more than 1 undo record/second,
|
|
211
|
+
## # which is reasonable in the real world but won't work here.
|
|
212
|
+
allow(Time).to receive(:new) { next_time }
|
|
213
|
+
|
|
214
|
+
10.times { |i| undo_stack.push(incremented_undo_record(i)) }
|
|
215
|
+
|
|
216
|
+
expect(undo_stack_files.size).to eq(10)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
describe "pushing a new undo record" do
|
|
220
|
+
it "does not exceed the maximum size" do
|
|
221
|
+
undo_stack.push(incremented_undo_record(11))
|
|
222
|
+
|
|
223
|
+
expect(undo_stack_files.size).to eq(10)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "removes the oldest record" do
|
|
227
|
+
oldest_record_file = undo_stack_files.sort.first
|
|
228
|
+
|
|
229
|
+
undo_stack.push(incremented_undo_record(11))
|
|
230
|
+
|
|
231
|
+
expect(File.exist?(oldest_record_file)).to be(false)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
context "when the stack is above maximum configured size" do
|
|
236
|
+
|
|
237
|
+
let(:older_record_path) do
|
|
238
|
+
record_id = (Time.new - (3600 * 24)).utc.strftime("%Y%m%d%H%M%S")
|
|
239
|
+
File.join(expected_undo_dir, record_id)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
before do
|
|
243
|
+
FileUtils.touch(older_record_path)
|
|
244
|
+
expect(undo_stack_files.size).to eq(11)
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
describe "pushing a new undo record" do
|
|
248
|
+
it "does not exceed the maximum size" do
|
|
249
|
+
undo_stack.push(incremented_undo_record(11))
|
|
250
|
+
|
|
251
|
+
expect(undo_stack_files.size).to eq(10)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
it "removes the oldest record" do
|
|
255
|
+
oldest_record_file = undo_stack_files.sort.first
|
|
256
|
+
|
|
257
|
+
undo_stack.push(incremented_undo_record(11))
|
|
258
|
+
|
|
259
|
+
expect(File.exist?(oldest_record_file)).to be(false)
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
end
|