diff options
author | danielsdeleo <dan@getchef.com> | 2014-08-07 18:20:20 -0700 |
---|---|---|
committer | danielsdeleo <dan@getchef.com> | 2014-08-10 09:40:36 -0700 |
commit | 674cc65dc68b9d5f0eaa36f2409c6c12becf2c11 (patch) | |
tree | 7c33437663b794c5cdbbd78eff5a77f0b83ead1f /spec/integration/knife/diff_spec.rb | |
parent | e2a6b85f5b095f2350fa24f8e825fa22660fcbc7 (diff) | |
download | chef-674cc65dc68b9d5f0eaa36f2409c6c12becf2c11.tar.gz |
Convert Chef Zero helpers to instance methods
* Prefer instance methods to class methods for Chef Zero helpers.
RSpec's design and feature set heavily favors using instance methods
for test setup. This change will allow us to use let bindings and more
naturally move common setup to shared contexts.
* Temporarily copy ChefZero's RSpec features in-repo. master of Chef
Zero is currently broken for unit testing. Copy the changes here for
now so we can make progress.
* Automatically generate a metadata file when using the "cookbook"
helper function. This will be needed for a subsequent change that
makes `name' required in metadata.
Diffstat (limited to 'spec/integration/knife/diff_spec.rb')
-rw-r--r-- | spec/integration/knife/diff_spec.rb | 278 |
1 files changed, 170 insertions, 108 deletions
diff --git a/spec/integration/knife/diff_spec.rb b/spec/integration/knife/diff_spec.rb index 2e36f39c82..8d13d86a99 100644 --- a/spec/integration/knife/diff_spec.rb +++ b/spec/integration/knife/diff_spec.rb @@ -19,27 +19,31 @@ require 'support/shared/integration/integration_helper' require 'chef/knife/diff' describe 'knife diff' do - extend IntegrationSupport + include IntegrationSupport include KnifeSupport context 'without versioned cookbooks' do when_the_chef_server "has one of each thing" do - client 'x', '{}' - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' } - data_bag 'x', { 'y' => '{}' } - environment 'x', '{}' - node 'x', '{}' - role 'x', '{}' - user 'x', '{}' + before do + client 'x', '{}' + cookbook 'x', '1.0.0' + data_bag 'x', { 'y' => '{}' } + environment 'x', '{}' + node 'x', '{}' + role 'x', '{}' + user 'x', '{}' + end when_the_repository 'has only top-level directories' do - directory 'clients' - directory 'cookbooks' - directory 'data_bags' - directory 'environments' - directory 'nodes' - directory 'roles' - directory 'users' + before do + directory 'clients' + directory 'cookbooks' + directory 'data_bags' + directory 'environments' + directory 'nodes' + directory 'roles' + directory 'users' + end it 'knife diff reports everything as deleted' do knife('diff --name-status /').should_succeed <<EOM @@ -60,17 +64,19 @@ EOM when_the_repository 'has an identical copy of each thing' do - file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } - file 'cookbooks/x/metadata.rb', 'version "1.0.0"' - file 'data_bags/x/y.json', {} - file 'environments/_default.json', { "description" => "The default Chef environment" } - file 'environments/x.json', {} - file 'nodes/x.json', {} - file 'roles/x.json', {} - file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + before do + file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + file 'cookbooks/x/metadata.rb', cb_metadata("x", "1.0.0") + file 'data_bags/x/y.json', {} + file 'environments/_default.json', { "description" => "The default Chef environment" } + file 'environments/x.json', {} + file 'nodes/x.json', {} + file 'roles/x.json', {} + file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + end it 'knife diff reports no differences' do knife('diff /').should_succeed '' @@ -85,11 +91,14 @@ EOM end context 'except the role file' do - file 'roles/x.json', <<EOM + before do + file 'roles/x.json', <<EOM { "foo": "bar" } EOM + end + it 'knife diff reports the role as different' do knife('diff --name-status /').should_succeed <<EOM M\t/roles/x.json @@ -98,15 +107,17 @@ EOM end context 'as well as one extra copy of each thing' do - file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY } - file 'cookbooks/x/blah.rb', '' - file 'cookbooks/y/metadata.rb', 'version "1.0.0"' - file 'data_bags/x/z.json', {} - file 'data_bags/y/zz.json', {} - file 'environments/y.json', {} - file 'nodes/y.json', {} - file 'roles/y.json', {} - file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY } + before do + file 'clients/y.json', { 'public_key' => ChefZero::PUBLIC_KEY } + file 'cookbooks/x/blah.rb', '' + file 'cookbooks/y/metadata.rb', cb_metadata("y", "1.0.0") + file 'data_bags/x/z.json', {} + file 'data_bags/y/zz.json', {} + file 'environments/y.json', {} + file 'nodes/y.json', {} + file 'roles/y.json', {} + file 'users/y.json', { 'public_key' => ChefZero::PUBLIC_KEY } + end it 'knife diff reports the new files as added' do knife('diff --name-status /').should_succeed <<EOM @@ -123,7 +134,7 @@ EOM end context 'when cwd is the data_bags directory' do - cwd 'data_bags' + before { cwd 'data_bags' } it 'knife diff reports different data bags' do knife('diff --name-status').should_succeed <<EOM A\tx/z.json @@ -156,12 +167,16 @@ EOM end when_the_repository 'has a cookbook' do - file 'cookbooks/x/metadata.rb', 'version "1.0.0"' - file 'cookbooks/x/onlyin1.0.0.rb', '' + before do + file 'cookbooks/x/metadata.rb', cb_metadata("x", "1.0.0") + file 'cookbooks/x/onlyin1.0.0.rb', '' + end when_the_chef_server 'has a later version for the cookbook' do - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''} - cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => '' } + before do + cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => ''} + cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => '' } + end it 'knife diff /cookbooks/x shows differences' do knife('diff --name-status /cookbooks/x').should_succeed <<EOM @@ -180,15 +195,19 @@ EOM end when_the_chef_server 'has an earlier version for the cookbook' do - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' } - cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => '' } + before do + cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => '' } + cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => '' } + end it 'knife diff /cookbooks/x shows no differences' do knife('diff --name-status /cookbooks/x').should_succeed '' end end when_the_chef_server 'has a later version for the cookbook, and no current version' do - cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => '' } + before do + cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => '' } + end it 'knife diff /cookbooks/x shows the differences' do knife('diff --name-status /cookbooks/x').should_succeed <<EOM @@ -200,7 +219,9 @@ EOM end when_the_chef_server 'has an earlier version for the cookbook, and no current version' do - cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => '' } + before do + cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => '' } + end it 'knife diff /cookbooks/x shows the differences' do knife('diff --name-status /cookbooks/x').should_succeed <<EOM @@ -214,15 +235,18 @@ EOM context 'json diff tests' do when_the_repository 'has an empty environment file' do - file 'environments/x.json', {} + before do + file 'environments/x.json', {} + end + when_the_chef_server 'has an empty environment' do - environment 'x', {} + before { environment 'x', {} } it 'knife diff returns no differences' do knife('diff /environments/x.json').should_succeed '' end end when_the_chef_server 'has an environment with a different value' do - environment 'x', { 'description' => 'hi' } + before { environment 'x', { 'description' => 'hi' } } it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -236,15 +260,23 @@ EOM end when_the_repository 'has an environment file with a value in it' do - file 'environments/x.json', { 'description' => 'hi' } + before do + file 'environments/x.json', { 'description' => 'hi' } + end + when_the_chef_server 'has an environment with the same value' do - environment 'x', { 'description' => 'hi' } + before do + environment 'x', { 'description' => 'hi' } + end it 'knife diff returns no differences' do knife('diff /environments/x.json').should_succeed '' end end when_the_chef_server 'has an environment with no value' do - environment 'x', {} + before do + environment 'x', {} + end + it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -256,7 +288,9 @@ EOM end end when_the_chef_server 'has an environment with a different value' do - environment 'x', { 'description' => 'lo' } + before do + environment 'x', { 'description' => 'lo' } + end it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -271,9 +305,9 @@ EOM end when_the_chef_server 'has an environment' do - environment 'x', {} + before { environment 'x', {} } when_the_repository 'has an environment with bad JSON' do - file 'environments/x.json', '{' + before { file 'environments/x.json', '{' } it 'knife diff reports an error and does a textual diff' do knife('diff /environments/x.json').should_succeed(/- "name": "x"/, :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n") end @@ -283,22 +317,26 @@ EOM with_versioned_cookbooks do when_the_chef_server "has one of each thing" do - client 'x', '{}' - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"' } - data_bag 'x', { 'y' => '{}' } - environment 'x', '{}' - node 'x', '{}' - role 'x', '{}' - user 'x', '{}' + before do + client 'x', '{}' + cookbook 'x', '1.0.0' + data_bag 'x', { 'y' => '{}' } + environment 'x', '{}' + node 'x', '{}' + role 'x', '{}' + user 'x', '{}' + end when_the_repository 'has only top-level directories' do - directory 'clients' - directory 'cookbooks' - directory 'data_bags' - directory 'environments' - directory 'nodes' - directory 'roles' - directory 'users' + before do + directory 'clients' + directory 'cookbooks' + directory 'data_bags' + directory 'environments' + directory 'nodes' + directory 'roles' + directory 'users' + end it 'knife diff reports everything as deleted' do knife('diff --name-status /').should_succeed <<EOM @@ -318,17 +356,19 @@ EOM end when_the_repository 'has an identical copy of each thing' do - file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } - file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"' - file 'data_bags/x/y.json', {} - file 'environments/_default.json', { "description" => "The default Chef environment" } - file 'environments/x.json', {} - file 'nodes/x.json', {} - file 'roles/x.json', {} - file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } - file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + before do + file 'clients/chef-validator.json', { 'validator' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'clients/chef-webui.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'clients/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata("x", "1.0.0") + file 'data_bags/x/y.json', {} + file 'environments/_default.json', { "description" => "The default Chef environment" } + file 'environments/x.json', {} + file 'nodes/x.json', {} + file 'roles/x.json', {} + file 'users/admin.json', { 'admin' => true, 'public_key' => ChefZero::PUBLIC_KEY } + file 'users/x.json', { 'public_key' => ChefZero::PUBLIC_KEY } + end it 'knife diff reports no differences' do knife('diff /').should_succeed '' @@ -343,11 +383,14 @@ EOM end context 'except the role file' do - file 'roles/x.json', <<EOM + before do + file 'roles/x.json', <<EOM { "foo": "bar" } EOM + end + it 'knife diff reports the role as different' do knife('diff --name-status /').should_succeed <<EOM M\t/roles/x.json @@ -356,16 +399,18 @@ EOM end context 'as well as one extra copy of each thing' do - file 'clients/y.json', {} - file 'cookbooks/x-1.0.0/blah.rb', '' - file 'cookbooks/x-2.0.0/metadata.rb', 'version "2.0.0"' - file 'cookbooks/y-1.0.0/metadata.rb', 'version "1.0.0"' - file 'data_bags/x/z.json', {} - file 'data_bags/y/zz.json', {} - file 'environments/y.json', {} - file 'nodes/y.json', {} - file 'roles/y.json', {} - file 'users/y.json', {} + before do + file 'clients/y.json', {} + file 'cookbooks/x-1.0.0/blah.rb', '' + file 'cookbooks/x-2.0.0/metadata.rb', cb_metadata("x", "2.0.0") + file 'cookbooks/y-1.0.0/metadata.rb', cb_metadata("y", "1.0.0") + file 'data_bags/x/z.json', {} + file 'data_bags/y/zz.json', {} + file 'environments/y.json', {} + file 'nodes/y.json', {} + file 'roles/y.json', {} + file 'users/y.json', {} + end it 'knife diff reports the new files as added' do knife('diff --name-status /').should_succeed <<EOM @@ -383,7 +428,7 @@ EOM end context 'when cwd is the data_bags directory' do - cwd 'data_bags' + before { cwd 'data_bags' } it 'knife diff reports different data bags' do knife('diff --name-status').should_succeed <<EOM A\tx/z.json @@ -416,12 +461,16 @@ EOM end when_the_repository 'has a cookbook' do - file 'cookbooks/x-1.0.0/metadata.rb', 'version "1.0.0"' - file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', '' + before do + file 'cookbooks/x-1.0.0/metadata.rb', cb_metadata("x", "1.0.0") + file 'cookbooks/x-1.0.0/onlyin1.0.0.rb', '' + end when_the_chef_server 'has a later version for the cookbook' do - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => ''} - cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => '' } + before do + cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => ''} + cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => '' } + end it 'knife diff /cookbooks shows differences' do knife('diff --name-status /cookbooks').should_succeed <<EOM @@ -435,15 +484,19 @@ EOM end when_the_chef_server 'has an earlier version for the cookbook' do - cookbook 'x', '1.0.0', { 'metadata.rb' => 'version "1.0.0"', 'onlyin1.0.0.rb' => '' } - cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => '' } + before do + cookbook 'x', '1.0.0', { 'onlyin1.0.0.rb' => '' } + cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => '' } + end it 'knife diff /cookbooks shows the differences' do knife('diff --name-status /cookbooks').should_succeed "D\t/cookbooks/x-0.9.9\n" end end when_the_chef_server 'has a later version for the cookbook, and no current version' do - cookbook 'x', '1.0.1', { 'metadata.rb' => 'version "1.0.1"', 'onlyin1.0.1.rb' => '' } + before do + cookbook 'x', '1.0.1', { 'onlyin1.0.1.rb' => '' } + end it 'knife diff /cookbooks shows the differences' do knife('diff --name-status /cookbooks').should_succeed <<EOM @@ -454,7 +507,9 @@ EOM end when_the_chef_server 'has an earlier version for the cookbook, and no current version' do - cookbook 'x', '0.9.9', { 'metadata.rb' => 'version "0.9.9"', 'onlyin0.9.9.rb' => '' } + before do + cookbook 'x', '0.9.9', { 'onlyin0.9.9.rb' => '' } + end it 'knife diff /cookbooks shows the differences' do knife('diff --name-status /cookbooks').should_succeed <<EOM @@ -467,15 +522,15 @@ EOM context 'json diff tests' do when_the_repository 'has an empty environment file' do - file 'environments/x.json', {} + before { file 'environments/x.json', {} } when_the_chef_server 'has an empty environment' do - environment 'x', {} + before { environment 'x', {} } it 'knife diff returns no differences' do knife('diff /environments/x.json').should_succeed '' end end when_the_chef_server 'has an environment with a different value' do - environment 'x', { 'description' => 'hi' } + before { environment 'x', { 'description' => 'hi' } } it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -489,15 +544,20 @@ EOM end when_the_repository 'has an environment file with a value in it' do - file 'environments/x.json', { 'description' => 'hi' } + before do + file 'environments/x.json', { 'description' => 'hi' } + end + when_the_chef_server 'has an environment with the same value' do - environment 'x', { 'description' => 'hi' } + before do + environment 'x', { 'description' => 'hi' } + end it 'knife diff returns no differences' do knife('diff /environments/x.json').should_succeed '' end end when_the_chef_server 'has an environment with no value' do - environment 'x', {} + before { environment 'x', {} } it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -509,7 +569,9 @@ EOM end end when_the_chef_server 'has an environment with a different value' do - environment 'x', { 'description' => 'lo' } + before do + environment 'x', { 'description' => 'lo' } + end it 'knife diff reports the difference', :pending => (RUBY_VERSION < "1.9") do knife('diff /environments/x.json').should_succeed(/ { @@ -524,9 +586,9 @@ EOM end when_the_chef_server 'has an environment' do - environment 'x', {} + before { environment 'x', {} } when_the_repository 'has an environment with bad JSON' do - file 'environments/x.json', '{' + before { file 'environments/x.json', '{' } it 'knife diff reports an error and does a textual diff' do knife('diff /environments/x.json').should_succeed(/- "name": "x"/, :stderr => "WARN: Parse error reading #{path_to('environments/x.json')} as JSON: A JSON text must at least contain two octets!\n") end |