diff options
Diffstat (limited to 'lib/chef_zero/rspec.rb')
-rw-r--r-- | lib/chef_zero/rspec.rb | 195 |
1 files changed, 158 insertions, 37 deletions
diff --git a/lib/chef_zero/rspec.rb b/lib/chef_zero/rspec.rb index e67fdc2..6a78a78 100644 --- a/lib/chef_zero/rspec.rb +++ b/lib/chef_zero/rspec.rb @@ -24,6 +24,11 @@ module ChefZero end def when_the_chef_server(description, *tags, &block) + if tags.last.is_a?(Hash) + opts = tags.last + else + opts = {} + end context "When the Chef server #{description}", *tags do before :each do @@ -33,6 +38,7 @@ module ChefZero else default_opts end + server_opts = server_opts.merge(opts) if ChefZero::RSpec.server && server_opts != ChefZero::RSpec.server.options ChefZero::RSpec.server.stop @@ -77,79 +83,194 @@ module ChefZero end end - def self.organization(name, org = '{}') - before(:each) do - ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create) - @current_org = name + def self.organization(name, org = '{}', &block) + before(:each) { organization(name, org, &block) } + end + + def organization(name, org = '{}', &block) + ChefZero::RSpec.server.data_store.set([ 'organizations', name, 'org' ], dejsonize(org), :create_dir, :create) + prev_org_name = @current_org + @current_org = name + prev_object_path = @current_object_path + @current_object_path = "organizations/#{name}" + if block_given? + begin + instance_eval(&block) + ensure + @current_org = prev_org_name + @current_object_path = prev_object_path + end end end - def self.acl(path, acl) - before(:each) do - path = [ 'organizations', @current_org || 'chef' ] + path.split('/') - ChefZero::RSpec.server.data_store.set(ChefData::AclPath.get_acl_data_path(path), acl) + def self.acl_for(path, data) + before(:each) { acl_for(path, data) } + end + + def acl_for(path, data) + ChefZero::RSpec.server.load_data({ 'acls' => { path => data } }, current_org) + end + + def acl(data) + acl_for(@current_object_path, data) + end + + def self.client(name, data, &block) + before(:each) { client(name, data, &block) } + end + + def client(name, data, &block) + with_object_path("clients/#{name}") do + ChefZero::RSpec.server.load_data({ 'clients' => { name => data } }, current_org) + instance_eval(&block) if block_given? end end - def self.group(name, group) - before(:each) do - path = [ 'organizations', @current_org || 'chef' ] + path.split('/') - ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'groups', name ], dejsonize(group), :create) + def self.container(name, data, &block) + before(:each) { container(name, data, &block) } + end + + def container(name, data, &block) + with_object_path("containers/#{name}") do + ChefZero::RSpec.server.load_data({ 'containers' => { name => data } }, current_org) + instance_eval(&block) if block_given? end end - def self.org_invite(username) - before(:each) do - ChefZero::RSpec.server.data_store.set([ 'organizations', @current_org || 'chef', 'users', username ], '{}', :create) + def self.cookbook(name, version, data, options = {}, &block) + before(:each) { cookbook(name, version, data, &block) } + end + + def cookbook(name, version, data, options = {}, &block) + with_object_path("cookbooks/#{name}") do + ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => data.merge(options) }}, current_org) + instance_eval(&block) if block_given? end end - def self.org_members(name, *members) - before(:each) do - members.each do |member| - ChefZero::RSpec.server.set([ 'organizations', @current_org || 'chef', 'users', member], '{}') - end + def self.data_bag(name, data, &block) + before(:each) { data_bag(name, data, &block) } + end + + def data_bag(name, data, &block) + with_object_path("data/#{name}") do + ChefZero::RSpec.server.load_data({ 'data' => { name => data }}, current_org) + instance_eval(&block) if block_given? end end - def self.client(name, client) - before(:each) { ChefZero::RSpec.server.load_data({ 'clients' => { name => client }}, @current_org) } + def self.environment(name, data, &block) + before(:each) { environment(name, data, &block) } end - def self.cookbook(name, version, cookbook, options = {}) - before(:each) { ChefZero::RSpec.server.load_data({ 'cookbooks' => { "#{name}-#{version}" => cookbook.merge(options) }}, @current_org) } + def environment(name, data, &block) + with_object_path("environments/#{name}") do + ChefZero::RSpec.server.load_data({ 'environments' => { name => data } }, current_org) + instance_eval(&block) if block_given? + end + end + + def self.group(name, data, &block) + before(:each) { group(name, data, &block) } end - def self.data_bag(name, data_bag) - before(:each) { ChefZero::RSpec.server.load_data({ 'data' => { name => data_bag }}, @current_org) } + def group(name, data, &block) + with_object_path("groups/#{name}") do + ChefZero::RSpec.server.load_data({ 'groups' => { name => data } }, current_org) + instance_eval(&block) if block_given? + end end - def self.environment(name, environment) - before(:each) { ChefZero::RSpec.server.load_data({ 'environments' => { name => environment }}, @current_org) } + def self.node(name, data, &block) + before(:each) { node(name, data, &block) } end - def self.node(name, node) - before(:each) { ChefZero::RSpec.server.load_data({ 'nodes' => { name => node }}, @current_org) } + def node(name, data, &block) + with_object_path("nodes/#{name}") do + ChefZero::RSpec.server.load_data({ 'nodes' => { name => data } }, current_org) + instance_eval(&block) if block_given? + end end - def self.role(name, role) - before(:each) { ChefZero::RSpec.server.load_data({ 'roles' => { name => role }}, @current_org) } + def self.org_invite(*usernames) + before(:each) { org_invite(*usernames) } end - def self.user(name, user) + def org_invite(*usernames) + ChefZero::RSpec.server.load_data({ 'invites' => usernames }, current_org) + end + + def self.org_member(*usernames) + before(:each) { org_member(*usernames) } + end + + def org_member(*usernames) + ChefZero::RSpec.server.load_data({ 'members' => usernames }, current_org) + end + + def self.role(name, data, &block) + before(:each) { role(name, data, &block) } + end + + def role(name, data, &block) + with_object_path("roles/#{name}") do + ChefZero::RSpec.server.load_data({ 'roles' => { name => data } }, current_org) + instance_eval(&block) if block_given? + end + end + + def self.sandbox(name, data, &block) + before(:each) { sandbox(name, data, &block) } + end + + def sandbox(name, data, &block) + with_object_path("sandboxes/#{name}") do + ChefZero::RSpec.server.load_data({ 'sandboxes' => { name => data } }, current_org) + instance_eval(&block) if block_given? + end + end + + def self.user(name, data, &block) + before(:each) { user(name, data, &block) } + end + + def user(name, data, &block) if ChefZero::RSpec.server.options[:osc_compat] - before(:each) { ChefZero::RSpec.server.load_data({ 'users' => { name => user }}, @current_org) } + with_object_path("users/#{name}") do + ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org) + instance_eval(&block) if block_given? + end else - before(:each) { ChefZero::RSpec.server.set([ 'users', name ], dejsonize(user)) } + old_object_path = @current_object_path + @current_object_path = "users/#{name}" + begin + ChefZero::RSpec.server.load_data({ 'users' => { name => data }}, current_org) + instance_eval(&block) if block_given? + ensure + @current_object_path = old_object_path + end end end - def self.dejsonize(data) + def dejsonize(data) if data.is_a?(String) data else - JSON.pretty_generate(value) + JSON.pretty_generate(data) + end + end + + def current_org + @current_org || 'chef' + end + + def with_object_path(object_path) + old_object_path = @current_object_path + @current_object_path = object_path + begin + yield if block_given? end + @current_object_path = old_object_path end # after :each do |